2015-06-26 11 views
16

Ich versuche, Amazon Push-Benachrichtigungen in meine iPhone App zu integrieren. Ich habe das hier bereitgestellte Tutorial richtig befolgt.AWS Push-Benachrichtigungsdienst Integrationsfehler

Ich erhalte diesen Fehler beim Erstellen der Plattform EndPoint. (Scheint ein Berechtigungsproblem mit Identität Pool ???)

CognitoIdentityCredentials is not authorized to perform: SNS:CreatePlatformEndpoint 

Voll Nachricht:

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} 

-Code

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

Sind Sie sicher, dass Sie die Konstante "' SNSPlatformApplicationArn' "verwenden können? Wenn ich die Beschreibung für ['platformApplicationArn'] (http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSSNSCreatePlatformEndpointInput.html#//api/name/platformApplicationArn) ansehe, steht" PlatformApplicationArn "von" PlatformApplicationArn "zurück CreatePlatformApplication wird verwendet, um einen Endpunkt zu erstellen. " –

Antwort

15

Das Problem war in den AWS SNS-Konfigurationen . Wir müssen hinzufügen: für beide Auth und unauth Rollen

+0

Würde es Ihnen etwas ausmachen, ein bisschen zu detaillieren, wie Sie das gelöst haben? Ich nehme an, Sie meinen, dass Sie dies in der IAM-Konsole behoben haben, indem Sie eine benutzerdefinierte Richtlinie an die Rolle cognito unauth angehängt haben und dass die Richtlinie mit der Aktion sns: CreatePlatformEndpoint wie in http: //docs.aws.amazon beschrieben manuell generiert werden musste .com/sns/neueste/dg/AccessPolicyLanguage_SpecialInfo.html? Ich habe Probleme dabei, eine anständige Dokumentation zu finden, aber mir ist klar, dass ich bei den IAM-Richtlinien im Allgemeinen etwas eingerostet bin. Da Sie gesagt haben, dass Sie es in der SNS-Konfiguration behoben haben, war ich nur neugierig, ob es eine schnellere Möglichkeit zum Hinzufügen der erforderlichen Richtlinie gab. – JHH

+0

Sie müssen auch die Ressourcen-ARNs in der Richtlinie hinzufügen. – phatmann

+2

Danke! Auch das Problem wurde behoben, musste nur in die IAM Management Console gehen und nach der richtigen Richtlinie suchen und SNS: CreatePlatformEndpoint hinzufügen. –

9

Sie hinzufügen können AmazonSNSFullAccess unter Roles „SNS CreatePlatformEndpoint“ an die Politik ->attach policy.

+0

Danke! Es klappt –

Verwandte Themen