Подтвердить что ты не робот

Получение "EndpointDisabled" от Amazon SNS

Я использую Amazon SNS. Уведомления работают хорошо, но иногда я получаю эту ошибку:

{
    "message": "Endpoint is disabled",
    "code": "EndpointDisabled",
    "name": "EndpointDisabled",
    "statusCode": 400,
    "retryable": false
}

Может быть, вы знаете, почему.

4b9b3361

Ответ 1

Вы можете создать новую тему SNS, такую ​​как push-notification-failures, а затем связать с ней события APNS/APNS_SANDBOX "Отказ от доставки". Подпишитесь на мероприятие по электронной почте (и подтвердите), и вы получите полезную отладочную информацию о сбоях. Все это можно выполнить с помощью консоли SNS и не требует выполнения вызовов API.

Возможно, стоит подписаться на конечную точку HTTP на эту тему SNS и записать все сбои доставки, чтобы у вас есть исторические данные для работы и отладки производственных проблем.

Например, поставка FailureMessage из "маркеров платформы, связанных с конечной точкой не является действительным" означает, что вы отправляете сообщение от APNS_SANDBOX к APNS зарегистрированы устройство или наоборот. Это может означать, что у вас неправильные настройки APNS для вашей системы сборки. (У нас есть расстраивает проблема для разработчиков построены с использованием бинарных файлов APNS_SANDBOX против TestFlight построен с использованием бинарных файлов APNs для локального тестирования и контроля качества, который является то, что привел меня на этом пути.)

Ответ 2

Я нашел 3 причины:

  • Иногда мы смешивали токены из приложения sandbox.
  • Пользователь отключает уведомления в настройках телефона.
  • Пользователь удалил приложение.

Это касается Iphons/Ipads.

Ответ 3

В соответствии с http://docs.aws.amazon.com/sns/latest/APIReference/API_Publish.html это означает, что конечная точка отключена.

Из http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sns/model/SetEndpointAttributesRequest.html:

Enabled - флаг, который разрешает/запрещает доставку конечной точке. Message Processor будет устанавливать значение false, если служба уведомлений указывает SNS, что конечная точка недействительна. Пользователи могут вернуть значение true, как правило, после обновления Token.

"служба уведомлений" в данном случае относится к Google GCM, APPLS APPLS или ADAM Amazon.

Ответ 4

Существует несколько причин, по которым конечная точка может быть отключена. Я не видел документально нигде (возможно, пропустил его), вот что я получил от поддержки:

  • Вы нажимаете на конечную точку, но токен недействителен/истек. Токены становятся недействительными, если:

  • Это приложение, которое больше не установлено на устройстве.

  • Если устройство было восстановлено из резервной копии. Это делает недействительным токен, и ваше приложение должно запросить новый токен и обновить токен SNS-терминалов соответственно.

  • Приложение было повторно установлено на том же устройстве. В случае Android для приложения назначается новый токен. Это происходит также с APN, но чаще всего с Android.

  • В случае APN в xCode выбран неправильный профиль подготовки. В этом случае уведомления выходят из строя, и устройство отключается после обратной связи APN.

  • Если вы ошибочно используете токен для разработки IOS для приложения IOS production и наоборот.

  • Если Apple по какой-либо причине делает недействительным ваш сертификат IOS push, или кто-то отменяет сертификат push от itunes connect portal. Это займет несколько часов, прежде чем устройство отключится.

  • То же самое с GCM, если вы обновите ключ API из консоли разработчика Google без обновления учетных данных приложения платформы в SNS.

  • Вы нажимаете на конечную точку устройства APN, но приложение отключено из-за истечения срока действия сертификата push.

  • Вы нажимаете на конечную точку устройства GCM, но ключ API обновлен в консоли разработчика Google, но не соответствует учетным данным приложения платформы SNS.

Подробнее, я рекомендую эту отличную статью которая решает мою проблему

Ответ 5

