Android
GCM
Firebase

【Android】GCMとFCMを両方入れるとPush通知が2回届く問題

More than 1 year has passed since last update.

GCM(Google Cloud Messaging)とFCM(Firebase Cloud Messaging)を共存して使おうとしたらハマった点があったのでそのメモ

背景

  • 今回、FCMの端末単位でサーバーからPush通知を送る仕組みがほしいためFCMを導入することになった
  • 今まではGCMを使ったPush通知サービスを導入して利用していた
    • 全体や一部のセグメント向けのPush通知はこのサービスを使うため残しておく
    • まだFCM対応しておらずGCMを残しておく必要がある

問題

  • FCMからPush通知を打つと通知が2回出てしまう
    • ただし、GCMを使ったPush通知サービスからPush通知を打っても1回しかでない

原因

  • GCMのReceiverがFCMのPush通知をフックしてPush通知を表示させていた

対処法

  • GcmReceiverを継承したReceiverクラスを作成し、FCMからのPush通知だった場合は通知を出さないように制御する

コード

class AppGcmReceiver : GcmReceiver() {
    private val firebaseSenderId: String = "xxxxxxxxxxxx" // FirebaseのSenderId

    override fun onReceive(context: Context?, intent: Intent?) {
      val senderId = intent?.getStringExtra("from") // senderIdはExtraにfromというkeyで格納されている
      
        // Firebaseからの通知だった場合は弾く
        if (intent?.getStringExtra("from") == this.firebaseSenderId) {
            return
        }

        super.onReceive(context, intent)
    }
}

FirebaseのSenderIdはコンソールの設定 -> クラウドメッセージング -> 送信者 ID で確認することができる

AndroidManifest

通常通りGCMを設定すると、android:nameにはcom.google.android.gms.gcm.GcmReceiverが設定されているので、
今回作成したGcmReceiverを継承したクラスのパスに置き換える

<receiver
    android:name= ".app.receiver.AppGcmReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="${applicationId}" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
    </intent-filter>
</receiver>

以上でFCMからのPush通知は1回しか表示されないようになる

他に良い方法がある気もするのであれば知りたい...