我建议不要遵循上面建议的推式范式并切换到拉式范式。 AWSIdentityProviderManager 的目的是仅在 SDK 需要时提示您输入令牌,而不是让您定期在外部设置它是否 SDK 需要它。这样您就不必自己管理令牌过期,只需确保您的令牌在调用登录时有效,如果不是,您可以使用 AWSCompletionSource 来获取一个新的。
假设您已集成 Facebook 登录,您的 IdentityProviderManager 应如下所示:
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
})
顺便说一句,我需要将此添加到我的应用程序委托中,以使 Facebook 登录与 Swift 一起工作,这在 https://developers.facebook.com/docs/swift/login 的说明中未提及:
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])
}