我写了一个非常简单的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>
这是app 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'
答案 0 :(得分: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-x API,如play-services-gcm和play-services-drive等。因此,请始终使用play-services-x等拆分库,而不仅仅是播放服务
答案 1 :(得分:2)
对我而言,当我们的应用程序使用FCM时,它是使用GCM的第3方sdk。注册这两项服务将为您提供两个通知。
(另外,我在FirebaseMessagingService中调用了super.onMessageReceived(remoteMessage)
,导致出现第三个通知:p
答案 2 :(得分: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":"刊物"
}
}
参考:How to handle notification when app in background in firebase
答案 3 :(得分:1)
当应用程序处于后台或关闭(并发送通知和数据)时,我遇到了同样的问题。在AndroidManifest.xml中请求旧的GCM权限导致
答案 4 :(得分:0)
用于构建gradle文件编译&#39; com.google.firebase:firebase-core:10.2.1&#39;,编译&#39; com.google.firebase:firebase-messaging:10.2.1&#39 ;并在reciver中使用handleIntent()。
答案 5 :(得分:0)
我必须删除
<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
这对我有用,谢谢