GoogleCloudMessaging#register在同一个应用/设备中返回不同的ID?

时间:2014-09-25 04:14:23

标签: android notifications duplicates google-cloud-messaging

我正在使用GoogleCloudMessaging在我的应用中实现通知功能。但我有一个问题,当我卸载我的应用并再次安装时,我得到了 2个不同的注册ID ,这会导致重复通知到我的应用

the document中,他们说:“重复调用此方法将返回原始注册ID

  

public String register(String ... senderIds)

     

注册GCM申请并返回注册ID。您   安装应用程序时,必须调用一次,然后发送   将注册ID返回给服务器。

     

重复调用此方法将返回原始注册   ID。

但在another document中,他们想出了一些名为“ Canonical ID ”的内容:

  

Canonical ID        在服务器端,只要应用程序运行良好,一切都应该正常工作。但是,如果应用程序中存在错误   触发同一设备的多次注册,可能很难   协调状态,你可能会得到重复的消息。

那么如何才能使所有设备保持一致?我的(第三方)服务器仅存储注册ID,用于发送通知。现在,这里出现了“Canonical ID”,一切都变得如此复杂!

这是否意味着我在进行注册时必须为每个设备发送一个唯一的标识号?

这是我用来将设备注册到GoogleCloudMessaging的代码块:

try {
    if (gcm == null) {
        gcm = GoogleCloudMessaging.getInstance(context);
    }
    regid = gcm.register(SENDER_ID);
    Log.d(TAG, "########################################");
    Log.d(TAG, "Current Device's Registration ID is: " + regid);
    Map<String, String> data = new HashMap<String, String>();
    data.put("regId", regid);
    try {
        Utils.post(Constants.SERVER_NOTIFY_REG_LINK, data);
        Log.d(TAG, "ID registered: " + regid);
    } catch (Exception e) {
        e.printStackTrace();
    }
} catch (IOException ex) {
    msg = "Error :" + ex.getMessage();
    Log.d(TAG, msg);
}

1 个答案:

答案 0 :(得分:2)

是的,重新安装后注册应用程序可能会为您提供新的注册ID。您可以在服务器端或客户端处理它:

  • 客户端:为应用的每个实例分配唯一的实例ID。将该ID存储在外部存储中,以便在卸载应用程序时不会将其删除。将该ID与注册ID一起发送到您的服务器,如果您在数据库中找到与相同实例ID关联的旧注册ID,则将旧注册ID替换为新注册ID。

  • 服务器端:每当您在GCM的响应中获得规范的注册ID时,请从您的数据库中删除旧的注册ID(并插入规范的注册ID,如果它尚未存在于您的数据库中)。

我建议您同时执行这两项操作,因为第二项仅在您收到重复邮件后才解决问题,而第一项不是完整证明(因为外部存储可能会被删除或不可用)。