用户在android中重新安装应用程序时复制注册端点

用户在android中重新安装应用程序时复制注册端点,android,amazon-web-services,google-cloud-messaging,amazon-sns,Android,Amazon Web Services,Google Cloud Messaging,Amazon Sns,下面是我如何在android中注册SNS帐户的,它运行良好 if (gs.settings.getString("endpoint_arn", "").equals("")) { gcm = GoogleCloudMessaging.getInstance(ctx); asnsc = new AmazonSNSClient(new BasicAWSCredentials(Constant.id,Constant.secret)); asns

下面是我如何在android中注册SNS帐户的,它运行良好

    if (gs.settings.getString("endpoint_arn", "").equals("")) {
        gcm = GoogleCloudMessaging.getInstance(ctx);
        asnsc = new AmazonSNSClient(new BasicAWSCredentials(Constant.id,Constant.secret));
        asnsc.setRegion(Region.getRegion(Regions.AP_SOUTHEAST_1));
        asnsc.setEndpoint("sns.ap-southeast-1.amazonaws.com");

        new AsyncTask() {
            @Override
            protected Object doInBackground(final Object... params) {
                try {
                    CreatePlatformEndpointRequest per = new CreatePlatformEndpointRequest();
                    String token = gcm.register(Constant.projectID);
                    Log.d("test1",""+token);
                    per.setToken(token);
                    per.setPlatformApplicationArn(Constant.platformARN);
                    CreatePlatformEndpointResult result = asnsc.createPlatformEndpoint(per);
                    gs.editor.putString("endpoint_arn",result.getEndpointArn()).commit();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return true;
            }

            @Override
            protected void onPostExecute(Object result) {
                super.onPostExecute(result);
                enterApp(1000); // assume 1000 ms for register GCM
            }

        }.execute(null, null, null);
    }

问题是,当用户重新安装应用程序时,会生成一个新的令牌,并创建新的端点,因此存在重复的端点,当我在后端发送消息时,会多次收到消息,当我卸载应用程序时,令牌不是会变为无效吗?但在我的情况下,它仍然有效,如何修复它?

如果重新安装Android应用程序,GCM注册不会改变,我认为您可能需要在后端添加逻辑,以查看设备是否已向SNS注册。

您应该避免从相同的应用程序、设备和属性重新创建新的端点arn。尝试将第一次生成的端点arn保存到一个永久存储器中(可能安全地位于服务器或sd卡位置),即使在重新安装应用程序后,也可以从该存储器中检索该端点arn

重新安装应用程序后,获取最新令牌。调用上次保存的端点arn的GetEndpointAttributes,并检查该令牌是否为最新令牌,然后按照psuedocode中的说明对此令牌进行更新


您可以获得从设备硬件创建的标准
uuid
,以识别每个设备。并将此
uuid
用作后端的键,以避免
多次收到

比如:

String id = //get mac address or IMEI from system
UUID uuid = UUID.nameUUIDFromBytes(id.getBytes(Charset.forName("UTF-8")));

您应该使用设备和安装的标识符作为SNS的令牌,以避免出现问题

您可以在此处查看如何获取它:

我使用的是纯GCM实现,但为了获得更多价值,您可能需要查看Java代码。它以不同的方式检查现有端点(使用try-catch
GetEndpointAttributesRequest
),如果抛出了
NotFoundException
,它将创建端点。我只记录了设备id,不知道这是否是标准方式为什么不在注册前检查是否存在,因此,基本上您可以调用后端,即
isSNSRegistered
,后端返回
true
false
,具体取决于设备是否已注册,然后您可以返回现有端点或注册新端点。您应始终避免在移动应用程序中使用硬件标识符:
String id = //get mac address or IMEI from system
UUID uuid = UUID.nameUUIDFromBytes(id.getBytes(Charset.forName("UTF-8")));