如何检查移动设备是否已注册

我正在使用适用于Amazon SNS的Amazon AWS Ruby SDK,但我在使用已经注册的设备时遇到了一些问题。 有时当设备再次注册时,我收到类似AWS::SNS::Errors::InvalidParameter Invalid parameter: Token Reason: Endpoint arn:aws:sns:us-east-1:**** already exists with the same Token, but different attributes. 。 如何检查端点是否已存在,更重要的是,如何获取给定令牌的端点?

感谢BvdBijl的想法,我做了一个扩展方法,删除现有的一个,如果找到,然后添加它。

 using System; using System.Text.RegularExpressions; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; namespace Amazon.SimpleNotificationService { public static class AmazonSimpleNotificationServiceClientExtensions { private const string existingEndpointRegexString = "Reason: Endpoint (.+) already exists with the same Token"; private static Regex existingEndpointRegex = new Regex(existingEndpointRegexString); public static CreatePlatformEndpointResponse CreatePlatformEndpointIdempotent( this AmazonSimpleNotificationServiceClient client, CreatePlatformEndpointRequest request) { try { var result = client.CreatePlatformEndpoint(request); return result; } catch (AmazonSimpleNotificationServiceException e) { if (e.ErrorCode == "InvalidParameter") { var match = existingEndpointRegex.Match(e.Message); if (match.Success) { string arn = match.Groups[1].Value; client.DeleteEndpoint(new DeleteEndpointRequest { EndpointArn = arn, }); return client.CreatePlatformEndpoint(request); } } throw; } } } } 

似乎amazone解决了这个问题。 我正在使用RoR并且在尝试注册和现有的GCM代码时曾经遇到同样的问题我收到了一条错误消息

 "AWS::SNS::Errors::InvalidParameter Invalid parameter: Token Reason: Endpoint arn:aws:sns:us-east-1:**** already exists with the same Token, but different attributes." 

虽然我使用相同(空)属性。 现在,当我发送现有的GCM代码(具有与原始代码相同的属性)时,我得到端点arn而不是错误消息。

ListEndpointsByPlatformApplication只返回100个端点,你必须使用nextToken来获得更多。 这是我的实施。

  public void deleteEndpoint(string token, string PlatformApplicationArn) { ListEndpointsByPlatformApplicationRequest listRequest = new ListEndpointsByPlatformApplicationRequest(); listRequest.PlatformApplicationArn = PlatformApplicationArn; Logger.Info("Deleting endpoint with token -> " + token); var list = snsClient.ListEndpointsByPlatformApplication(listRequest); do { foreach (var x in list.Endpoints.Where(x => x.Attributes["Token"] == token)) { snsClient.DeleteEndpoint(new DeleteEndpointRequest() { EndpointArn = x.EndpointArn }); Logger.Info("Endpoint removed-> " + x.EndpointArn); return; } listRequest.NextToken = list.NextToken; list = snsClient.ListEndpointsByPlatformApplication(listRequest); } while (list.NextToken != null); }