はじめに
普段の業務ではプッシュ通知の制御にまだUIApplicationDelegateのメソッドを使用しているのですが、近々UserNotificationsフレームワークに切り替える必要がありそうなので基本的な使い方についてまとめてみたいと思います。
UserNotificationsフレームワーク
iOS10以降に対応しているプッシュ通知のフレームワークです。
APNsを介したサーバーからの通知とローカル通知を実装する事が出来ます。
また、iOS9まではアプリがフォアグラウンド時に通知を受け取った場合は通知バナーを表示しませんでしたが、このフレームワークを使用するとフォアグラウンド時でも通知バナーを表示する事が出来ます。
基本実装
デリゲートの設定
UserNotifications
をimportし、
UNUserNotificationCenterDelegate
に準拠します。
下記例では、AppDelegateクラスの
application(_:didFinishLaunchingWithOptions:)
の中でデリゲートを設定しています。
1 2 3 4 5 6 7 8 | import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // デリゲートにオブジェクトを渡す UNUserNotificationCenter.current().delegate = self |
ユーザー許可
今まで同様にまずユーザーにプッシュ通知の許可を求めるダイアログ表示を行います。
この際に、通知音やバッジの有無などのオプション設定を行う事が出来ます。
ユーザーが許可したらデバイストークンの発行処理を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 通知バナーON、通知音ON、バッジ表示ONの設定 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in // ユーザーが許可したら if granted { // メインスレッドでデバイストークンの発行依頼処理 DispatchQueue.main.async { application.registerForRemoteNotifications() } } if error != nil { print(error) } } |
デバイストークン取得後
デバイストークンが発行されたら、トークンをプッシュ通知用サーバーに送る等の処理を行うと思います。
ここは今まで通りUIApplicationDelegateのメソッドで行います。
ちなみに、iOS13以降でトークン仕様が変更となっているので、詳細はこちらの記事を参照してみてください。
1 2 3 4 5 6 | // デバイストークンの発行に成功 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // iOS13からトークン文字列の取得方法が変更されています let token = deviceToken.map { String(format: "%.2hhx", $0) }.joined() print("Device token: \(token)") } |
バックグラウンドで通知受信
バックグラウンドで通知を受信した時や通知バナーをタップした時は以下のメソッドが呼ばれます。
response
から通知内容を取得する事が出来ます。
公式リファレンスによると、最後に
completionHandler()
を明示的に呼んであげる必要があるようです。
1 2 3 4 5 6 7 8 9 | // バックグラウンドで通知を受け取った時 // 通知バナーをタップした時 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 通知内容(タイトルや本文など)を取得 print(response.notification.request.content.title) print(response.notification.request.content.body) completionHandler() } |
フォアグラウンドで通知受信
フォアグラウンド時で通知を受信した時は以下のメソッドが呼ばれます。
completionHandler()
の引数で通知バナーの表示/非表示や通知音のON/OFFの設定を行う事が出来ます。
このメソッドを実装しないと、iOS9までと同様に通知バナー等は表示されません。
1 2 3 4 5 6 7 8 9 10 | // フォアグラウンドで通知を受け取った時 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification,withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // 通知内容(タイトルや本文など)を取得 print(notification.request.content.body) print(notification.request.content.title) // ここで通知バナーや通知音の使い分けを設定する // 何も設定しないと通知バナーや通知音は無し completionHandler([.alert, .badge, .sound]) } |
さいごに
iOS10以降のプッシュ通知では他にサイレントプッシュやNotification Service Extensionを利用したリッチプッシュなどの機能もあるので、機会があればこちらも記事にしたいと思います。