我正在将 GCM 构建到我的应用程序中,并且我想确保我不会得到重复的设备 ID。
是否有处理设备 ID 的“最佳实践”?我原来的想法是当应用程序加载时它调用 gcm.register,并将 ID 发布到我的服务器,如果密钥不在我的数据库中,我会存储它,然后当我发出通知时,循环通过数据库和发送消息。
但我想知道 ID 是否会改变,我不想向一台设备发送多条消息。
我正在将 GCM 构建到我的应用程序中,并且我想确保我不会得到重复的设备 ID。
是否有处理设备 ID 的“最佳实践”?我原来的想法是当应用程序加载时它调用 gcm.register,并将 ID 发布到我的服务器,如果密钥不在我的数据库中,我会存储它,然后当我发出通知时,循环通过数据库和发送消息。
但我想知道 ID 是否会改变,我不想向一台设备发送多条消息。
是的,ID 可以更改。如果你看一下 SDK 中的教程,每次应用程序更新到新版本时,它都会去获取一个新的 ID,因为以前的 ID 不能保证工作。
具体看看这个页面
http://developer.android.com/google/gcm/client.html
Check if app was updated; if so, it must clear the registration ID
since the existing regID is not guaranteed to work with the new
app version.
当您的 GCM 注册 ID 可能更改时,我在这里阅读了 2 个原因:
PS:以下旧答案的参考已从 Google 页面中删除。
除了@tyczj 在更新应用程序时更改 ID 的答案外,谷歌表示它也可能会自动刷新 ID。如果您在架构概述页面上阅读标题启用 GCM 下的第二点,它会说:
Note that Google may periodically refresh the registration ID, so you should design your Android application with the understanding that the com.google.android.c2dm.intent.REGISTRATION intent may be called multiple times. Your Android application needs to be able to respond accordingly.
只是为了处理这种情况,你应该有一个Broadcast Listener
可以处理com.google.android.c2dm.intent.REGISTRATION
意图的附加信息,当谷歌必须刷新注册 ID 时,它会发送给应用程序。广播接收器将具有onReceive
带有 Intent 的方法。从意图中,您可以Bundle
使用它从 Google 中提取新的注册 ID。您可以保存它并将其发送到第三部分服务器,以替换您之前为该用户注册的 ID。
我认为如果您可以在每次登录时验证或更新基于登录的应用程序和 id 会更好。我有一个类似的应用程序,它对我有用。