14

我编写了一个非常简单的 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>

这是应用程序等级:

    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'
4

6 回答 6

9

看起来您正在使用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-services。

于 2016-07-04T13:48:50.593 回答
4

对我来说,这是一个使用 GCM 的 3th 方 sdk,而我们的应用程序正在使用 FCM。注册这两种服务会给你两个通知。

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

于 2016-09-13T10:12:07.497 回答
1

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

我使用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":"刊物"
   }
} 

参考:当应用程序在firebase后台时如何处理通知

于 2016-09-07T11:25:44.520 回答
1

当应用程序在后台或关闭(并发送通知和数据)时,我遇到了同样的问题。由在 AndroidManifest.xml 中请求旧的 GCM 权限引起

看看https://stackoverflow.com/a/44435980/1533285

于 2017-06-08T12:44:30.510 回答
1

我不得不删除

<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

这对我有用,谢谢

于 2019-09-08T10:22:44.850 回答
0

在构建 gradle 文件中使用编译“com.google.firebase:firebase-core:10.2.1”,编译“com.google.firebase:firebase-messaging:10.2.1”并在接收器中使用 handleIntent()。

于 2017-06-22T11:28:20.597 回答