4

我已经成功实现了一个客户端/服务器 Android GCM 应用程序。我的应用服务器拥有一个 device/registration_id 对的数据库。消息通过 Web 可访问的 PHP 页面发送到设备。我正在尝试在服务器端编写错误处理,特别是响应包含 canonical_id 的情况。开发人员文档非常清楚需要做什么以及为什么会产生这样的响应:

规范 ID

在服务器端,只要应用程序运行良好,一切都应该正常工作。但是,如果应用程序中的错误触发同一设备的多个注册,则可能很难协调状态,并且您最终可能会收到重复的消息。

GCM 提供了一种称为“规范注册 ID”的工具,可以轻松地从这些情况中恢复。规范注册 ID 定义为您的应用程序请求的最后一次注册的 ID。这是服务器在向设备发送消息时应使用的 ID。

如果稍后您尝试使用不同的注册 ID 发送消息,GCM 将照常处理请求,但它将在响应的 registration_id 字段中包含规范注册 ID。确保使用此规范 ID 替换存储在您服务器中的注册 ID,因为最终您使用的 ID 将停止工作。

因此,在我的 Android 客户端应用程序中,我有一个仅用于开发的按钮,该按钮将使用 GCMRegistrar.register() 第二次注册设备,而无需先取消注册。我原以为这会给我一个与我第一次注册时不同的registration_id,并且从网络向设备发送消息(可能使用旧id)会给我一个带有canonical_id的响应。

但是,第二次注册返回与第一次完全相同的 reg_id。

因此,通过我服务器上的 PHP 发送消息不会在响应中显示 canonical_id。我确实需要测试返回 canonical_id 的情况,表明我需要更新我的数据库,因为我的 PHP 技能不是最好的!

因此,我将不胜感激地收到任何关于我如何引起这样的回应的想法

更新:我刚刚尝试从手机上卸载该应用程序,然后重新安装它。我仍然得到相同的 reg_id。

4

2 回答 2

3

我回答了这个问题——在这里。您可以尝试按照我用来获取规范注册 ID 的步骤操作。它确实涉及卸载应用程序,但也许您没有执行我在此处描述的所有步骤。

于 2012-10-31T21:12:36.273 回答
0

我的理解是,需要更新的规范 id 只会来自服务器。仅当 GCM 服务器检测到它们具有单个设备的两个 id 时才会发生这种情况。

这可能仅在存在某种竞争条件或其他难以重现的错误时才会发生。我理解你渴望测试这个场景,但我一直在使用 GCM,因为它从测试版出来,并且从未见过规范的 id 替换。

于 2012-10-31T14:18:47.920 回答