GCM注册ID已更改。

8
我开发了一个应用程序,使用GCM技术,一切都很顺利。我观察到设备的注册ID会在一段时间后更改,这导致我的应用程序出现问题,因为我的应用程序依赖于Reg ID。那么我该如何为客户获取固定的Reg ID?

@trante 那个 Stack Overflow 的问题已经过时了,浪费时间。 - Micro
2个回答

15

我在这里阅读到的两个GCM注册ID可能会更改的原因:

  1. 每次更新应用程序时,您都需要重新注册每个设备。
  2. 如果设备运行的Android版本已更新,则还需要重新注册设备。

附注:下面旧答案的参考已从Google页面中删除,因此可能不再有效

如果您在架构概述页面下的第二个点下看到,它说:

请注意,Google可能会定期刷新注册ID,因此您应该设计您的Android应用程序,了解com.google.android.c2dm.intent.REGISTRATION意图可能会被多次调用。您的Android应用程序需要能够相应地做出响应。

因此,为了处理这个问题,您需要拥有一个Broadcast Listener,它可以处理com.google.android.c2dm.intent.REGISTRATION意图,当谷歌需要刷新注册ID时,会向应用程序发送该意图。广播接收器将具有带有Intent的onReceive方法。从意图中,您可以使用Bundle获取新的注册ID,然后保存并将其发送到第三方服务器以替换该用户的先前注册ID。

此外,您还可以查看In GoogleCloudMessaging API, how to handle the renewal or expiration of registration ID?上的this答案。

Should applications call gcm.register() every seven days to ensure valid registration IDs?问题的讨论也可能会有所帮助。

希望这能帮助您了解如何处理它。

2
我认为您的报价不再有效了。那段文字不存在于启用GCM标题下方。 - the-ginger-geek

12

“周期性”刷新从未发生过,而注册刷新也不包含在新的GCM库中。

已知注册ID更改的唯一原因是应用程序在升级时自动注销。在修复此错误之前,应用程序仍然需要在升级后调用register(),因此在这种情况下,注册ID可能会更改。显式调用unregister()通常也会更改注册ID。

建议/解决方法是生成自己的随机标识符,例如保存为共享首选项。每次应用程序升级时,可以上传标识符和可能的新注册ID。这也有助于跟踪和调试服务器端的升级和注册更改。


我的应用程序有“AppUpdateReceiver”来监听应用程序更新,以启动“AppUpdateService”,该服务同步FCM注册以解决问题。最新的FCM库是否仍然存在此错误?我是否可以删除此代码,因为在Oreo中启动此类服务很棘手。 - Singed

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