使用 Amazon SNS 处理 android 应用程序卸载

Handling android app uninstallation with Amazon SNS

我们已经完成 SNS 设置,以便为我们的 Android 应用程序发送推送通知。分步过程如下:

  1. 每当应用程序启动时,它都会通过调用 register 来生成 GCM 注册 ID。代码片段如下:

    private String registerOnGCM(){ try { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext()); String token = gcm.register(Globals.GCM_TOKEN); return token; } catch (IOException e) { Log.e(TAG, "failed to complete token refresh process"); } return null; }

    其中 Globals.GCM_TOKEN 是在为应用程序进行 FCM 注册时获得的应用程序 ID。

  2. 应用程序调用我们的后端服务器并传递此注册 ID。

  3. 后端服务器检查这个注册ID是否是新的。如果是新的,则它使用此注册 ID 创建一个新的 SNS 端点,然后将新端点订阅到为用户创建的主题。并将所有这些数据保存在我们的数据库中以供将来参考。

当向用户的所有设备发送推送通知时,我们只需将消息广播到为该用户创建的主题,然后将消息发送到用户拥有的所有设备。这适用于多台设备都安装了我们的应用程序的情况。卸载重装出现问题

重新安装后,GCM 注册调用 returns 一个单独的注册 ID 并将其发送到后端。后端将其检测为新设备并将其注册到 SNS,即使设备是相同的,用户最终也会拥有多个 SNS 端点。为该用户向主题推送通知时,同一台设备收到两条推送通知。可能是因为旧的端点仍然存在,它应该被禁用。

所以,我的问题是:如何确保在提到的测试用例中,只有一个推送通知被发送到 android 设备。

这是我为我的问题找到的解决方案。

在重新安装的情况下,注册 ID 会发生变化,并且稍后会使用相同的注册 ID 来检测设备是否已注册 SNS 推送。但是还有一个实体是设备独有的,在重新安装的情况下不会改变,即设备 ID。

我更改了对我们服务器的后端调用并向其添加了一个参数,即设备 ID。此 Id 现在用于检测现有的 SNS 注册。如果 Id 已经存在并且注册 Id 是新的,那么我将删除旧端点及其对该用户主题的订阅,然后继续注册过程的其余部分。这将保持 SNS 上的数据以及我们自己的数据清洁。