LoginSignup
16
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-25

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回しか表示されないようになる

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

16
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15