问题 Firebase Cloud Messaging未调用FirebaseInstanceId


我刚刚根据本指南将GCM更新为FCM 这里。该网站说,一旦生成令牌,我将调用扩展FirebaseInstanceIdService的服务。出于某种原因,我的服务从未被调用过 onTokenRefresh 从未被执行过。

根据指南,我的服务是这样注册的:

<service android:name=".fcm.FcmService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service android:name=".fcm.InstanceIdService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCEID_EVENT"/>
    </intent-filter>
</service>

我的服务:

public class InstanceIdService extends FirebaseInstanceIdService {

    private static final String TAG = "InstanceIdService";

    @Override
    public void onTokenRefresh() {
        String token = FirebaseInstanceId.getInstance().getToken();

        Log.e(TAG, "Got token: " + token);
    }
}

LogCat没有说明丢失配置文件或其他任何内容,我可以看到有关FirebaseApp的日志和提及令牌的日志条目,但我的服务仍然没有被调用。

我是否需要在我的活动中的某个地方启动此服务? 难道我做错了什么?有人可以指导我正确的方向吗?

编辑:使用 Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken()); 正确打印我的令牌,这意味着它已成功生成。该服务仍未被调用...

编辑2:将INSTANCEID_EVENT更改为INSTANCE_ID_EVENT解决了问题,但我必须重新安装该应用程序。由于我已经发布了包含新FCM的测试版,我的测试版测试人员将无法订阅主题以显示传入的消息。那我该怎么解决呢?


10634
2018-05-19 15:00


起源

对于它的价值,一个doc(firebase.google.com/docs/cloud-messaging/android/...)说意图过滤器应该是 INSTANCE_ID_EVENT 和另一个(developers.google.com/cloud-messaging/android/...)说 INSTANCEID_EVENT。似乎都不适合我 - 我和你有同样的问题。 - Zach Rattner
@ZachRattner那为我做了,很好抓!确保在更改后重新安装您的应用。 - Endanke
我可以确认INSTANCE_ID_EVENT对我有用,但不是INSTANCEID_EVENT - hordurh
我还可以确认将INSTANCEID_EVENT更改为INSTANCE_ID_EVENT修复了该问题,但我必须重新安装该应用程序。由于我已经发布了包含新FCM的测试版,我的测试版测试人员将无法订阅主题以显示传入的消息。那我该怎么解决呢? - qwertz
@qwertz除了“我告诉过你”关于测试之前推出版本,你能推出一个新的beta测试吗?据推测,这些都是友好的beta测试人员,所以他们会理解你是否告诉他们他们当前的版本被破坏了。 - Zach Rattner


答案:


谢谢Endanke和我一起搞清楚这一点。似乎Firebase文档不一致。 一页 说你的清单文件中的意图过滤器应该是 INSTANCE_ID_EVENT,和 另一个 说 INSTANCEID_EVENT

你应该用 INSTANCE_ID_EVENT,一旦进行了更改,您将需要完全卸载并重新安装您的应用程序才能启动更改。


11
2018-05-20 19:08



我已经这样做但它仍然没有打电话 onTokenRefresh() - natsumiyu
外部思考卸载和重新运行对我有用。谢谢。 - vabhi vab
这个答案还是正确的吗?您链接的页面都不包括在内 INSTANCEID_EVENT 要么 INSTANCE_ID_EVENT 在他们的文字中。 - SimpleJ


FCM应该用作GCM的替代品。在您的情况下,您的清单中的FCM和GCM似乎都有服务。尝试删除gcm.GcmService,并仅使用扩展FirebaseInstanceId的那个。


2
2018-05-19 16:33



但是当我删除gcm.GcmService时,我应该在哪里收到传入消息? - qwertz
在您的FirebaseMessageService扩展中,您也可以为其添加服务 - Arthur Thompson
抱歉忘了重命名GcmService,但它已经扩展了FirebaseMessagingService - qwertz
您是否尝试卸载并重新安装应用程序,只有在生成新令牌时才会获得令牌生成回调。如果应用程序已有令牌,则不会使用新令牌。卸载并重新安装将强制生成新令牌。 - Arthur Thompson


经过大量的反复试验,我的问题就是拥有工具:我的应用程序标签中的node =“replace”...删除它解决了我的问题


1
2017-10-24 04:21





我遇到了同样的问题,并在设备上卸载并重新安装了应用程序 onTokenRefresh() 被叫了一次。所以我猜它从经常被调用的GCM改为在没有令牌的情况下被调用一次。


0
2018-05-19 21:58





我的项目中有不同的构建变体,我遇到以下问题:

从: https://firebase.google.com/docs/android/setup#prerequisites

注意:如果您有多个定义了不同软件包名称的构建变体,则必须在Firebase控制台中将每个应用程序添加到您的项目中。


0
2018-06-07 11:58





只需将INSTANCE_ID_EVENT更改为INSTANCEID_EVENT。这对我有用


0
2017-07-21 03:54





另外,请检查手机的日期!我曾经有过5-7天的差异!修复一天并重新安装应用程序修复此问题!


0
2018-06-11 20:04





确保您的Firebase“MyFirebaseInstanceIDService.java”文件直接位于包名称树“com.company”下

不要将它们放在单独的子包中,如“com.company.services”。这是因为您的google-services.json将直接在“com.company”目录下查找文件。

在元标记下方的清单应用程序标记中添加以下内容(如果有)

<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service> 

你将获得关于public void onTokenRefresh()方法的TOKEN

PS:从项目控制台下载并替换最新的google-services.json。


0
2018-06-18 06:16