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