我正在构建一个使用 c2dm 的应用程序。
我认为每当我的应用程序的主要“意图”启动时,我都应该要求提供注册 ID。我一直在这样做,但似乎每个请求都会产生一个新字符串,所以我最终在我的数据库中为同一设备堆积了大量的注册 ID。我认为只有其中一个会起作用。但是,我不想只删除旧的,因为我希望我的用户在拥有多个设备时能够在多个设备上接收通知。
我该如何处理?
我正在构建一个使用 c2dm 的应用程序。
我认为每当我的应用程序的主要“意图”启动时,我都应该要求提供注册 ID。我一直在这样做,但似乎每个请求都会产生一个新字符串,所以我最终在我的数据库中为同一设备堆积了大量的注册 ID。我认为只有其中一个会起作用。但是,我不想只删除旧的,因为我希望我的用户在拥有多个设备时能够在多个设备上接收通知。
我该如何处理?
在您的设备上安装您的应用程序之前,切勿刷新 ID
我已经实现了 C2DM。如果您在一台设备上拥有多个注册 ID,则只有最新的 ID 才能发送通知。
当您将设备注册到谷歌服务器时,它会生成一个与该设备 ID 相对应的字符串(如您所知)。但是如果您再次使用同一设备注册,那么之前的设备就没有用了。
所以我建议最好保留设备是否已注册的信息。如果已注册,则无需再次重新注册。因为您将根据旧 R_ID 收到通知。只需将此 R_ID 发送到您的服务器以进行通知,并将标志保存在您的数据库中以跟踪注册
您唯一的假设是在没有注册 ID 时请求注册 ID,并将其发送到您的服务器(发送 C2DM 消息的服务器)。奇怪的是,在我自己的测试中,每次我在同一设备上注册和取消注册同一个应用程序时,我都会获得相同的 id。我还没有做很多测试,但我认为每个设备和应用程序组合的 id 都会改变。
我将registration_id 和device_id 保存在数据库中。这样我每个设备只有一个条目。此外,注册 ID 作为共享首选项保存在设备上,这样我就不必每次都请求新的...
但我想知道是否有某种方法可以查明用户在其设备上的 reg id 是否已过期。
有任何想法吗?有没有这样做的意图?
只有在安装后第一次运行应用程序时,才应从 C2DM 服务器请求设备的注册 ID,然后将其保存在数据库中(最好与设备 ID 一起保存,以便它是唯一的)。
只要 C2DM 没有向设备发送新的注册 ID,或者用户卸载应用程序,注册 ID 就有效。我假设您知道如何处理后一种情况。
回到第一个案例。在设备中的应用程序的生命周期内,C2DM 服务器可能会向设备发送一个新的注册 ID[它会自行执行此操作,您不必再次请求它]。因此,您应该有一个相同的侦听器,并且您可以在数据库中更新该设备的注册 ID。
希望能帮助到你。
如果您在云中注册,则返回的注册 ID 将一直有效,直到您收到带有“未注册”字符串的意图(仅当您的应用程序有意识地取消注册服务时才会发生这种情况)或 Google 发送带有新注册的另一个注册意图ID,在这种情况下,您设置的系统应该可以正常工作。
如果您的服务器收到带有数据“Error=NotRegistered”的 200 响应,它将知道注册 ID 是否已过期。在这种情况下,您将从数据库中删除该条目。