Android Firebase云消息传递未调用FirebaseInstanceId

Android Firebase云消息传递未调用FirebaseInstanceId,android,firebase,google-cloud-messaging,Android,Firebase,Google Cloud Messaging,我刚刚根据本指南将GCM更新为FCM。该网站称,我的扩展FireBaseInstancedService的服务将在令牌生成后立即被调用。由于某些原因,我的服务从未被调用,onTokenRefresh从未被执行 根据指南,我的服务是这样注册的: <service android:name=".fcm.FcmService"> <intent-filter> <action android:name="com.google.firebase.ME

我刚刚根据本指南将GCM更新为FCM。该网站称,我的扩展FireBaseInstancedService的服务将在令牌生成后立即被调用。由于某些原因,我的服务从未被调用,
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>
LogCat没有说任何关于缺少配置文件或其他方面的信息,我可以看到关于FirebaseApp的日志和提到令牌的日志条目,但我的服务从未被调用

我是否需要在活动中的某个位置启动此服务? 我做错什么了吗?有人能给我指引正确的方向吗

编辑:使用Log.e(“TOKEN”,“TOKEN:+FirebaseInstanceId.getInstance().getToken())正确打印我的令牌,这意味着它已成功生成。服务仍然没有被调用


编辑2:将INSTANCEID_事件更改为INSTANCE_ID_事件修复了该问题,尽管我必须重新安装该应用程序。由于我已经发布了一个包含新FCM的测试版,我的测试人员将无法订阅这些主题来显示传入的消息。那么我应该如何解决这个问题呢?

FCM应该被用作GCM的替代品。在您的情况下,您的清单中似乎同时包含FCM和GCM服务。尝试删除gcm.GcmService,只使用扩展FirebaseInstanceId的服务。

我也遇到了同样的问题,通过在设备上卸载并重新安装应用程序,
onTokenRefresh()
被调用了一次。所以我猜它从经常被呼叫的GCM变为只有一次被呼叫,而实际上没有令牌。

感谢Endanke和我一起解决这个问题。Firebase文档似乎不一致。说明清单文件中的意图过滤器应为
实例ID\u事件
,并说明
实例ID\u事件


您应该使用
INSTANCE\u ID\u EVENT
,一旦您进行了更改,您需要完全卸载并重新安装应用程序,更改才能生效。

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

发件人:

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


只需将INSTANCE_ID_事件更改为INSTANCEID_事件。这对我很有效。

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

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

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

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


您将在public void onTokenRefresh()方法上获得令牌


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

Firebase Cloud Messaging'需要的是:

  • 从实现派生类(MyFireBaseInstancedService) FireBaseInstancedService
  • 实现重写onTokenRefresh以处理 设备的令牌
  • 在AndroidManifest.xml引用中,前缀为“派生”的类 带着一个“.”

MyFireBaseInstancedService是一个“建议”名称。我个人更喜欢在这些派生类前面加上我在整个应用程序中使用的首字母缩略词或名称。

经过大量的尝试和错误后,我的问题是我的应用程序标签中有tools:node=“replace”…删除它为我解决了这个问题。

onTokenRefresh()
将只调用一次。当你的应用程序第一次安装时,如果要从其他活动访问令牌,必须调用此方法:

FirebaseInstanceId.getInstanceId().getToken();

但是,当我删除gcm.GcmService时,我应该在哪里接收传入的消息?在您的FirebaseMessageService扩展中,您也会为此添加一个服务抱歉,忘记重命名GcmService,但它已经扩展了FireBaseMessageServices您是否尝试过卸载并重新安装您的应用程序,只有在生成新令牌时,才能获得令牌生成回调。如果应用程序已经有令牌,则不会使用新令牌。卸载和重新安装将强制生成新令牌。值得一提的是,一个doc()说意图过滤器应该是
INSTANCE\u ID\u EVENT
,另一个()说
INSTANCEID\u EVENT
。这两个似乎都不适合我——我和你有同样的问题。@Zachratner为我做了这件事,接得好!请确保在更改后重新安装应用程序。我可以确认INSTANCE\u ID\u事件对我有效,但INSTANCEID\u事件对我无效。我还可以确认,将INSTANCEID\u事件更改为INSTANCE\u ID\u事件修复了问题,尽管我必须重新安装应用程序。由于我已经发布了一个包含新FCM的测试版,我的测试人员将无法订阅这些主题来显示传入的消息。那么我该如何解决这个问题呢?@qwertz除了“我早就告诉过你”关于发布前的测试之外,你能推出一个新的beta测试吗?大概他们是友好的测试人员,所以如果你告诉他们他们的当前版本被破坏了,他们会理解。我已经这么做了,但它仍然没有调用
onTokenRefresh()
think uninstall and re run对我有效。谢谢。这个答案仍然正确吗?您链接的页面的文本中均不包含
INSTANCEID\u事件
INSTANCE\u ID\u事件
<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service> 
FirebaseInstanceId.getInstanceId().getToken();