我正在将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可能会更改的两个原因:
附注:Google页面中下面旧答案的参考已被删除。
除了@tyczj的答案之外,Google表示它也可以自动刷新ID。如果您阅读架构概述页面下标题为“启用GCM”的第二个要点,它说:
请注意,Google可能会定期刷新注册ID,因此您应该设计您的Android应用程序,了解com.google.android.c2dm.intent.REGISTRATION意图可能会被多次调用。您的Android应用程序需要能够相应地响应。
补充一点信息,为了处理这种情况,您需要有一个广播监听器,它可以处理Google发送给应用程序的com.google.android.c2dm.intent.REGISTRATION
意图,当应用程序需要刷新注册ID时。广播接收器将具有带有Intent的onReceive
方法。从意图中,您可以使用Bundle
获取新的注册ID,然后保存并将其发送到第三方服务器以替换该用户先前注册的ID。
我认为如果您可以拥有基于登录的应用程序并在每次登录时进行身份验证或更新,那将会更好。我有一个类似的应用程序,它对我很有效。