Как проверить, зарегистрировано ли уже мобильное устройство

Я использую Amazon AWS Ruby SDK для Amazon SNS, но у меня возникают проблемы с уже зарегистрированными устройствами. Иногда, когда устройство регистрируется снова, я получаю сообщение об ошибке типа AWS::SNS::Errors::InvalidParameter Invalid parameter: Token Reason: Endpoint arn:aws:sns:us-east-1:**** already exists with the same Token, but different attributes.. Как проверить, существует ли уже конечная точка и, что более важно, как получить конечную точку для данного токена?


person BvdBijl    schedule 23.10.2013    source источник
comment
У меня такая же проблема с SNS для node.js. Вы нашли какие-то решения для этого?   -  person Michal Kuklis    schedule 24.10.2013
comment
Я использую библиотеку .net и не получаю сообщения об ошибке, когда пытаюсь зарегистрировать ее снова.   -  person Filippo Vitale    schedule 24.10.2013
comment
Вы получаете ошибку только тогда, когда хотите сохранить дополнительные атрибуты, связанные с регистрацией, а затем позже вызываете регистрацию с другим набором атрибутов.   -  person Michal Kuklis    schedule 25.10.2013
comment
Я боюсь, что мое решение состоит в том, чтобы использовать регулярное выражение для извлечения его из сообщения об ошибке... Кажется, нет способа проверить, существует ли уже устройство.   -  person BvdBijl    schedule 30.10.2013


Ответы (3)


Отдайте должное идее 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;
            }
        }
    }
}
person tia    schedule 05.11.2013
comment
Настолько сумасшедший, что это буквально единственный способ сделать это. - person chadkouse; 11.03.2014
comment
Вместо того, чтобы удалять и создавать конечную точку платформы, вы можете просто вызвать: SetEndpointAttributes с атрибутом Enabled = true - person Kamil; 07.01.2015
comment
Странно, что приходится анализировать это из сообщения об ошибке, которое может измениться в будущем. Довольно смешно, что они просто не возвращают нам дубликат конечной точки. - person user3344977; 10.11.2016

Похоже, 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, а не сообщение об ошибке.

person Gil    schedule 02.10.2014

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);

    }
person Felipe Santos    schedule 27.08.2015
comment
Учтите, что если у меня много конечных точек, это означает 1 лакх, тогда этот процесс потребует некоторой задержки для проверки токена в общих конечных точках. Есть ли способ удалить конечную точку напрямую без обработки? - person Eswara Reddy; 14.09.2015