AMAZON AWS ​​Как подписать конечную точку на тему SNS?

Я реализую push-уведомления в приложении для iOS с помощью сервисов Amazon SNS и Amazon Cognito. Cognito успешно сохраняет токены, мое приложение получает уведомление, все работает хорошо, но есть кое-что.

Теперь, когда я все еще в разработке, мне нужно вручную добавить конечные точки в тему SNS, чтобы все подписчики могли получать уведомления. Когда я выложу обновление в App Store, нужно будет добавить тысячи токенов.

Я изучал документацию Amazon AWS, но понятия не имел, можно ли это сделать без дополнительных усилий.

Мой вопрос: возможно ли автоматически подписать конечную точку на тему с помощью только сервисов Amazon?


person cyborg86pl    schedule 17.11.2014    source источник
comment
Можете немного уточнить? Что вы имеете в виду под услугами только Amazon? Вы пытаетесь автоматизировать подписку на тему и использовать Cognito в качестве учетных данных для этого?   -  person Jeff Bailey    schedule 18.11.2014
comment
@JeffBailey спасибо за ваши вопросы. Я уже разобрался, но не успел ответить самому. Я хотел автоматизировать подписку, но я не знал, что мое приложение iOS отвечает за подписку конечной точки на тему, я думал, что это возможно через консоль Amazon AWS после вызова когнито для сохранения токена.   -  person cyborg86pl    schedule 18.11.2014
comment
но не успел ответить. так вы не собираетесь делиться тем ответом, который придумали? Это ужасно после того, как другие пришли на помощь. Будьте хорошим гражданином SO и поделитесь своим решением.   -  person user3344977    schedule 28.03.2016


Ответы (3)


Невозможно автоматически подписать конечную точку на тему, но вы можете выполнить все с помощью кода.

Вы можете напрямую вызвать Subscribe API после создания конечной точки. В отличие от других видов подписки, для SNS Mobile Push подтверждения не требуется.

Вот пример кода Objective-C, который создает конечную точку и подписывает ее на тему:

AWSSNS *sns = [AWSSNS defaultSNS];
AWSSNSCreatePlatformEndpointInput *endpointRequest = [AWSSNSCreatePlatformEndpointInput new];
endpointRequest.platformApplicationArn = MY_PLATFORM_ARN;
endpointRequest.token = MY_TOKEN;

[[[sns createPlatformEndpoint:endpointRequest] continueWithSuccessBlock:^id(AWSTask *task) {
    AWSSNSCreateEndpointResponse *response = task.result;

    AWSSNSSubscribeInput *subscribeRequest = [AWSSNSSubscribeInput new];
    subscribeRequest.endpoint = response.endpointArn;
    subscribeRequest.protocols = @"application";
    subscribeRequest.topicArn = MY_TOPIC_ARN;
    return [sns subscribe:subscribeRequest];
}] continueWithBlock:^id(BFTask *task) {
    if (task.cancelled) {
        NSLog(@"Task cancelled");
    }
    else if (task.error) {
        NSLog(@"Error occurred: [%@]", task.error);
    }
    else {
        NSLog(@"Success");
    }
    return nil;
}];

Убедитесь, что вы предоставили доступ к sns:Subscribe в ваших ролях Cognito, чтобы ваше приложение могло выполнять этот вызов.

Обновление 2015-07-08: обновлено с учетом AWS iOS SDK 2.2.0+

