Firebase 发送推送通知两次

Firebase send push notification twice

我写了一个非常简单的 android 应用程序来测试 firebase 推送通知,我收到了两次通知。

这是清单服务:

<service
        android:name="com.google.firebase.messaging.FirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name="com.google.firebase.iid.FirebaseInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

这是应用 gradle:

    compile 'com.google.android.gms:play-services:9.0.0'
    compile 'com.google.firebase:firebase-core:9.0.0'
    compile 'com.google.firebase:firebase-messaging:9.0.0'
}
apply plugin: 'com.google.gms.google-services'

这里是项目级别 gradle:

classpath 'com.google.gms:google-services:3.0.0'

您似乎在使用 com.google.android.gms:play-services:9.0.0(包括 play-services-gcm)和 com.google.firebase:firebase-messaging:9.0.0

来自 firebase-massaging 的 FCM 会自动注册一个实例 ID 令牌(设备 ID),因此如果您有在您的应用程序中注册令牌的逻辑,那么您很可能会注册两次。这可能会导致您收到多个通知。更一般地说,正是出于这个原因,您不应该在同一个应用程序中使用 FCM 和 GCM。因此,如果您打算使用 FCM,则应从您的应用中移除 GCM。

此外,使用 play-services 包括所有 play-services-x A​​PI,如 play-services-gcm 和 play-services-drive 等。所以请始终使用像 play-services-x 这样的拆分库,而不仅仅是 play -服务。

接受的答案对我不起作用。以下是有效的方法:

我使用 data-messages 而不是 display-messages 这样即使应用程序在前台或后台,也只会出现一个通知。

替换

{
      "to": "/topics/journal",
      "notification": {
        "title" : "title",
        "text": "data!",
        "icon": "ic_notification"
       }
}

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

参考:

对我来说,当我们的应用程序使用 FCM 时,它是一个使用 GCM 的第 3 方 sdk。注册这两项服务会给您两个通知。

(我还在我的 FirebaseMessagingService 中调用 super.onMessageReceived(remoteMessage) 导致出现第三个通知:p

当应用程序在后台或关闭(并发送通知和数据)时,我遇到了同样的问题。由于在 AndroidManifest.xml

中请求旧的 GCM 权限

看看

在构建 gradle 文件中使用编译 'com.google.firebase:firebase-core:10.2.1',编译 'com.google.firebase:firebase-messaging:10.2.1' 并在 reciver.

中使用 handleIntent()

我不得不删除

<receiver android:name="com.google.android.gms.gcm.GcmReceiver" 
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> 
</receiver>

来自 AndroidManifest.xml

这对我有用,谢谢