Cloud Messaging で特定デバイスにプッシュ通知を送信する方法

Cloud Messaging で特定デバイスにプッシュ通知を送信する方法

プッシュ通知

iPhoneやAndroidデバイスにおいて、プッシュ通知はアプリの情報提供を行う上で欠かせない機能です。ユーザがアプリを開いていなくても、ユーザにアプリの情報を伝えることができるので、いろいろな行動をユーザに促すことができます。
このようにプッシュ通知は便利な機能ですので自分たちでリリースする iPhone や Android アプリに導入したところですが、自前でプッシュ通知を行うサーバを実装しようとすると骨が折れる作業になります。そのため近年ではプッシュ通知のための mBaaS が登場したりしています。そのサービスは AWS や Azure をはじめ、多くのプラットフォームで提供されていますが、基本的に有償サービスとなります。

Firebase Cloud Messaging

ところが今回紹介する Google が提供する Firebase の Cloud Messaging は、プッシュ通知を無料で利用することができます。
また公式に Cloud Messaging の設定方法が用意されています。
https://firebase.google.com/docs/cloud-messaging/ios/client
しかし順序通りに進めても説明が不足しているところが何点かあり、初心者の iOS 開発者にとっては苦労する箇所かと思いますので、特定のデバイスにプッシュ通知を送る手順を紹介したいと思います。

ソースコード (Swift)

細かなソースコードの説明は公式にあるので割愛しますが、具体的にどこに記載したらいいか初見では判らないこともあると思いますので、ソースコードの全貌を記します。
import UIKit
import Firebase

@main
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        //Firebase Messaging設定
        FirebaseApp.configure()
        Messaging.messaging().delegate = self

        //プッシュ通知設定
        UNUserNotificationCenter.current().delegate = self

        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
          options: authOptions,
          completionHandler: { _, _ in }
        )

        application.registerForRemoteNotifications()

        return true
    }

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
    }

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        //トークンが更新されるたびに呼び出される
        print("Firebase registration token: \(String(describing: fcmToken))")

        let dataDict: [String: String] = ["token": fcmToken ?? ""]
        NotificationCenter.default.post(
            name: Notification.Name("FCMToken"),
            object: nil,
            userInfo: dataDict
        )
    }

}
ソースコードの全貌といっても40行程度です。ここで不要なコメントは全て削除しました。特筆すると「 AppDelegate クラスに、 UNUserNotificationCenterDelegate と MessagingDelegate を追加する」ことに注意してください。 またこのあと特定デバイスにプッシュ通知を送るテストを行いますので、iOS実機での実行時に得られた36行目の token はメモしておいてください。

テストメッセージ送信

それでは次に Firebase のコンソール画面を表示します。 通常であればウィザードに沿ってプッシュ通知を送りますが、特定の端末にメッセージを送る場合は、通知テキストを入力した後に「テストメッセージを送信」をクリックします。 「デバイスでのテスト」画面において、iOSアプリ実行時に取得したトークンを「FCM登録トークンを追加」に入力し追加します。送りたいトークンにチェックが入っていることを確認して「テスト」をクリックすると、直ぐにプッシュ通知が送られてきます。

まとめ

私は iOS アプリの開発に慣れているつもりでしたが、初めて Cloud Messaging を利用したとき、どこにソースコードを書けばいいの?、特定のデバイスにプッシュ通知を送るにはどうすればいいの?など、少し躓いたので記事にさせて頂きました。
今回紹介した内容は、Firebase コンソールから特定デバイスにプッシュ通知を送信する方法ですので、次回は HTTP 経由で特定デバイスにプッシュ通知を送信する方法を紹介したいと思います。
» エンジニア登録はこちら