person Bob Kinney    schedule 18.11.2014
comment
Я разобрался сам, и это правильный (и единственный?) Путь. В любом случае, спасибо, ваш ответ может быть полезен кому-то еще в будущем. - person cyborg86pl; 18.11.2014
comment
@ cyborg86pl Можно подписаться через консоль, но это скорее ручной процесс. - person Bob Kinney; 18.11.2014
comment
Боб, расскажите, пожалуйста, почему количество моих подписок остановилось на 2000, а количество конечных точек приложений все еще растет? Я знаю, что количество тем ограничено 10 МБ, так в чем проблема? - person cyborg86pl; 22.11.2014
comment
@ cyborg86pl Если вы просматриваете в консоли, консоль показывает только ограничение в 2000 подписок. Если вам нужно увидеть все подписки, вам нужно будет использовать необработанные API. - person Bob Kinney; 23.11.2014
comment
Хорошо, спасибо, не о чем беспокоиться. Было бы здорово, если бы Amazon давал подсказку, как я сейчас вижу на вкладке «Подписки» с лимитом 10100. - person cyborg86pl; 23.11.2014
comment
Похоже, AWSSNSSubscribeInput protocol изменился на protocols. - person Ben; 10.06.2015
comment
@BobKinney извините за беспокойство. AWS кое-что изменил. И этот код не работает. У меня такая же проблема stackoverflow.com/questions/31286823/, и я совершенно не понимаю, как подписаться на тему SNS из моего приложения для iOS .. . - person user3742622; 08.07.2015
comment
@ user3742622 вопрос, на который вы указали, похоже, совсем не связан с этим. Не могли бы вы дать ссылку на соответствующий вопрос или рассказать, с какой проблемой вы столкнулись? - person Bob Kinney; 09.07.2015
comment
@BobKinney Спасибо за ответ, ты моя последняя надежда. Извините за ссылку, правая эта stackoverflow.com/questions/31300136/ У меня проблема с вашим кодом. У меня две ошибки: 1. Отправка несовместимых типов указателей блоков ' id (^) (BFTask * __ strong) 'в параметр типа' AWSContinuationBlock 'и 2. Типы несовместимых указателей, отправляющие' AWSSNSCreatePlatformEndpointInput * 'параметру типа' AWSSNSCreatePlatformApplicationInput * 'Когда я пытаюсь исправить это своим способом, это не работает, я получить Error occurred: [Error D... - person user3742622; 09.07.2015
comment
@ user3742622 Первая ошибка будет означать, что вы не используете последнюю версию SDK (в версии 2.2.x мы переключили BFTask на AWSTask). Вторая - это опечатка, которую я исправлю. - person Bob Kinney; 09.07.2015
comment
@BobKinney Я изменил continueWithBlock:^id(AWSTask *task) на AWSTask, и ошибка исчезла. Но я не понимаю насчет `несовместимых типов указателей, отправляющих AWSSNSCreatePlatformEndpointInput * параметру типа AWSSNSCreatePlatformApplicationInput * ... Вы сказали о последней версии SDK, но я уже использую AWS SDK 2.2. Я написал о своей ошибке в теме о том, что не дублируется. - person user3742622; 09.07.2015
comment
Этот код просто не работает для меня. Во-первых, последний SDK задыхается от BFTask *task в continueWithBlock. Переключение на AWSTask помогает, но моя подписка по-прежнему не работает, а task.error = 0. Есть ли другие обновления в последней версии SDK (я полагаю, 2.4.11), которые могут повлиять на это? - person Axeva; 25.10.2016
comment
@BobKinney, как я могу отказаться от подписки и подписаться на конечную точку с помощью кнопки включения / выключения? У меня есть параметры настроек, включение / выключение push-уведомлений на странице настроек - person karthikeyan; 27.02.2017

Это исходный код для подписки конечной точки на тему в Swift3

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    //Get Token ENDPOINT
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    //Create SNS Module
    let sns = AWSSNS.default()
    let request = AWSSNSCreatePlatformEndpointInput()
    request?.token = deviceTokenString

    //Send Request
    request?.platformApplicationArn = Constants.SNSDEVApplicationARN

    sns.createPlatformEndpoint(request!).continue({ (task: AWSTask!) -> AnyObject! in
        if task.error != nil {
            print("Error: \(task.error)")
        } else {

            let createEndpointResponse = task.result! as AWSSNSCreateEndpointResponse
            print("endpointArn: \(createEndpointResponse.endpointArn)")

            let subscription = Constants.SNSEndPoint //Use your own topic endpoint

            //Create Subscription request
            let subscriptionRequest = AWSSNSSubscribeInput()


              subscriptionRequest?.protocols = "application"
                subscriptionRequest?.topicArn = subscription
                subscriptionRequest?.endpoint = createEndpointResponse.endpointArn

                sns.subscribe(subscriptionRequest!).continue ({
                    (task:AWSTask) -> AnyObject! in
                    if task.error != nil
                    {
                        print("Error subscribing: \(task.error)")
                        return nil
                    }

                    print("Subscribed succesfully")

                   //Confirm subscription
                    let subscriptionConfirmInput = AWSSNSConfirmSubscriptionInput()
                    subscriptionConfirmInput?.token = createEndpointResponse.endpointArn
                    subscriptionConfirmInput?.topicArn = subscription
                    sns.confirmSubscription(subscriptionConfirmInput!).continue ({
                        (task:AWSTask) -> AnyObject! in
                        if task.error != nil
                        {
                            print("Error subscribing: \(task.error)")
                        }
                        return nil
                    })
                    return nil

                })

            }
            return nil

        })
    }
person Allreadyhome    schedule 11.11.2016

Если вы хотите использовать статические учетные данные вместо использования AWSCognito, вам нужно будет создать их через консоль Amazons IAM.

Вот код для инициализации Amazon в вашем делегате приложения.

    // Sets up the AWS Mobile SDK for iOS
    // Initialize the Amazon credentials provider
    AWSStaticCredentialsProvider *credentialsProvider =[[AWSStaticCredentialsProvider alloc] initWithAccessKey:AWSAccessID secretKey:AWSSecretKey];

    AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:DefaultServiceRegionType credentialsProvider:credentialsProvider];

    [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

Fissh

person gadildafissh    schedule 23.04.2015
comment
Не уверен, что это хорошая идея, AWS SDK указывает не использовать AWSStaticCredentialsProvider в производственной среде: We strongly discourage embedding AWS credentials in your production apps because they can be easily extracted and abused. Consider using 'AWSCognitoCredentialsProvider' - person Ben; 10.06.2015
comment
Полностью согласен, Попей, я должен был упомянуть предупреждение. - person gadildafissh; 20.06.2015
comment
Что ж, это основное соображение при применении любого из сервисов AWS и, конечно же, не ответ на вопрос выше. - person Mohsin Khubaib Ahmed; 22.06.2016