首页 文章

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

提问于
浏览
3

我正在使用GoogleCloudMessaging在我的应用中实现通知功能 . 但我有一个问题,当我 uninstall my app and install it again 时,我得到 2 different registration ids ,这导致了 duplicate notifications to my app .

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 回答

  • 2

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

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

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

    我建议你两个都做,因为第二个只在你收到重复的消息后解决问题,而第一个不是完全证明(因为外部存储可能被删除或不可用) .

相关问题