Firebase云消息传递不调用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没有提及丢失的configuration文件或其他信息,而且我可以看到关于FirebaseApp的日志以及提及该令牌的日志条目,但是我的服务仍然不会被调用。

我需要在我的活动某处开始这项服务吗? 难道我做错了什么? 有人能以正确的方向引导我吗?

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

编辑2:更改INSTANCEID_EVENT INSTANCE_ID_EVENT修复了这个问题,虽然我不得不重新安装应用程序。 由于我已经发布了一个包含新FCM的testing版本,我的betatesting人员将无法订阅主题来感受接收的消息。 那我该如何解决呢?

Solutions Collecting From Web of "Firebase云消息传递不调用FirebaseInstanceId"

感谢Endanke和我一起解决这个问题。 Firebase文档似乎不一致。 一个页面表示您的清单文件中的意图filter应该是INSTANCE_ID_EVENT , 另一个表示INSTANCEID_EVENT

你应该使用INSTANCE_ID_EVENT ,一旦你做了改变,你需要完全卸载并重新安装你的应用程序的变化踢。

FCM应该被用来代替GCM。 在你的情况下,看起来你的清单中有FCM和GCM的服务。 尝试删除gcm.GcmService,并只使用扩展FirebaseInstanceId的那个。

经过大量的试验和错误我的问题是有工具:节点=“replace”在我的应用程序标记…删除它解决了我的问题

我有同样的问题,并通过卸载并重新安装应用程序onTokenRefresh()被调用一次。 所以我想它从G​​CM经常被调用到只有被调用一次时,实际上没有令牌。

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

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

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

只需将INSTANCE_ID_EVENT更改为INSTANCEID_EVENT即可

另外,请检查您的手机的date! 我曾经有过5-7天的差距! 修复这一天,并重新安装应用程序解决这个问题!

确保您的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> 

你将得到你的TOKEN on public void onTokenRefresh()方法

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

“Firebase云消息传递”想要的是:

  • FirebaseInstanceIdService实现派生类( MyFirebaseInstanceIdService )。
  • 实现覆盖onTokenRefresh来处理设备令牌的更新。
  • 在AndroidManifest.xml中引用以“。”为前缀的“派生”类。

MyFirebaseInstanceIdService是一个“build议”的名字。 我个人更喜欢在这个派生类中加上一个首字母缩写词或名字,这个名字在整个应用程序中使用。