4

我已经组装了一个框架客户端/服务器 GCM 应用程序,该应用程序在我的 Android 手机上接受并显示来自我粗糙且准备好的服务器的消息。我说“骨架”和“粗略准备”是因为我的应用程序的 registration_id 被硬编码到服务器端,作为我在启动示例 Android 应用程序并在 GCM 服务器上注册应用程序/设备组合时在调试器中捕获的值。当我开始思考时,我正要开始为双方提供一个读/写机制来访问服务器上的一个简单数据库来存储 reg_id/device 组合:

我知道这个 reg_id 可以随时过期,因为谷歌说它可以。从文档中可以清楚地看出如何检查 id 是否仍然可以 IF,而且这是一个很大的 IF,我再次启动应用程序。但是,我或任何其他用户为什么要重新启动它?在清单中注册的 GCMIntentService 会根据需要在那里接收消息,并且无需出于任何原因再次运行该应用程序。因此,当 id 过期时,我将停止接收消息 - 服务器可能会从返回代码中知道,但无法通知我的应用程序 - 除非我再次运行应用程序并通过其onCreate()可能的registerClient()方法,否则无法恢复。

那么当 id 过期时会发生什么?我看不到 IntentService 中的任何 on.. 方法都会执行。谷歌自己会发送一条正常的消息说它即将过期吗?我是否需要编写一个警报任务来每天运行并检查 id?

4

1 回答 1

1

根据GCM

现有的注册 ID 可能在多种情况下不再有效,包括:

  • 如果应用程序通过发出 com.google.android.c2dm.intent.UNREGISTER 意图手动取消注册。
  • 如果应用程序被自动取消注册,如果用户卸载应用程序,这可能会发生(但不能保证)。如果注册ID过期。Google 可能会决定刷新注册 ID。
  • 如果应用程序已更新但新版本没有配置广播接收器来接收 com.google.android.c2dm.intent.RECEIVE 意图。

考虑注册相关的响应将触发“ com.google.android.c2dm.intent.REGISTRATION”意图。因此,您应该注意从 GCM 发送的注册消息。

更新

GCM 文档说:

如果注册ID过期。Google 可能会决定刷新注册 ID。对于所有这些情况,您应该从第 3 方服务器中删除此注册 ID 并停止使用它来发送消息。当错误代码未注册时发生。

考虑到上述事实是事实,那么在您的服务器上您应该处理过期的 ID 并在您的数据库中设置一个标志,下次您的 android 客户端检查您的服务器时(最后您必须进行定期检查)或者您isRegisteredOnServer调用GCMRegistrar 类并得到错误结果,您应该触发 REGISTRATION 意图以获得新 ID。

于 2012-10-10T18:42:21.163 回答