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>iOS 10 User Notifications Framework実装まとめ - Qiita …
import UserNotifications
が必要な件 - iOS 10以降のNotificationの基本 - Qiita … 通知許可を要求する方法
- iOS 10でついに通知許可ダイアログの操作をハンドリングできるようになったよ - Qiita
- How to add a number over your app icon using applicationIconBadgeNumber - free Swift 4.2 example code and tips
- 002 アプリのアイコンにバッジを表示する · GitBook
- Swiftでアプリケーションバッジを表示する - みかづきブログ その3
- appdelegate - Swift 4 ,must be used from main thread only warning - Stack Overflow …
UIApplication.shared.applicationIconBadgeNumber must be used from main thread only
警告を回避する