У меня была такая же проблема. Это то, что я сделал:

  • экспортировать ПОЛНЫЙ СЕРТИФИКАТ из доступа к цепочке ключей к файлу .p12
  • экспортируйте ЧАСТНЫЙ КЛЮЧ из Keychange Access в файл * private.p12

  • используйте openssl с загруженным .cer файлом (из iOS Developer MemberCenter), чтобы создать общедоступный сертификат .pem

  • использовать openssl сгенерированным файлом * private.p12 для создания частного ключевого файла .pem

  • В AWS SNS создайте новое приложение. Дайте ему имя. Выберите Apple Development.
  • Выберите FULL CERTIFICATE из Keychain Access с расширением .p12 и введите парольную фразу, которую вы выбрали при экспорте из Keychain Access Скопируйте содержимое общедоступного файла CERTIFICATE.pem в текстовое поле с надписью "Сертификат", включая начальную и конечную строки:

    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    
  • Скопируйте только часть файла закрытого ключа .pem, начиная и заканчивая следующими строками, в текстовое поле с надписью "Private Key":

    -----BEGIN RSA PRIVATE KEY-----
    -----END RSA PRIVATE KEY-----
    

Я использую Cordova с плагином-плагином 1.4.4, но это моя проблема не имеет ничего общего с phonecap. Помимо некоторой путаницы в отношении вышеизложенного, что, в конечном итоге, помогло мне, было открыть мой проект в XCode, найти Target для моего проекта, а затем включить Push Notifications. Это автоматически добавляет право "Push Notifications" на идентификатор приложения. В следующий раз, когда приложение будет установлено на ваше устройство, push-уведомление должно работать. По крайней мере, это было для меня.

Надеюсь, это может спасти кого-то, кто испытывает ту же проблему, что и я, на пол дня!:)

Ответ 6

Быстрый контрольный список перед принятием решительных мер:

  • Сгенерировать запрос подписи сертификата (CSR) с помощью приложения для ключей > .
  • Экспорт сертификата APNS и его закрытого ключа в один файл p12 с помощью Keychain App.
  • Когда вы создаете новое приложение в ASA Amazon, платформа должна соответствовать среде APNS ( Разработка/ Продукция с обеих сторон).
  • Когда вы запрашиваете токен устройства, вы должны находиться в правильном приложении (идентификатор пакета приложения соответствует сертификату APNS).
  • Когда вы создаете новую конечную точку платформы в AWS SNS, маркер устройства должен быть добавлен в правильное приложение (хороший сертификат приложения и хорошая платформа разработки/производства).

В моем случае я сгенерировал CSR с помощью стороннего инструмента SSL. Я получил действительный сертификат от портала разработчика Apple, но без закрытого ключа. Затем я попробовал инструмент сертификата Windows для экспорта без особого успеха. Пустая трата времени. Начните свой Mac.

Затем я использовал пример приложения AmazonMobilePush, чтобы получить токен устройства. Поскольку идентификатор пакета демонстраций не соответствует моему сертификату, конечная точка недействительна. При каждой отправке SNS конечная точка отключилась (false). В конце причина была очевидна, но я все равно теряю драгоценное время.

Ответ 7

Если вы получите сообщение об ошибке End Point is Disabled, используйте приведенный ниже код, чтобы включить endPoint, а затем Push Notification с использованием учетных данных Amazon:

*//Enable Device*

var sns = new AmazonSimpleNotificationServiceClient("AwsAccesskeyId", "AwsSecrteAccessKey", RegionEndpoint.USWest1);
Dictionary<string, string> objDictCheckEndpointEnable = new Dictionary<string, string>();
objDictCheckEndpointEnable.Add("Enabled", "False");
sns.SetEndpointAttributes(new SetEndpointAttributesRequest
    {
        Attributes = objDictCheckEndpointEnable,
        EndpointArn = "AwsEndPointArn" //This is Device End Point Arn
    });

*//End*

Ответ 8

