2016-11-09 104 views
2

我使用的是Swift 3和Xcode 8.1,我使用Amazon Cognito iOS SDK和Facebook SDK一起提供用户身份验证。如何在Swift 3中正确使用Amazon Cognito iOS SDK?

我在使用最新的Amazon Cognito SDK(2.4.11)时遇到了很多问题。 主要问题是:

  • 警告 “登录已经过时:使用AWSIdentityProviderManager”。这里有一个workaround,但我想有一个正常的,亚马逊官方的方式来做到这一点。 尽管如此,Amazon official docs似乎是6个月大,并介绍了如何使用旧SDK(请参阅“iOS - Swift”部分)
  • 每当我尝试检索当前用户cognitoId - 我得到一个新的。我使用语法credentialsProvider.getIdentityId().continue。但我期望得到一个旧的。 UPD:在这种情况下,我没有使用FB进行身份验证。

我真的很感谢官方的Amazon SDK开发者在这里评论。 我觉得非常令人沮丧的是,我不得不在互联网上寻找一个解决方案后追捕,也不能仅仅关注官方的亚马逊文档,因为它已经过时了。

回答

0

是在最新的SDK 登录财产得到弃用,因此我们需要通过AWSIdentityProviderManager委托分配IdentityProvider登录。所以做如下,

  1. 创建一个采用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) 
    } 
    
    } 
    
  2. 在所需的视图控制器中添加以下代码。在您的视图控制器

    @IBAction func loginButtonPressed(_ sender: UIButton) { 
    if (phoneNumberTextField.text != nil) && (passwordTextField.text != nil) { 
        // Change userName.getSession.... with your Facebook method to get authenticate from Facebook, in success block add what I added in my success block. 
        userName.getSession(phoneNumberTextField.text!, password: passwordTextField.text!, validationData: nil).continue(with: AWSExecutor.mainThread(), withSuccessBlock: { (task: AWSTask<AWSCognitoIdentityUserSession>) -> Any? in // Your Facebook call will go here 
    
         if task.error != nil { 
          // Error 
         } else { 
          // SUCCESS BLOCK 
          self.updateCredentials() 
         } 
         return nil 
        }) 
    } else { 
        // Credential empty 
    } 
    } 
    
        func updateCredentials() { 
         let customcedentialProvider = DVCustomIdentityProvider(tokens: ["graph.facebook.com" : token])) 
         let credentialsProvider = AWSCognitoCredentialsProvider(regionType: "Your region", identityPoolId: "Your pool id", unauthRoleArn: "Your unearth role name", authRoleArn: "Your auth role name", identityProviderManager: customcedentialProvider) 
         let configuration = AWSServiceConfiguration(region: "Your region", credentialsProvider:credentialsProvider) 
         AWSServiceManager.default().defaultServiceConfiguration = configuration 
         credentialsProvider.getIdentityId().continue(with: AWSExecutor.mainThread(), withSuccessBlock: { (taskTask: AWSTask<NSString>) -> Any? in 
         if taskTask.error == nil && taskTask.exception == nil { 
          kUserIdentityID = taskTask.result as String? // Im saving user identity id in constant variable called "kUserIdentityID" 
    
         } else { 
          // Do Nothing 
         } 
         return nil 
        }) 
        } 
    

进口下列

import AWSCognitoIdentityProvider 
import AWSCore 
import AWSCognito 

注:此代码是写在迅速3

1

我会建议对以下是上述建议的推动模式并切换到拉范例。 AWSIdentityProviderManager的用途是仅在SDK需要时才提示您输入令牌,而不是让您在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登录工作w斯威夫特这里没有提到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]) 
    }