取消注册并重新注册GCM消息会导致两个regId有效.这是按预期的吗?

Nil*_*zor 8 android push-notification google-cloud-messaging

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

  1. 注册GCM - ID 一个分配
  2. 注销
  3. 注册GCM - 已分配ID B.

如果在步骤2之后,服务器尝试向ID A发送消息,则会收到NotRegistered错误,如记录和预期的那样.

但是,现在的怪部分:第3步之后,两者 ID 一个是有效的ID!两个ID都将触发设备上的Intent接收器,从而向应用程序发送两条消息.

这种行为是否已经过了,或者我做错了什么?

这是我注册和取消注册的代码,从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);
}
Run Code Online (Sandbox Code Playgroud)

注1:我只包含了unregister() - 用于调试的调用.我的应用程序通常保持注册"终身"(我也希望在暂停和终止时收到GCM消息),但我仍然想弄清楚这种行为的原因,因为我不确定取消注册是否是唯一的情况ID被重新生成.如果用户卸载并重新安装应用程序该怎么办?我想要一个防弹系统 - 我的用户永远不会收到两次相同的GCM消息.

注2:问题非常类似于此,除了我确实正在注册,getApplicationContext()如答案所示.

Era*_*ran 4

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

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


归档时间:

查看次数:

8937 次

最近记录:

10 年,10 月 前