[iOS 10] User Notifications framework を使用してリモート通知を受け取る処理を実装する #wwdc

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんばんは。モバイルアプリサービス部の平屋です。前回の記事に引き続き、iOS 10 で追加された「User Notifications framework」のクラスを使用した実装を紹介します。

本記事では、User Notifications framework を使用してリモート通知を受け取る実装を紹介します。

本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。

準備

リモート通知を利用するには以下の作業を行う必要がありますが、説明は省略します。今回はこちらの記事などを参考にして作業しました。

  • アプリ固有の App ID を作成
  • APNs 用の証明書を作成
  • アプリ固有の Provisioning Profile を作成
  • リモート通知を送信する環境を作成

実装

通知の使用許可リクエストとデバイストークン取得

AppDelegateapplication(_:didFinishLaunchingWithOptions:) メソッド内などに処理を書きます。

まずは、UNUserNotificationCenter クラスの requestAuthorization メソッドを使用して通知の使用許可をリクエストします。ローカル通知の場合と同じです。

許可が得られたら、UIApplicationregisterForRemoteNotifications() メソッドを使用して、リモート通知を使用することをシステムに登録します。ここは 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")
    }
}

処理完了時に呼ばれるハンドラの引数の UNNotificationUNNotificationRequest をプロパティに持ち、さらに UNNotificationRequestUNNotificationTrigger のサブクラスをプロパティに持ちます。リモート通知の場合は、UNPushNotificationTrigger になります。受信した通知がリモート通知かどうかを判断するための材料になりそうです。

通知を送信する

任意の方法で APNs にペイロードを送信します。

ペイロードは以下のような形式になっていて、ローカル通知と同様に body だけでなく titlesubtitle なども設定することができます。

 {
    "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 のクラスを試していきます!

参考資料