Corredor

ウェブ、プログラミングの勉強メモ。

iOS アプリにバッジを付与する Swift コード

iOS アプリにバッジを付与する。よくあるネタなのだが、iOS や Swift の進化により、ググっても情報の鮮度が様々で分かりづらかったので、本稿執筆時点でのやり方を紹介する。

検証環境

  • macOS Mojave
  • Xcode v10.1
  • Swift v4.2.1
  • iOS v12.0.1

いきなりコード

こんな感じで実装する。

import UIKit
import UserNotifications    # コレをインポートする

class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    
    // アプリ初期表示時にバッジ付与の許可を求める (初回はココでユーザに許可を得るダイアログが表示される)
    UNUserNotificationCenter.current().requestAuthorization(options: .badge) { (granted, eror) in
      if granted {
        print("許可 OK")
      }
      else {
        print("許可 NG")
      }
    }
  }

  // 画面に置いたボタンをタップした時にバッジの数を変更する
  @IBAction func onIncrementBtn(_ sender: Any) {
    // 警告回避のためメインスレッドで実行させる
    DispatchQueue.main.async {
      // バッジの数をインクリメントする
      UIApplication.shared.applicationIconBadgeNumber++
    }
  }
  
  // 画面に置いたリセットボタンをタップした時にバッジの数を 0 (非表示) に変更する
  @IBAction func onIncrementBtn(_ sender: Any) {
    DispatchQueue.main.async {
      // 0 を代入するとバッジが消える
      UIApplication.shared.applicationIconBadgeNumber = 0
    }
  }
}

このとおり。

バッジの数を変更する時、DispatchQueue.main.async {} というブロックで囲んであげないと、実行時に Xcode 側に以下のような紫色の警告が表示される。

UIApplication.shared.applicationIconBadgeNumber must be used from main thread only

無視しても動くが、メインスレッドで実行するようにすれば回避できたので入れておいた。

バッジ表示の許可が得られていない状態で UIApplication.shared.applicationIconBadgeNumber を変更するのは特に問題ない。変更が反映されないだけ。精神的な安全のために UNUserNotificationCenter.current().requestAuthorization() { } 内で必ずバッジ数変更するようにしてもいいかも。

参考文献

詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応

詳細! Swift iPhoneアプリ開発入門ノート iOS12 + Xcode 10対応