在iOS 8中使用AWSSDK V2,完成了示例代码库和设置 cognito可以正确访问我的S3Bucket。以下示例
https://github.com/awslabs/aws-sdk-ios-samples/tree/master/S3BackgroundTransfer-Sample/Objective-C
当我尝试上传时,我收到此错误
Error: Error Domain=com.amazonaws.AWSS3PresignedURLErrorDomain Code=1
"accessKey in credentialProvider can not be nil" UserInfo=0x7d905610
{NSLocalizedDescription=accessKey in credentialProvider can not be nil}
我确保cognito poold id使用的角色可以根据我为其创建的策略访问我的s3存储桶。可能是什么问题?
Agfter sebastians commnent,我回去确认我正在使用未经身份验证的用户,其角色可以访问我的s3bucket,然后查看他对Cognito异步及其初始化的最后评论。我在这个方法中这样做
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AWSCognitoCredentialsProvider *credentialsProvider = [AWSCognitoCredentialsProvider credentialsWithRegionType:CognitoRegionType
identityPoolId:CognitoIdentityPoolId];
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:DefaultServiceRegionType
credentialsProvider:credentialsProvider];
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;
// Override point for customization after application launch.
return YES;
}
现在在破线时
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;
并在调试器中检查credentialsProvider的属性,它确实有很多nil属性!!
credentialsProvider AWSCognitoCredentialsProvider * 0x7886a0d0 0x7886a0d0
NSObject NSObject
_useEnhancedFlow BOOL YES '\x01'
_identityId NSString * nil 0x00000000
_accessKey NSString * nil 0x00000000
_secretKey NSString * nil 0x00000000
_sessionKey NSString * nil 0x00000000
_expiration NSDate * nil 0x00000000
我确实创建了实体池并在我的代码中嵌入了ID,我应该在这里查找什么?
答案 0 :(得分:1)
我有完全相同的问题,但上面的答案也没有帮助我。
<强>更改强>
let CognitoRegionType = AWSRegionType.Unknown
let DefaultServiceRegionType = AWSRegionType.Unknown
要强>
let CognitoRegionType = AWSRegionType.EUWest1
let DefaultServiceRegionType = AWSRegionType.EUWest1
在 Constants.swift 中为我解决了这个问题。当然,这是在上面提到的示例应用程序的上下文中。
答案 1 :(得分:0)
从上面的错误看,您的CognitoCredentialsProvider看起来没有访问密钥/密钥。
将Cognito与经过身份验证的用户一起使用时,仅创建IdentityPool并创建AWSCognitoCredentialsProvider实例是不够的。
您必须编写代码来验证您的用户。目前,Cognito支持使用Amazon,Facebook,Google,任何通用OpenID Connect或您自己的后端进行用户身份验证。
从身份提供商处收到身份验证令牌后,您可以将其提供给Cognito(使用其.logins
属性),然后Cognito会将该令牌交换为有效的访问密钥和密钥。
您的Cognito Identity提供商似乎还没有访问密钥/密钥。您上面链接的示例是未经身份验证的用户的Cognito使用示例 - 可能对您的应用程序有效。根据您的使用情况而定。
另请注意,CognitoIdentitProvider类是异步的(与所有AWS iOS SDK类一样)。确保在Cognito完全初始化之前没有调用S3 Transfer Manager类。
为了更好地了解Cognito Identity,我邀请您阅读http://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html
答案 2 :(得分:0)
希望这有助于其他人,并且AWS确实需要更好地记录。