2015-06-26 20 views
16

Tôi đang cố gắng tích hợp Thông báo đẩy của Amazon vào ứng dụng iPhone của mình. Tôi đã làm theo hướng dẫn được cung cấp ở đây một cách chính xác.Lỗi tích hợp dịch vụ thông báo đẩy AWS

Tôi gặp phải lỗi này khi tạo Điểm cuối nền tảng. (Có vẻ là một vấn đề cho phép với hồ bơi sắc ???)

CognitoIdentityCredentials is not authorized to perform: SNS:CreatePlatformEndpoint 

Full nhắn:

Error: Error Domain=com.amazonaws.AWSSNSErrorDomain Code=4 "The operation couldn’t be completed. (com.amazonaws.AWSSNSErrorDomain error 4.)" UserInfo=0x165dcef0 {Type=Sender, Message=User: arn:aws:sts::290442422498:assumed-role/Cognito_Laugh_DevUnauth_Role/CognitoIdentityCredentials is not authorized to perform: SNS:CreatePlatformEndpoint on resource: arn:aws:sns:us-east-1:290442422498:app/APNS_SANDBOX/Laugh, __text=(
"\n ", 
"\n ", 
"\n ", 
"\n " 
), Code=AuthorizationError} 

AWSRegionType const CognitoRegionType = AWSRegionUSEast1; 
AWSRegionType const DefaultServiceRegionType = AWSRegionUSEast1; 
NSString *const CognitoIdentityPoolId = @"us-east-1:0.................."; 
NSString *const SNSPlatformApplicationArn = @"arn:aws:sns:us-east-1:................"; 
NSString *const MobileAnalyticsAppId = @"YourMobileAnalyticsAppId"; 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // Sets up the AWS Mobile SDK for iOS 
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:CognitoRegionType identityPoolId:CognitoIdentityPoolId]; 

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

AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = defaultServiceConfiguration; 
} 


- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{ 

NSString *deviceTokenString = [[[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""]; 

NSLog(@"deviceTokenString: %@", deviceTokenString); 
[[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:@"deviceToken"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

AWSSNS *sns = [AWSSNS defaultSNS]; 
AWSSNSCreatePlatformEndpointInput *request = [AWSSNSCreatePlatformEndpointInput new]; 
request.token = deviceTokenString; 
request.platformApplicationArn = SNSPlatformApplicationArn; 

NSLog(@"SNSPlatformApplicationArn %@", SNSPlatformApplicationArn); 

[[sns createPlatformEndpoint:request] continueWithBlock:^id(BFTask *task) { 
    if (task.error != nil) { 
     NSLog(@"Error: %@",task.error); 
    } else { 
     AWSSNSCreateEndpointResponse *createEndPointResponse = task.result; 
     NSLog(@"endpointArn: %@",createEndPointResponse); 
     [[NSUserDefaults standardUserDefaults] setObject:createEndPointResponse.endpointArn forKey:@"endpointArn"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
     //[self.window.rootViewController.childViewControllers.firstObject performSelectorOnMainThread:@selector(displayDeviceInfo) withObject:nil waitUntilDone:NO]; 

    } 

    return nil; 
}]; 

}

+0

Bạn có chắc chắn bạn có thể sử dụng "SNSPlatformApplicationArn'" không đổi? Khi tôi xem mô tả cho ['platformApplicationArn'] (http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSSNSCreatePlatformEndpointInput.html#//api/name/platformApplicationArn), nó nói" PlatformApplicationArn được trả về từ CreatePlatformApplication được sử dụng để tạo một điểm cuối. " –

Trả lời

15

Vấn đề là trong các cấu hình AWS SNS . Chúng tôi cần phải thêm "SNS: CreatePlatformEndpoint" vào chính sách cho cả vai trò Auth và Unauth

+0

Bạn có nhớ chi tiết một chút về cách bạn giải quyết vấn đề này không? Tôi giả sử bạn có nghĩa là bạn đã khắc phục điều này trong bảng điều khiển IAM bằng cách đính kèm chính sách tùy chỉnh vào vai trò unauth cognito và chính sách phải được tạo theo cách thủ công bằng cách sử dụng SNS: CreatePlatformEndpoint như được mô tả trong http: //docs.aws.amazon .com/sns/latest/dg/AccessPolicyLanguage_SpecialInfo.html? Tôi đang gặp khó khăn trong việc tìm kiếm tài liệu phong nha về việc làm như vậy, nhưng được cấp một chút về các chính sách IAM nói chung. Vì bạn đã nói rằng bạn đã sửa nó trong cấu hình SNS, tôi chỉ tò mò nếu có cách thêm nhanh hơn chính sách cần thiết. – JHH

+0

Bạn cũng cần thêm các ARN tài nguyên trong chính sách. – phatmann

+2

Cảm ơn! Đã sửa nó, chỉ cần vào IAM Management Console và tìm kiếm chính sách thích hợp và thêm SNS: CreatePlatformEndpoint. –

9

Bạn có thể thêm AmazonSNSFullAccess dưới Roles ->attach policy.

+0

Cảm ơn! Nó hoạt động –

Các vấn đề liên quan