如何在Swift 3中正确使用Amazon Cognito iOS SDK?
我正在使用Swift 3和Xcode 8.1,我正在使用Amazon Cognito iOS SDK和Facebook SDK来提供用户身份验证 在使用最新的AmazonCognitoSDK(2.4.11)时,我面临许多问题。 主要问题是:如何在Swift 3中正确使用Amazon Cognito iOS SDK?,ios,swift3,xcode8,amazon-cognito,Ios,Swift3,Xcode8,Amazon Cognito,我正在使用Swift 3和Xcode 8.1,我正在使用Amazon Cognito iOS SDK和Facebook SDK来提供用户身份验证 在使用最新的AmazonCognitoSDK(2.4.11)时,我面临许多问题。 主要问题是: 警告“不推荐登录:使用AWSideEntityProviderManager”。这里有一个,但我希望有一个正常的,正式的亚马逊方式来做这件事。 尽管如此,似乎已经6个月了,并且描述了如何使用旧的SDK(请参阅“iOS-Swift”部分) 每当我试图检索当前
- 警告“不推荐登录:使用AWSideEntityProviderManager”。这里有一个,但我希望有一个正常的,正式的亚马逊方式来做这件事。 尽管如此,似乎已经6个月了,并且描述了如何使用旧的SDK(请参阅“iOS-Swift”部分)
- 每当我试图检索当前用户cognitoId时,我都会得到一个新的。我使用语法
。但我想买一个旧的UPD:在这种情况下,我没有通过FB的身份验证credentialsProvider.getIdentityId()。是否继续
我感到非常沮丧的是,我不得不在互联网上寻找解决方案,而不能仅仅遵循亚马逊的官方文档,因为它已经过时了。是的,在最新的SDK中,登录属性被弃用,因此,我们需要使用AWSIdentityProviderManager委托将IdentityProvider分配给登录名。我们也要这样做:
import UIKit
import AWSCognitoIdentityProvider
import AWSCore
import Foundation
class DVCustomIdentityProvider: NSObject, AWSIdentityProviderManager {
var tokens: NSDictionary = [String : String]() as NSDictionary
init(tokens: [String : String]) {
self.tokens = tokens as NSDictionary
}
func logins() -> AWSTask<NSDictionary> { // AWSIdentityProviderManager delegate method
return AWSTask(result: tokens)
}
}
注意:这段代码是用swift 3编写的,我建议不要遵循上面建议的推模式,而要切换到拉模式。AWSIdentityProviderManager的目的是仅在SDK需要令牌时提示您输入令牌,而不是让您定期在外部设置令牌,无论SDK是否需要令牌。这样,您就不必自己管理令牌到期,只要确保您的令牌在调用登录时有效,如果无效,您可以使用AWSCompletionSource获取新的令牌 假设您已集成Facebook登录,您的应用程序应该如下所示:
import Foundation
import AWSCore
import FacebookLogin
import FacebookCore
class FacebookProvider: NSObject, AWSIdentityProviderManager {
func logins() -> AWSTask<NSDictionary> {
if let token = AccessToken.current?.authenticationToken {
return AWSTask(result: [AWSIdentityProviderFacebook:token])
}
return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"]))
}
}
然后要测试获取凭据:
AWSServiceManager.default().defaultServiceConfiguration.credentialsProvider.credentials().continue(with: AWSExecutor.default(), with: { (task) -> Any? in
print(task.result ?? "nil")
return task
})
顺便说一句,我需要将此添加到我的应用程序代理中,以使Facebook登录与Swift一起工作,此处的说明中未提及:
import Foundation
import AWSCore
import FacebookLogin
import FacebookCore
class FacebookProvider: NSObject, AWSIdentityProviderManager {
func logins() -> AWSTask<NSDictionary> {
if let token = AccessToken.current?.authenticationToken {
return AWSTask(result: [AWSIdentityProviderFacebook:token])
}
return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"]))
}
}
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.YOUR_REGION, identityPoolId: "YOUR_IDENTITY_POOL_ID", identityProviderManager: FacebookProvider())
let configuration = AWSServiceConfiguration(region: AWSRegionType.usEast1, credentialsProvider: credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = configuration
AWSServiceManager.default().defaultServiceConfiguration.credentialsProvider.credentials().continue(with: AWSExecutor.default(), with: { (task) -> Any? in
print(task.result ?? "nil")
return task
})
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}