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回しか表示されないようになる
他に良い方法がある気もするのであれば知りたい...