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

时间:2015-03-20 10:16:03

标签: 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));
        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);
    }

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

4 个答案:

答案 0 :(得分:0)

如果你重新安装Android应用程序,GCM注册不会改变,我想你可能想在你的后端添加逻辑,看看设备是否已经注册了SNS。

答案 1 :(得分:0)

您应该避免从同一个应用,设备和属性重新创建新的端点。尝试将端点arn 首次保存到永久存储空间(安全地位于服务器或SD卡位置),即使重新安装了应用,也可以从中检索它

重新安装应用后,请获取最新的令牌。为上次保存的端点arn调用GetEndpointAttributes并检查令牌是否不是最新的,请按照此link

中伪造的代码中的说明对其进行更新
retrieve the latest token from the mobile OS
if (endpoint arn not stored)
    # first time registration
    call CreatePlatformEndpoint
    store returned endpoint arn
endif

call GetEndpointAttributes on the endpoint arn 

if (getting attributes encountered NotFound exception)
    #endpoint was deleted 
    call CreatePlatformEndpoint
    store returned endpoint arn
else 
    if (token in endpoint does not match latest) or 
        (GetEndpointAttributes shows endpoint as disabled)
        call SetEndpointAttributes to set the 
                     latest token and enable the endpoint
    endif
endif

答案 2 :(得分:0)

您可以从设备硬件中获取标准uuid来识别每个设备。并使用此uuid作为后端的密钥以避免received several time

类似的东西:

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

答案 3 :(得分:0)

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

您可以在此处查看如何获取它: https://developer.android.com/training/articles/user-data-ids.html#working_with_instance_ids_&_guids