しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

iOSのサイレントプッシュを試してみる

iOSのサイレントプッシュというものを試してみました。

サイレントプッシュとは

その名の通り、ユーザーに通知メッセージが出ないプッシュ通知の事です。
送信時にバックグラウンドで処理を走らせる事ができるので、バックグラウンドでのデータの更新などに向いています。
大まかな流れは通常のpush通知と同じです。

サイレントプッシュ送信準備

まずは下記事の手順に従ってpush通知の実装をします。

llcc.hatenablog.com

続けて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の設定のものを利用します。

f:id:llcc:20171014143119p:plain

コンソールからAPIを叩いたら、アプリ側のログも出力されました。

f:id:llcc:20171014143635p:plain