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 API,如 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
这对我有用,谢谢
我写了一个非常简单的 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 API,如 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
这对我有用,谢谢