2016-11-09 87 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]) 
    }