用户在android中重新安装应用程序时复制注册端点
下面是我如何在android中注册SNS帐户的,它运行良好用户在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
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-catchGetEndpointAttributesRequest
),如果抛出了NotFoundException
,它将创建端点。我只记录了设备id,不知道这是否是标准方式为什么不在注册前检查是否存在,因此,基本上您可以调用后端,即isSNSRegistered
,后端返回true
或false
,具体取决于设备是否已注册,然后您可以返回现有端点或注册新端点。您应始终避免在移动应用程序中使用硬件标识符:
String id = //get mac address or IMEI from system
UUID uuid = UUID.nameUUIDFromBytes(id.getBytes(Charset.forName("UTF-8")));