[iOS 10] User Notifications framework を使用してリモート通知を受け取る処理を実装する #wwdc
はじめに
こんばんは。モバイルアプリサービス部の平屋です。前回の記事に引き続き、iOS 10 で追加された「User Notifications framework」のクラスを使用した実装を紹介します。
本記事では、User Notifications framework を使用してリモート通知を受け取る実装を紹介します。
本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。
準備
リモート通知を利用するには以下の作業を行う必要がありますが、説明は省略します。今回はこちらの記事などを参考にして作業しました。
- アプリ固有の App ID を作成
- APNs 用の証明書を作成
- アプリ固有の Provisioning Profile を作成
- リモート通知を送信する環境を作成
実装
通知の使用許可リクエストとデバイストークン取得
AppDelegate
の application(_:didFinishLaunchingWithOptions:)
メソッド内などに処理を書きます。
まずは、UNUserNotificationCenter
クラスの requestAuthorization
メソッドを使用して通知の使用許可をリクエストします。ローカル通知の場合と同じです。
許可が得られたら、UIApplication
の registerForRemoteNotifications()
メソッドを使用して、リモート通知を使用することをシステムに登録します。ここは iOS 10 よりも古い OS の場合のやり方と同じです。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let center = UNUserNotificationCenter.current() center.requestAuthorization([.alert, .sound]) { (granted, error) in if granted { application.registerForRemoteNotifications() } } return true }
以下の UIApplicationDelegate
のデリゲートメソッドを実装すれば、登録処理の結果を得ることができます。成功すれば、リモート通知を送る側で必要な「デバイストークン」を取得できます。ここも、iOS 10 よりも古い OS の場合のやり方と同じです。
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { print(error) } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { print(deviceToken.description) }
通知受信時の処理を実装する
アプリが foreground ではない場合は、システム提供の通知 UI が表示されます。
アプリが foreground の時に通知を受け取った時の処理を自前で実装する方法はローカル通知の場合と同様です。任意のオブジェクトを UNUserNotificationCenter
のデリゲートにして、デリゲートメソッドを実装します。
// デリゲートを設定 UNUserNotificationCenter.current().delegate = self
// アプリが foreground の時に通知を受け取った時に呼ばれるメソッド func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { if notification.request.trigger is UNPushNotificationTrigger { print("This is UNPushNotificationTrigger") } }
処理完了時に呼ばれるハンドラの引数の UNNotification
は UNNotificationRequest
をプロパティに持ち、さらに UNNotificationRequest
は UNNotificationTrigger
のサブクラスをプロパティに持ちます。リモート通知の場合は、UNPushNotificationTrigger
になります。受信した通知がリモート通知かどうかを判断するための材料になりそうです。
通知を送信する
任意の方法で APNs にペイロードを送信します。
ペイロードは以下のような形式になっていて、ローカル通知と同様に body
だけでなく title
や subtitle
なども設定することができます。
{ "aps": { "alert": { "title": "Introduction to Notifications", "subtitle": "Session 707", "body": "Woah! These new notifications look amazing! Don’t you agree?" }, "badge": 1 } }
さいごに
本記事では、User Notifications framework を使用してリモート通知を受け取る実装を紹介しました。
デバイストークン取得周りの処理だけは UIApplication
の機能を利用し、それ以外は User Notifications framework のクラスを使えば良いことを、サンプルコードを作りながら理解することができました。
今後も User Notifications framework のクラスを試していきます!