Как да проверя дали мобилно устройство вече е регистрирано

Използвам 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 lib и не получавам грешка, когато се опитам да го регистрирам отново   -  person Filippo Vitale    schedule 24.10.2013
comment
Получавате грешката само когато искате да съхраните допълнителни атрибути, свързани с регистрацията, и след това по-късно извиквате регистър с различен набор от атрибути.   -  person Michal Kuklis    schedule 25.10.2013
comment
Страхувам се, че моето решение е да използвам Regex, за да го извлека от съобщението за грешка... Изглежда няма начин да се провери дали устройството вече съществува   -  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

Изглежда Amazon е решил този проблем. Използвам 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 lakh, тогава този процес ще отнеме известно забавяне точно за проверка на токена в общия брой крайни точки. Има ли някакъв начин да изтриете крайна точка директно без обработка? - person Eswara Reddy; 14.09.2015