【Swift UI】アプリアイコンにバッジを付与する方法!applicationIconBadgeNumber
この記事からわかること
- Swiftでアプリアイコンにバッジを付与する方法とは?
- Swift UI使用時の場合
- UIApplicationクラスのapplicationIconBadgeNumberプロパティ
- registerUserNotificationSettingsは非推奨
- UNUserNotificationCenterクラスのrequestAuthorizationメソッド
- completionHandlerとは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.0
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
SwiftのUIApplication
クラスを使ってアプリアイコンにバッジを付与する方法をまとめていきます。
アプリアイコンにバッジを付与する方法
Swiftで作成したiOSアプリのホーム画面に設置されるアイコンに以下のようにバッジを付与するには通知の許可とバッジの値の設定が必要です。
通知の許可申請
バッジを付与できるようにするためには使用するユーザーに対して通知を許可してもらう必要があります。そのためにまずはUNUserNotificationCenter
クラスを用いて許可申請します。
UNUserNotificationCenter.current().requestAuthorization(options: .badge) { (granted, err) in
// ユーザーに使用許可を申請
}
バッジの値を設定する
バッジの値はUIApplication
クラスのapplicationIconBadgeNumber
プロパティに表示したい値を渡します。
let application = UIApplication.shared
application.applicationIconBadgeNumber = 5
iOS10.0以前はUIApplication
クラスのregisterUserNotificationSettings
プロパティから許可申請することができましたが現在は非推奨となってしまっているので使わない方が安心です。
非推奨のバッジ付与コード
let application = UIApplication.shared
application.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge], categories: nil))
application.applicationIconBadgeNumber = 5
'registerUserNotificationSettings' was deprecated in iOS 10.0: Use UserNotifications Framework's -[UNUserNotificationCenter requestAuthorizationWithOptions:completionHandler:] and -[UNUserNotificationCenter setNotificationCategories:]
通知が届いたタイミングでバッジを増やしていく
一番用途の多いであろう通知が届いたタイミングでバッジを増やしていく方法について調べてみました。結論から言うとアプリが起動していない状態でリモート通知を受信した際にバッジを増やすにはプッシュ通知送信側で実装する必要があるようです。
アプリがフォアグラウンド状態の際に届いた通知であれば以下のような実装で実現できましたが、あんまり使い道がないですね。
extension AppDelegate : UNUserNotificationCenterDelegate {
// フォアグラウンドでも通知が届くようにする
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// フォアグラウンドに通知が届くたびにバッジを追加する
incrementBadgeCount()
completionHandler([[.banner, .list, .sound]])
}
/// バッジ数を更新する
private func incrementBadgeCount() {
// 現在のバッジ数を取得
let currentBadgeCount = UIApplication.shared.applicationIconBadgeNumber
// バッジ数を1増やす
UIApplication.shared.applicationIconBadgeNumber = currentBadgeCount + 1
}
}
UNUserNotificationCenterクラスの概要と使い方
class UNUserNotificationCenter : NSObject
UNUserNotificationCenter
クラスはアプリからユーザーに対しての通知関連を管理しているクラスです。このクラスを使用することでバッジをはじめ、アラートやサウンドなどを使用するためにユーザーに対して許可申請をすることができます。
currentメソッドでインスタンスにアクセス
UNUserNotificationCenter
クラスを使用する際はそのままインスタンス化するのではなくcurrent
メソッドを呼び出してインスタンスにアクセスします。current
メソッドは戻り値としてUNUserNotificationCenter
インスタンスを返します
class func current() -> UNUserNotificationCenter
requestAuthorizationメソッドで通知許可を申請
UNUserNotificationCenter
クラスのrequestAuthorization
メソッドはユーザーに対してアプリのローカル通知とリモート通知の承認を要求します。
func requestAuthorization(
options: UNAuthorizationOptions = [],
completionHandler: @escaping (Bool, Error?) -> Void
)
引数options
にはUNAuthorizationOptions
構造体を渡します。
UNAuthorizationOptions構造体のプロティ
struct UNAuthorizationOptions {
static var alert: UNAuthorizationOptions { get } // アラート
static var sound: UNAuthorizationOptions { get } // サウンド
static var badge: UNAuthorizationOptions { get } // バッジ
static var carPlay: UNAuthorizationOptions { get } // carPlay
static var provisional: UNAuthorizationOptions { get } // 通知機能のお試し用(通知許可ポップアップは非表示)
}
completionHandlerとは?
SwiftにはcompletionHandler
と呼ばれる仕組みがあります。いわゆる「イベントドリブン」な仕組みでイベントが発生してから処理が実行されます。
completionHandler
はクロージャが渡されています。Swiftではクロージャがメソッドの引数として渡されることがあります。ここでcompletionHandler
として定義されているクロージャ((Bool, Error?) -> Void
)は真偽値とエラーの2つを引数に受け取り、戻り値は空(Void)です。
completionHandler
は引数の値を与えられない(=イベントが発生しない)と実行されません。今回にイベント発生のタイミングはユーザーが通知に対して許可か拒否のアクションを起こした時です。
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
print("許可されました!")
}else{
print("拒否されました...")
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書