在 Android 设备上注册/取消注册 GCM 消息时,我注意到一些奇怪的行为。从客户端设备的角度观察以下用例:
- 注册 GCM -- ID A assigned
- 注销
- 注册 GCM -- ID B assigned
如果在第 2 步之后,服务器尝试向 ID A 发送消息,它将收到一个 NotRegistered
错误,as documented和预期。
但奇怪的是:在第 3 步之后, ID A 和 B 都是有效的 ID!两个 ID 都会触发设备上的 Intent 接收器,从而向应用程序发送两条消息。
这种行为是否符合预期,还是我做错了什么?
这是我注册和取消注册的代码,在我的应用程序上启动第一个 Activity 时从 onCreate()
触发:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
unregister(getApplicationContext());
register(getApplicationContext());
}
/** Registers this device for GCM messages */
public static void register(Context context) {
GCMRegistrar.checkDevice(context);
GCMRegistrar.checkManifest(context);
String regId = GCMRegistrar.getRegistrationId(context);
if (regId.equals("")) {
GCMRegistrar.register(context, SENDER_ID);
} else {
storeRegId(regId); // Also notifies back-end
}
}
public void unregister(Context context) {
GCMRegistrar.unregister(context);
}
注意 1:我只包含了 unregister() 调用以用于调试目的。我的应用程序通常“终身”注册(我也想在暂停和终止时接收 GCM 消息),但我仍然想找出这种行为的原因,因为我不确定取消注册是否是唯一的情况重新生成 ID。如果用户卸载并重新安装应用程序怎么办?我想要一个防弹系统 - 我的用户永远不会两次收到相同的 GCM 消息。
注2:问题很漂亮similar to this ,除了我确实按照答案建议使用 getApplicationContext()
注册。
最佳答案
当您取消注册时,您应该将旧的注册 ID 发送到您的服务器并将其从您的数据库中删除。
假设您未能执行第 1 步,如果在注册并获得新注册 ID 后您使用旧注册 ID 发送消息,Google 的响应将包含规范注册 ID(即新注册 ID ).此响应表明您的服务器应删除旧的注册 ID 并仅使用新的注册 ID。
关于android - 注销和重新注册 GCM 消息会导致两个 regId 有效。这是预期的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320549/