2017-03-16 114 views
0

我在基於swift的iOS應用程序中實現AWS Cognito登錄,但不會觸發委託方法didCompleteStepWithErrorAWS Cognito iOS登錄委託方法`didCompleteStepWithError`不叫

CognitoLoginViewController

class CognitoLoginViewController: UIViewController, AWSCognitoIdentityPasswordAuthentication { 

    @IBOutlet weak var txtEmail: UITextField! 
    @IBOutlet weak var txtPassword: UITextField! 

    var user: AWSCognitoIdentityUser? 
    var pool: AWSCognitoIdentityUserPool? 
    var passwordAuthenticationCompletion: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 

    } 

    //MARK: - IBAction 
    @IBAction func login(_ sender: Any) { 
     if ((self.txtEmail.text?.isEmpty)! || (self.txtPassword.text?.isEmpty)!) { 
      let alertController = UIAlertController(title: "Missing information", 
                message: "Please enter a valid user name and password", 
                preferredStyle: .alert) 
      let retryAction = UIAlertAction(title: "Retry", style: .default, handler: nil) 
      alertController.addAction(retryAction) 
      self.navigationController?.present(alertController, animated: true, completion: nil) 
     } else { 
      let authDetails = AWSCognitoIdentityPasswordAuthenticationDetails(username: self.txtEmail.text!, password: self.txtPassword.text!) 
      self.passwordAuthenticationCompletion?.set(result: authDetails) 
     } 
    } 

    @IBAction func signup(_ sender: Any) { 
     let vc = CognitoSignUpViewController(nibName: "CognitoSignUpViewController", bundle: nil) 
     navigationController?.pushViewController(vc, animated: true) 
    } 

    @IBAction func forgotPassword(_ sender: Any) { 
     let vc = CognitoForgotPasswordViewController(nibName: "CognitoForgotPasswordViewController", bundle: nil) 
     navigationController?.pushViewController(vc, animated: true) 
    } 


    //MARK: - AWSCognitoIdentityPasswordAuthentication delegate methods 
    public func getDetails(_ authenticationInput: AWSCognitoIdentityPasswordAuthenticationInput, passwordAuthenticationCompletionSource: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>) { 
     self.passwordAuthenticationCompletion = passwordAuthenticationCompletionSource 
    } 

    public func didCompleteStepWithError(_ error: Error?) { 
     DispatchQueue.main.async { 
      if let error = error as? NSError { 
       let alertController = UIAlertController(title: error.userInfo["__type"] as? String, 
                 message: error.userInfo["message"] as? String, 
                 preferredStyle: .alert) 
       let retryAction = UIAlertAction(title: "Retry", style: .default, handler: nil) 
       alertController.addAction(retryAction) 

       self.present(alertController, animated: true, completion: nil) 
      } else { 
       self.txtEmail.text = nil 
       //self.dismiss(animated: true, completion: nil) 
      } 
     } 
    } 
} 

按一下按鈕,並觸發以下行來執行。

let authDetails = AWSCognitoIdentityPasswordAuthenticationDetails(username: self.txtEmail.text!, password: self.txtPassword.text!) 
self.passwordAuthenticationCompletion?.set(result: authDetails) 

的AppDelegate

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    var rootNavigationController : UINavigationController? 
    var loginViewController: CognitoLoginViewController? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 
     navigationInit() 
     awsCognitoInit() 
     return true 
    } 

    func application(_ application: UIApplication, 
        open url: URL, sourceApplication: String?, annotation: Any) -> Bool { 
     return true 
    } 

    func awsCognitoInit(){ 
     let credentialsProvider = AWSCognitoCredentialsProvider(regionType: CognitoIdentityUserPoolRegion, 
                   identityPoolId: CognitoIdentityUserPoolId) 
     let serviceConfiguration = AWSServiceConfiguration(region: .USEast1, 
                  credentialsProvider: credentialsProvider) 
     let poolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: CognitoIdentityUserPoolAppClientId, 
                     clientSecret: CognitoIdentityUserPoolAppClientSecret, 
                     poolId: CognitoIdentityUserPoolId) 
     AWSLogger.default().logLevel = .verbose 
     AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration 
     AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: poolConfiguration, forKey: AWSCognitoUserPoolsSignInProviderKey) 
    } 

    func navigationInit() { 
     self.rootNavigationController = UINavigationController() 
     let loginViewController = LoginViewController() 
     self.rootNavigationController!.pushViewController(loginViewController, animated: false) 

     self.window = UIWindow(frame: UIScreen.main.bounds) 
     self.window!.rootViewController = rootNavigationController 
     self.window!.makeKeyAndVisible() 
    } 

    //MARK: - 
    func applicationWillResignActive(_ application: UIApplication) { 
     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
     // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 
    } 

    func applicationDidEnterBackground(_ application: UIApplication) { 
     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    } 

    func applicationWillEnterForeground(_ application: UIApplication) { 
     // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 
    } 

    func applicationDidBecomeActive(_ application: UIApplication) { 
     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    } 

    func applicationWillTerminate(_ application: UIApplication) { 
     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
     // Saves changes in the application's managed object context before the application terminates. 
     self.saveContext() 
    }  
} 

不過,我能夠使用註冊,忘記密碼和代碼確認成功。由於上述其他操作正常工作,認知配置值也是正確的。

回答

1

您確定getDetails實際上是否被設置爲passwordAuthenticationCompletion對象?通常情況下,要觸發驗證流程開始,您需要執行類似userPool.currentUser().getSession()的操作,必要時將調用getDetails,或者如果已經緩存了活動會話或refreshToken,請使用該格式。

+0

你說得對,'getDetails'沒有被調用。我試圖在視圖控制器的viewDidLoad中調用'userPool.currentUser()。getSession()',但這也不會觸發'getDetails'調用。我是否將'getSession'調用放在正確的位置。 –

+0

您是否已將用戶池上的委託設置爲實現AWSCognitoIdentityInteractiveAuthenticationDelegate的類? pool.delegate = ... – behrooziAWS

+0

我想通了,並修復它,現在工作。 –