对于我在StackOverflow上的第一个问题,我想问关于Google Cloud Messaging服务的问题,特别是Loopback的实现。
因此,我正在开发一个应用程序,并开始在不同的分支上工作,以引入Loopback的推送通知处理及其各种REST Api工具。即使这个主题严格涵盖了Loopback处理GCM的方式,但问题也与Google文档中描述的原始方式有关。
因此,GCM启动背后的主要思想是检查设备是否已注册。
这通过对SharedPreferences变量进行简单检查来完成,该变量是用于存储我们的RegistrationID值的名称。
final LocalInstallation installation = new LocalInstallation(context, adapter);
如果发现这个,设备必须通知服务器并传递令牌。 否则,需要进行GCM注册。 完成后,设备将通知服务器。(
registerInBackground(installation)
最终会在检索RegistrationId后调用saveInstallation(installation)
) if (installation.getDeviceToken() != null) {
saveInstallation(installation);
} else {
registerInBackground(installation);
}
如果通信成功,设备会像上面描述的那样使用SharedPreferences保存RegistrationId。(注意:getDeviceToken()是Loopback通过API处理SharedPreferences中的值的方式)
假设每次创建MainActivity(即在onCreate方法期间)时都进行“GCM-Check”。
我们也知道,GCM有时会出现问题,需要刷新我的应用程序的RegistrationId或其他一些我现在不完全清楚的东西。简而言之,GCM会使我的应用程序的令牌无效。这会导致当服务器使用绑定到我的设备应用程序的令牌发送推送通知时出现错误消息。
类似于以下错误:
{"multicast_id":0123456789012345678,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]}
你可以看到,
"failure":1
和"results":[{"error":"NotRegistered"}]
Loopback的反应与Google文档所说的一样,即通过让服务器删除与错误的RegistrationId链接的设备记录来实现。容易理解。回到我们的设备上。再次启动我的应用程序并加载MainActivity,会导致相同的“GCM-check”过程。这次应用程序可以使用SharedPreferences找到RegistrationId,并直接通知服务器,服务器将创建一个具有给定RegistrationId的记录。
设备应用程序不处理新的注册。
你可以在这里看到循环。设备将不知道它的令牌无效性,并继续向服务器发送相同的数据,服务器将继续向错误的RegistrationId发送信息,因此在收到相关错误后将其删除。
问题是应用程序必须依赖于一次创建而永远不会修改的数据。要删除旧数据,我应该向设备发送通知,但显然无法从GCM到达它。其他可能的解决方案是通过发送电子邮件或短信通知用户,并要求他例如单击按钮,但我更希望采用更“自动化”的方法来解决问题。
我找到的一个非常糟糕的解决方案
据我所知,唯一的错误信息是在推送通知期间从GCM返回到服务器的,因此我对设备进行了一些小修改。
这个想法很简单:创建一个POST请求到GCM服务器,使用服务器应该使用的标头进行身份验证。这会导致错误被发送到设备本身,它可以解析JSON并注意到发生了什么。从这里,应用程序可以伪造一个新的注册过程,修复问题。
这有什么不好的地方? 事实上,为了将设备验证为服务器,我必须硬编码ServerKey并在每个应用程序中分发它。ServerKey应该仅在服务器上使用,使这个解决方案成为一个非常糟糕的想法。
话虽如此,仅使用SharedPreference值让设备知道其状态的想法并不好,因为它只能告诉我是否至少注册了一次,而不能让我知道当前的状态。
在我开发的其他应用程序中,同样使用GCM,我采用了不同的解决方案,例如提供一个供用户点击的按钮或读取服务器发送的某些特殊短信,然后首先启用 GoogleCloudMessaging.unregister(),最终启用GoogleCloudMessaging.register()。
那么,关于这个冗长的问题,你是如何解决这个“NotRegistered”问题的?
感谢您花费时间阅读和回答:)