Firebase云消息传递未调用FirebaseInstanceId

11

根据这里的指南,我刚刚将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的beta版本,因此我的测试人员将无法订阅主题以接收传入消息。那我该如何解决这个问题呢?


2
就此而言,一个文档(https://firebase.google.com/docs/cloud-messaging/android/client#manifest)指出意图过滤器应为“INSTANCE_ID_EVENT”,另一个文档(https://developers.google.com/cloud-messaging/android/android-migrate-fcm#update_the_android_manifest)则指出应为“INSTANCEID_EVENT”。两者似乎都对我无效 - 我和你遇到了相同的问题。 - Zach Rattner
2
@ZachRattner 对我有用,好发现!确保在更改后重新安装您的应用程序。 - Endanke
2
我可以确认INSTANCE_ID_EVENT对我有效,但INSTANCEID_EVENT无效。 - hordurh
@qwertz 除了“我早就告诉你要在发布之前进行测试”的话,你能否推出一个新的测试版?想必这些都是友好的测试人员,如果你告诉他们当前版本有问题,他们会理解的。 - Zach Rattner
这完全是一个文档问题,一个非常不幸的排版错误。对于造成的困惑,我们感到很抱歉!值得一提的是,GCM文档现在已经更新了INSTANCE_ID_EVENT。 - Eric Gilmore
显示剩余4条评论
10个回答

11
感谢Endanke与我一起解决这个问题。看起来Firebase文档不一致。其中一个页面说您的清单文件中的intent过滤器应该是INSTANCE_ID_EVENT,而另一个页面则说应该是INSTANCEID_EVENT
你应该使用INSTANCE_ID_EVENT,并且一旦你做出了改变,你需要完全卸载和重新安装你的应用程序才能使更改生效。

1
我已经完成了这个,但它仍然没有调用 onTokenRefresh() - natsumiyu
2
外部彻底卸载并重新运行对我有效。谢谢。 - vabhi vab
这个答案还正确吗?你提供的链接页面中都没有包含“INSTANCEID_EVENT”或“INSTANCE_ID_EVENT”。 - SimpleJ

2

FCM应该被用作取代GCM的方案。在您的情况下,您的清单中具有FCM和GCM的服务。尝试移除gcm.GcmService,并仅使用扩展FirebaseInstanceId的那个。


但是如果我移除gcm.GcmService,那么我应该在哪里接收传入的消息呢? - qwertz
在您扩展FirebaseMessageService时,您还需要添加一个服务。 - Arthur Thompson
抱歉忘记重命名GcmService,但它已经扩展了FirebaseMessagingService。 - qwertz
2
你尝试过卸载并重新安装你的应用程序吗?只有在生成新令牌时才会收到令牌生成回调。如果应用程序已经有一个令牌,那么不会使用新令牌。卸载并重新安装将强制生成一个新令牌。 - Arthur Thompson

1
经过大量的试错,我的问题是在应用程序标签中使用了tools:node="replace" ...将其删除后,问题得到解决。

1

请确保您的Firebase "MyFirebaseInstanceIDService.java"文件直接位于包名树"com.company"下。

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

在您的清单应用程序标签中添加以下内容,位于meta标签(如果有)下方:

<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

0

我曾经遇到同样的问题,通过在设备上卸载并重新安装应用程序使onTokenRefresh()被调用了一次。所以我想这与GCM不同,它会频繁调用,而现在只有在真正没有令牌时才会调用一次。


0
“Firebase Cloud Messaging” 需要的是:
  • FirebaseInstanceIdService 创建一个派生类 (MyFirebaseInstanceIdService)。
  • 实现重写 onTokenRefresh 来处理设备令牌的更新。
  • 在 AndroidManifest.xml 文件中,引用以 "." 为前缀的“派生”类。
MyFirebaseInstanceIdService 是一个“建议”的名称。我个人更喜欢使用首字母缩写或我在应用程序中使用的名称作为前缀来命名这样的派生类。

0

另外,检查一下你手机的日期!我曾经遇到过5-7天的差异!调整日期并重新安装应用程序可以解决这个问题!


0

onTokenRefresh() 方法只会在应用程序第一次安装时调用一次。如果您想从其他活动访问令牌,则必须调用此方法:

FirebaseInstanceId.getInstanceId().getToken();

-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接