Для меня я получаю, что "токен платформы, связанный с конечной точкой, недействителен", потому что мои конечные точки приложения платформы SNS настроены неправильно. В частности, консоль SNS не правильно считывала учетные данные из моего .p12 файла, хотя в нем содержался правильный сертификат и закрытый ключ. Решение, основанное на этом сообщении, состояло в создании второго файла .p12, содержащего ключ cert и no. Я загрузил учетные данные из первого файла .p12, а затем загрузил второй файл .p12 учетных данных. Я мог видеть изменение строки сертификата, когда я это делал, а потом у меня не было проблем.

Если вы создаете конечную точку производства, SNS будет предупреждать вас о несоответствующих сертификатах, но она не проверяет конечные точки разработки. Единственный способ узнать, что конечная точка встречается, - это когда вы получаете ошибку токена платформы.

Я уверен, что это помогает кому-то, поскольку это заставило меня отвлечься.

Ответ 9

Я использую это. Если ответ get endpoint обнаруживает ошибку NotFound, он создает конечную точку (это никогда не должно происходить, но, черт возьми, это на веб-сайте документации AWS SNS). Если этого не произойдет, это означает, что вы получаете информацию для конечной точки. Он может быть либо в порядке (совпадение токенов, так и включено), либо наоборот (в этом случае вам нужно его обновить).

    - (void)getEndpointDetailsWithResponse:(void(^)(AWSSNSGetEndpointAttributesResponse *response, AWSTask *))handleResponse {
    NSString * deviceTokenForAWS = [self deviceTokenForAWS];
    AWSSNS *manager = [AWSSNS SNSForKey:@"EUWest1SNS"];

    AWSSNSGetEndpointAttributesInput *input = [AWSSNSGetEndpointAttributesInput new];
    input.endpointArn = self.endpointArn;
    AWSTask *getEndpointAttributesTask = [manager getEndpointAttributes:input];
    [getEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
        NSLog(@"%@ Error: %@", task.result, task.error);


        AWSSNSGetEndpointAttributesResponse *result = task.result;
        NSError *error = task.error;

        if (error.code == AWSSNSErrorNotFound) {
            [self createEndpointWithResponse:^(AWSSNSCreateEndpointResponse *createResponse) {


                dispatch_async(dispatch_get_main_queue(), ^{
                    if (handleResponse != nil) {
                        handleResponse(result, task);
                    }
                });
            }];
        } else {

            NSLog(@"response for get endpoint attributes : %@", result);

            NSString *token = [result.attributes valueForKey:@"Token"];
            NSString *enabled = [result.attributes valueForKey:@"Enabled"];
            NSLog(@"token : %@, enabled : %@", token, enabled);
            BOOL wasSuccessful = [token isEqualToString:deviceTokenForAWS] && ([enabled localizedCaseInsensitiveCompare:@"true"] == NSOrderedSame);

            if (!wasSuccessful) {
                NSLog(@"device token does not match the AWS token OR it is disabled!");
                NSLog(@"Need to update the endpoint");

                AWSSNSSetEndpointAttributesInput *seai = [AWSSNSSetEndpointAttributesInput new];
                seai.endpointArn = self.endpointArn;

            NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:deviceTokenForAWS, @"Token", @"true", @"Enabled", nil];
            seai.attributes = attributes;

                AWSTask *setEndpointAttributesTask = [manager setEndpointAttributes:seai];
                [setEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
                    NSLog(@"response : %@, error: %@", task.result, task.error);

                    dispatch_async(dispatch_get_main_queue(), ^{
                        if (handleResponse != nil) {
                            handleResponse(result, task);
                        }
                    });
                    return nil;
                }];

            } else {
                NSLog(@"all is good with the endpoint");

                dispatch_async(dispatch_get_main_queue(), ^{
                    if (handleResponse != nil) {
                        handleResponse(result, task);
                    }
                });
            }
        }
        return nil;
    }];
}

Это точная копия документации по управлению токенами SNS AWS, найденной здесь: https://mobile.awsblog.com/post/Tx223MJB0XKV9RU/Mobile-token-management-with-Amazon-SNS

Я могу приложить остальную часть моей реализации, если это необходимо, но эта часть является самой важной.