iOSのサイレントプッシュというものを試してみました。
サイレントプッシュとは
その名の通り、ユーザーに通知メッセージが出ないプッシュ通知の事です。
送信時にバックグラウンドで処理を走らせる事ができるので、バックグラウンドでのデータの更新などに向いています。
大まかな流れは通常のpush通知と同じです。
サイレントプッシュ送信準備
まずは下記事の手順に従ってpush通知の実装をします。
続けてFIRMessaging.messaging().subscribeメソッドでトピックの登録をします。
トピックはプッシュ通知の送信者指定に関する機能で、通知を実際に送る際に利用します。
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .unknown) FIRMessaging.messaging().subscribe(toTopic: "/topics/all") } }
サイレントプッシュを受け取り時の処理
続けてサイレントプッシュを受け取った時の処理を追加します。
AppDelegateにdidReceiveRemoteNotificationを実装します。
サイレントプッシュを受け取った時は、下のメソッドが呼ばれるのでこの中でデータ更新などの処理を記述します。
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { print("メッセージを受け取った") completionHandler(.noData) } }
サイレントプッシュを送る
最後にFirebaseに下のようなリクエストを送れば完了です。
curl --header "Authorization: key=API_KEY" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\": \"/topics/all\",\"content_available\":true}"
API_KEYはFirebaseの設定のものを利用します。
コンソールからAPIを叩いたら、アプリ側のログも出力されました。