【Swift UI】アプリアイコンにバッジを付与する方法!applicationIconBadgeNumber

この記事からわかること
- Swiftでアプリアイコンにバッジを付与する方法とは?
- Swift UI使用時の場合
- UIApplicationクラスのapplicationIconBadgeNumberプロパティ
- registerUserNotificationSettingsは非推奨
- UNUserNotificationCenterクラスのrequestAuthorizationメソッド
- completionHandlerとは?
index
[open]
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.0
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
SwiftのUIApplication
クラスを使ってアプリアイコンにバッジを付与する方法をまとめていきます。
アプリアイコンにバッジを付与する方法
Swiftで作成したiOSアプリのホーム画面に設置されるアイコンに以下のようにバッジを付与するには通知の許可とバッジの値の設定が必要です。

通知の許可申請

バッジを付与できるようにするためには使用するユーザーに対して通知を許可してもらう必要があります。そのためにまずはUNUserNotificationCenter
クラスを用いて許可申請します。
バッジの値を設定する
バッジの値はUIApplication
クラスのapplicationIconBadgeNumber
プロパティに表示したい値を渡します。
iOS10.0以前はUIApplication
クラスのregisterUserNotificationSettings
プロパティから許可申請することができましたが現在は非推奨となってしまっているので使わない方が安心です。
非推奨のバッジ付与コード
'registerUserNotificationSettings' was deprecated in iOS 10.0: Use UserNotifications Framework's -[UNUserNotificationCenter requestAuthorizationWithOptions:completionHandler:] and -[UNUserNotificationCenter setNotificationCategories:]
通知が届いたタイミングでバッジを増やしていく
一番用途の多いであろう通知が届いたタイミングでバッジを増やしていく方法について調べてみました。結論から言うとアプリが起動していない状態でリモート通知を受信した際にバッジを増やすにはプッシュ通知送信側で実装する必要があるようです。
アプリがフォアグラウンド状態の際に届いた通知であれば以下のような実装で実現できましたが、あんまり使い道がないですね。
UNUserNotificationCenterクラスの概要と使い方
UNUserNotificationCenter
クラスはアプリからユーザーに対しての通知関連を管理しているクラスです。このクラスを使用することでバッジをはじめ、アラートやサウンドなどを使用するためにユーザーに対して許可申請をすることができます。
currentメソッドでインスタンスにアクセス
UNUserNotificationCenter
クラスを使用する際はそのままインスタンス化するのではなくcurrent
メソッドを呼び出してインスタンスにアクセスします。current
メソッドは戻り値としてUNUserNotificationCenter
インスタンスを返します
requestAuthorizationメソッドで通知許可を申請
UNUserNotificationCenter
クラスのrequestAuthorization
メソッドはユーザーに対してアプリのローカル通知とリモート通知の承認を要求します。
引数options
にはUNAuthorizationOptions
構造体を渡します。
UNAuthorizationOptions構造体のプロティ
completionHandlerとは?
SwiftにはcompletionHandler
と呼ばれる仕組みがあります。いわゆる「イベントドリブン」な仕組みでイベントが発生してから処理が実行されます。
completionHandler
はクロージャが渡されています。Swiftではクロージャがメソッドの引数として渡されることがあります。ここでcompletionHandler
として定義されているクロージャ((Bool, Error?) -> Void
)は真偽値とエラーの2つを引数に受け取り、戻り値は空(Void)です。
completionHandler
は引数の値を与えられない(=イベントが発生しない)と実行されません。今回にイベント発生のタイミングはユーザーが通知に対して許可か拒否のアクションを起こした時です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書