В Cognito на iOS обработка нового требуемого пароля никогда не достигает didCompleteNewPasswordStepWithError - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь реализовать функциональность для ответа на FORCE_CHANGE_PASSWORD в моем iOS приложении, которое использует AWS Cognito. Я использовал этот вопрос переполнения стека , который ссылается на этот пример кода . Прямо сейчас мой код открывает контроллер представления, как это должно быть; однако, однажды на этом контроллере представления я не могу заставить его что-либо делать. В примере кода кажется, что когда вы хотите отправить запрос на изменение пароля, вы вызываете .set в экземпляре AWSTaskCompletionSource<AWSCognitoIdentityNewPasswordRequiredDetails>, но когда я это делаю, функция протокола didCompleteNewPasswordStepWithError никогда не вызывается. Интересно, что другая функция протокола getNewPasswordDetails вызывается быстро после viewDidLoad, и я не могу сказать, почему. Я считаю, что это не следует вызывать до тех пор, пока пользователь не введет свой новый пароль, например, c и не должен отвечать на .set, но я могу ошибаться.

Мой код довольно идентичен примеру код и этот пост, так что я не уверен, что здесь происходит не так.

Мой соответствующий код AppDelegate здесь:

extension AppDelegate: AWSCognitoIdentityInteractiveAuthenticationDelegate {

    func startNewPasswordRequired() -> AWSCognitoIdentityNewPasswordRequired {

        //assume we are presenting from login vc cuz where else would we be presenting that from
        DispatchQueue.main.async {
            let presentVC = UIApplication.shared.keyWindow?.visibleViewController
            TransitionHelperFunctions.presentResetPasswordViewController(viewController: presentVC!)
            print(1)
        }

        var vcToReturn: ResetPasswordViewController?
        returnVC { (vc) in
            vcToReturn = vc
            print(2)
        }
        print(3)
        return vcToReturn!

    }

    //put this into its own func so we can call it on main thread
    func returnVC(completion: @escaping (ResetPasswordViewController) -> () ) {

        DispatchQueue.main.sync {
            let storyboard = UIStoryboard(name: "ResetPassword", bundle: nil)
            let resetVC = storyboard.instantiateViewController(withIdentifier: "ResetPasswordViewController") as? ResetPasswordViewController
            completion(resetVC!)
        }

    }
}

Мой соответствующий код ResetPasswordViewController здесь:


class ResetPasswordViewController: UIViewController, UITextFieldDelegate {

    @IBAction func resetButtonPressed(_ sender: Any) {

        var userAttributes: [String:String] = [:]
        userAttributes["given_name"] = firstNameField.text!
        userAttributes["family_name"] = lastNameField.text!

        let details = AWSCognitoIdentityNewPasswordRequiredDetails(proposedPassword: self.passwordTextField.text!, userAttributes: userAttributes)
        self.newPasswordCompletion?.set(result: details)

    }

}

extension ResetPasswordViewController: AWSCognitoIdentityNewPasswordRequired {

    func getNewPasswordDetails(_ newPasswordRequiredInput: AWSCognitoIdentityNewPasswordRequiredInput, newPasswordRequiredCompletionSource: AWSTaskCompletionSource<AWSCognitoIdentityNewPasswordRequiredDetails>) {

        self.newPasswordCompletion = newPasswordRequiredCompletionSource

    }

    func didCompleteNewPasswordStepWithError(_ error: Error?) {
        DispatchQueue.main.async {
            if let error = error as? NSError {
                print("error")
                print(error)
            } else {
                // Handle success, in my case simply dismiss the view controller
                SCLAlertViewHelperFunctions.displaySuccessAlertView(timeoutValue: 5.0, title: "Success", subTitle: "You can now login with your new passowrd", colorStyle: Constants.UIntColors.emeraldColor, colorTextButton: Constants.UIntColors.whiteColor)

                self.dismiss(animated: true, completion: nil)
            }
        }
    }

}

Большое спасибо за вашу помощь заранее и дайте мне знать, если вам нужна дополнительная информация.

...