我已经整理了一个骨架客户端/服务器GCM应用程序,该应用程序从我粗略且准备就绪的服务器接受并显示我的Android手机上的消息。我说'骨架'和'粗糙和准备',因为我的应用程序的registration_id被硬编码到服务器端,作为我在调试器中捕获的值,当我启动示例Android应用程序并在GCM服务器上注册应用程序/设备组合时。我正要开始致力于为双方提供读/写机制,以便在我开始思考时访问服务器上的简单数据库以存储reg_id /设备组合:
我知道这个reg_id可以随时过期,因为谷歌说它可以。从文档中可以清楚地看到如何检查id是否仍然正常,并且它是一个很大的IF,我再次启动应用程序。但是,为什么我或任何其他用户再次启动它?在清单中注册的GCMIntentService根据需要在那里收集消息,并且无需出于任何原因再次运行应用程序。因此,当id到期时,我将停止获取消息 - 服务器可能从返回代码中知道,但无法通知我的应用程序 - 无法恢复,除非我再次运行应用程序并通过其onCreate()
并且可能是registerClient()
种方法。
那么当id到期时会发生什么?我没有看到IntentService中的任何on ..方法都会执行。谷歌自己会发一条正常消息说它即将到期吗?我是否需要编写一个每天运行的警报任务并检查ID?
答案 0 :(得分: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 doc说:
如果注册ID到期。谷歌可能决定刷新 注册ID。对于所有这些情况,您应删除 来自第三方服务器的注册ID,并停止使用它发送 消息。错误代码为NotRegistered时发生。
考虑到上述事实,然后在您的服务器上,您应该处理过期的ID并在您的数据库中设置一个标志,下次您的Android客户端检查您的服务器(最后您必须进行定期检查)或您在GCMRegistrar类上调用isRegisteredOnServer
并获得 false 结果,您应该触发REGISTRATION意图以获取新ID。