android - 注销和重新注册 GCM 消息会导致两个 regId 有效。这是预期的吗?

标签 android push-notification google-cloud-messaging

在 Android 设备上注册/取消注册 GCM 消息时,我注意到一些奇怪的行为。从客户端设备的角度观察以下用例:

  1. 注册 GCM -- ID A assigned
  2. 注销
  3. 注册 GCM -- ID B assigned

如果在第 2 步之后,服务器尝试向 ID A 发送消息,它将收到一个 NotRegistered 错误,as documented和预期。

但奇怪的是:在第 3 步之后, ID AB 都是有效的 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() 注册。

最佳答案

  1. 当您取消注册时,您应该将旧的注册 ID 发送到您的服务器并将其从您的数据库中删除。

  2. 假设您未能执行第 1 步,如果在注册并获得新注册 ID 后您使用旧注册 ID 发送消息,Google 的响应将包含规范注册 ID(即新注册 ID ).此响应表明您的服务器应删除旧的注册 ID 并仅使用新的注册 ID。

关于android - 注销和重新注册 GCM 消息会导致两个 regId 有效。这是预期的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320549/

相关文章:

java - android gcm 服务器中的 ssl 握手异常

android - 如何在 android webview 中启用 cookie?

java - 错误: Type mismatch: cannot convert from ArrayList<Subchild> to ArrayList<String>

iphone - 如何在我的应用程序中获取推送通知设置?

android - 当应用程序被终止并处于优化电池模式时未收到 FCM 消息|一加 5t |一加 6 |错误广播 Intent 回调 : result=CANCELLED

android - Google Cloud Messaging (GCM) 使用哪个端口和协议(protocol)?

android - ProviderTestCase2 构造函数中的 Provider Authority String 是什么?

android - 如何在 Eclipse Indigo 中禁用 m2e 构建?

ios - 推送通知如何在 iOS 的移动设备管理中工作?

php - GCM PHP 获取消息状态