2014-09-25 85 views
3

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

the document,他们说: “这种方法重复调用将返回原来的注册ID

公共字符串寄存器(串... senderIds)

注册GCM的应用并返回注册ID。您的 必须在安装应用程序时调用一次,并将返回的注册ID发送到服务器。

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

但在another document,他们想出了一种叫“规范标识”:

规范标识 在服务器端,只要应用程序表现很好,一切都应该正常工作。但是,如果应用程序 中的某个错误触发了同一设备的多个注册,则可能很难与 协调状态,并且最终可能会出现重复的消息。

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

这是否意味着当我做注册时,我必须为每个设备发送一个唯一的识别号码?

这是我用于将设备注册到Google云端通讯的代码块:

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); 
} 

回答

2

是,登记该应用之后它重新安装可给你一个新的注册ID。你可以处理它无论是在服务器端或客户端:

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

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

我建议你两者都做,因为仅次于解决了这个问题,你已经得到了重复的消息后,第一是不充分证明(因为外部存储可能被删除或不可用)。

+0

感谢您的回复。看起来像我必须走你的第一个解决方案。但是我认为外部存储中的“唯一实例ID”并不像你提到的那样好。有没有更简单的方法可以用来识别设备?例如“设备ID”或什么?无论如何,我会马上谷歌它。谢谢。 – TrungDQ 2014-09-25 08:09:13

+0

不幸的是,没有“唯一的设备标识符”这样的东西。因此,您必须严格遵守Google提供的方法,以免接收到重复的邮件。 – 2015-11-06 07:12:13

相关问题