使用GCM的通知令牌

时间:2014-04-17 13:13:13

标签: android notifications push-notification google-cloud-messaging

我开发了android,我使用GCM发送通知。

我正面临一个问题,我将以一个例子来解释。

让我们说用户A登录我的应用程序。所以我为该用户生成令牌,让我们说使用GCM是“AA1”并将其存储在我们的数据库中。但是,如果用户卸载应用程序并再次安装它。然后我再次生成令牌(让我们说AA2)并存储在我们的服务器中。

如果两个令牌都相同,那么在插入令牌之前我不会产生任何问题。但是因为同一设备的GCM令牌可能不同。对吗?

稍后,当我想向该用户发送通知时。该用户将获得两次通知,因为他之前的令牌仍然有效。我试图搜索但发现没有任何相关的内容。可能我错过了一些东西或没有人想到这样的东西。

无论哪个,但我认为必须有办法解决这个问题。

问题

有没有办法检查通知令牌是否属于同一设备?

当用户卸载应用时,有没有办法从我们的数据库中删除通知令牌?

请指导我。

5 个答案:

答案 0 :(得分:0)

我认为这个问题可以通过这种方式解决。

将Token值存储到应用程序服务器时,应将其映射到用户设备ID。因此,当重新生成此令牌(具有不同的值)时,您的应用程序服务器可以更新该用户的令牌,因为在两种情况下设备ID都相同。

答案 1 :(得分:0)

  

有没有办法检查通知令牌是否属于同一设备?

不是以独特的方式。当用户注册并存储IP及其GCM id地址时,您可以进行IP比较,这样当他们再次连接时,您可以检查您是否已经注册了该IP地址并删除以前的。但是,这不是一个好的100%解决方案,因为有些国家/地区为多个设备分配了相同的IP地址。我认为这里最好的方法是实现超时机制。在我的应用程序中,当用户注册时,他们必须每30秒发送一次“keepalive”HTTP POST信号来说“嘿,我还在这里”。如果keepalive没有在合理的时间内到达,我认为它是超时并将其从数据库中删除。

然而,这是(现在我的意思是不安全),其中一种情况是您应该调用GoogleCloudMessaging.unregister()方法并将其发送到第三方服务器。

  

当用户卸载应用时,有没有办法从我们的数据库中删除通知令牌?

似乎没有(Perform a task on uninstall in android)。但是,通过上述方法,您将不会有任何进一步的问题,因为该用户将停止发送“keepalive”通知,并且他将超时。

答案 2 :(得分:0)

我们所做的是为每个应用程序实例生成一个唯一的ID(在我们的服务器中)。应用程序首次安装在设备上之后通过进行API调用来获取该ID。我们将该ID存储在外部存储中(卸载应用程序时不会被擦除)。设备的注册ID在我们的数据库中与我们的唯一ID相关联。

这样,当应用程序再次安装在同一设备上时,我们从外部存储器(如果可用)获取该标识符并重新使用它,即使注册ID已更改,我们也知道它属于相同的设备。

除此策略外,您的服务器还应处理以下方案:

  1. 如果您在GCM的回复中获得规范的注册ID,请删除旧的注册ID(如果您的数据库中已存在规范ID)或将其更改为新的规范ID。这样可以防止重复邮件再次发送到此设备。

  2. 如果GCM的响应中出现NotRegistered错误,请删除您尝试从数据库发送的注册ID。这意味着应用程序已卸载。没有其他方法可以检测用户是否已卸载该应用程序。

答案 3 :(得分:0)

同意你的意见。但仍然有一个解决方案。您可以做的是,您可以使用设备IMEI号作为设备ID并使用它。即使出厂重置,此IMEI编号也不会改变。 How to get unique device hardware id in Android?

 TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
 telephonyManager.getDeviceId();

同时添加以下清单权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

答案 4 :(得分:0)

我认为一种解决方案是在每次通知时发送推送密钥。通过保留共享首选项中使用的最后一个推送密钥,在客户端处理此问题。如果再次获得相同的通知密钥,请将其删除。