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