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

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

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

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

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

Ответ 1

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

Вы можете напрямую вызвать API Subscribe после создания конечной точки. В отличие от других видов подписки, в 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 +

Ответ 2

Это исходный код для подписки конечной точки на тему в 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

        })
    }

Ответ 3

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

Вот код для инициализации 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