Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift 3中正确使用Amazon Cognito iOS SDK?_Ios_Swift3_Xcode8_Amazon Cognito - Fatal编程技术网

如何在Swift 3中正确使用Amazon Cognito iOS SDK?

如何在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”部分) 每当我试图检索当前

我正在使用Swift 3和Xcode 8.1,我正在使用Amazon Cognito iOS SDK和Facebook SDK来提供用户身份验证

在使用最新的AmazonCognitoSDK(2.4.11)时,我面临许多问题。 主要问题是:

  • 警告“不推荐登录:使用AWSideEntityProviderManager”。这里有一个,但我希望有一个正常的,正式的亚马逊方式来做这件事。 尽管如此,似乎已经6个月了,并且描述了如何使用旧的SDK(请参阅“iOS-Swift”部分)
  • 每当我试图检索当前用户cognitoId时,我都会得到一个新的。我使用语法
    credentialsProvider.getIdentityId()。是否继续
    。但我想买一个旧的UPD:在这种情况下,我没有通过FB的身份验证
我非常感谢亚马逊SDK开发者在这里发表官方评论。
我感到非常沮丧的是,我不得不在互联网上寻找解决方案,而不能仅仅遵循亚马逊的官方文档,因为它已经过时了。

是的,在最新的SDK中,登录属性被弃用,因此,我们需要使用AWSIdentityProviderManager委托将IdentityProvider分配给登录名。我们也要这样做:

  • 创建一个采用AWSIdentityProviderManager委托的自定义类

    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])
        }