xyk blog

最近は iOS 開発の記事が多めです。

Firebaseでプッシュ通知したが既読数が計測されていなかった件

環境: iOS9

Firebaseのプッシュ通知機能を使い、iOS端末に向けてのプッシュ通知をしたところ、送信は問題なくできたのだが、管理画面から確認できる既読数が0にままだったので原因を調べた。

f:id:xyk:20161104132640p:plain

で原因だが以下ドキュメント

Receive Messages in an iOS App  |  Firebase
https://firebase.google.com/docs/cloud-messaging/ios/receive

Handling messages with method swizzling disabledの項にちゃんと書いてあるのだが Method swizzling をオフにした場合にはFIRMessaging.messaging().appDidReceiveMessage(userInfo)を実装する必要があるが、これを実装していなかった。

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // Let FCM know about the message for analytics etc.
    FIRMessaging.messaging().appDidReceiveMessage(userInfo)
    // handle your message
  }

これを実装したところ、既読数も計測されるようになった。

ちなみにプッシュ通知を受信した時に呼ばれるメソッドは以下記事書いたように2種類あるのだが

xyk.hatenablog.com

fetchCompletionHandler 付きのメソッドの方はアプリの状態によらず必ず呼ばれるのでこちらでappDidReceiveMessage(userInfo)を実装すること。

あと、管理画面上に計測結果が反映されるには、少し時間がかかるので注意。
まず送信数の方が数十分〜数時間後に反映され、それからさらに時間をおいて既読数の方が反映される。

また、iOS10ではプッシュ通知周りの実装が少し変わったので以下を参考に今後修正予定。
(以前の実装のままでもiOS10で動作はする)

quickstart-ios/AppDelegate.swift at master · firebase/quickstart-ios
https://github.com/firebase/quickstart-ios/blob/master/messaging/FCMSwift/AppDelegate.swift