2017年7月7日金曜日

Firebase で単一のデバイスにだけプッシュ通知を送信する方法

概要

前回 Firebase のプッシュ通知をとりあえず試しました
Firebase のプッシュ通知には送信対象としてユーザセグメント (アプリ)、トピック、単一の端末 (FCM トークン) の 3 種類があります
今回はその中の単一の端末に送信する方法を紹介します

環境

  • mac OS X 10.12.5
  • Xcode 8.3.3 (8E3004b)
  • iPhone5 (通知テスト用の実機)

AppDelegate にトークンを取得する処理を追加

didFinishLaunchingWithOptions を以下のように編集します

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Firebase の初期化
    FIRApp.configure()
    // プッシュ通知の許可を表示する
    if #available(iOS 10.0, *) {
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {_, _ in })
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
        // For iOS 10 data message (sent via FCM)
        FIRMessaging.messaging().remoteMessageDelegate = self as? FIRMessagingDelegate
    } else {
        let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    }
    application.registerForRemoteNotifications()
    // オブザーバを設定し端末トークンの更新監視をします
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.tokenRefreshNotification(_:)),
        name: NSNotification.Name.firInstanceIDTokenRefresh,
        object: nil)
    // すでにローカルにトークン情報がある場合はそれを表示する
    if let refreshedToken = FIRInstanceID.instanceID().token() {
        print("InstanceID token: \(refreshedToken)")
    }
    return true
}

ポイントは NotificationCenter.default.addObserver の部分でこれを登録することで端末トークンが更新されたときにトークンが表示されるようにします
もし、すでにトークンがローカルにある場合はそれを表示します

そして addObserver で追加している端末トークンが更新された際に呼ばれる関数「tokenRefreshNotification」を追加します

// トークンの更新があった場合にコールされます
func tokenRefreshNotification(_ notification: Notification) {
    if let refreshedToken = FIRInstanceID.instanceID().token() {
        print("Refresh InstanceID token: \(refreshedToken)")
    }
}

これで準備 OK です
当然ですが実機でなければトークンを取得できないので実機を接続してください

アプリを実機にインストールしてトークンを取得する

今回はコンソールログに出力しているだけなので、アプリを起動したらコンソールログを確認しましょう
今回であれば以下のように表示されれば OK です

Refresh InstanceID token: eIWudgln0C4:APA91bHA9sX7WNO6cBVAzV_DLZ89Ap54SSg6uNPOtWn8VLGdJlxutyu458yUR4yrz7ILNcNCaK5sAWhIyqq8W16XXPLfnDrenjmf_OBpLm5dJGCeZXrZ8hn5eJM2d8AYw8uQG8Gkj5E0

このトークンを使ってプッシュ通知を送信します

動作確認

今回は Firebase のコンソール画面からプッシュ通知を送信してみます
ログインして Notifications の画面に移動し新しいメッセージを作成します
そしてターゲットの部分で「単一の端末」を選択して先ほどのトークンを入力しましょう
firebase_single_push1.png

これで送信するとテストしていた実機にだけプッシュ通知が行くことを確認できると思います

通知が届かない場合は

まずアプリをインストールしたときのプッシュ通知の確認で許可するようにしましょう

あとはアプリがバックグランドにいる必要があります
フロントですでに動作している状態ではプッシュ通知は動作しません

今回は紹介しませんでしたが、p12 証明書を設定する必要もあるのでその辺りもしっかり Firebase に設定されているか確認してください
テスト用のプッシュ通知になるので development 用のプッシュ通知証明書から p12 ファイルを作成する必要もあります

最後に

Firebase で指定した 1 端末にだけプッシュ通知を送信する方法を紹介しました
Firebase の場合端末情報をデータベースに保存するのは自分でやる必要があるので、もし端末トークンを管理したい場合は登録する処理を書きましょう

おそらく登録しないのは登録しても誰のどの端末か全くわからないので、手元にある実機でコンソール出力して確実に端末がわかる状態で送信できれば問題ないのでそうしているんだと思います

今はなき Parse.com などは端末トークンをバックエンド側に保存する機能があったのでコンソール画面などでも確認できたのですが、Firebase の場合そういった機能はないのでコンソール画面でも端末トークンの一覧を確認することはデフォルトではできません

参考サイト

0 件のコメント:

コメントを投稿