Аутентификация AWS Cognito завершается сбоем на iOS 13.1.2 - PullRequest
0 голосов
/ 18 октября 2019

Мы используем AWS Cognito для аутентификации в нашем мобильном приложении для iOS, разработанном с использованием Swift 5. В настоящее время мы начали создавать наш код с использованием XCode 11 для поддержки iOS 13. Мы используем aws-ios-sdk с нашим кодом Swift. Используемая версия зависимости модуля модуля AWSCognitoIdentiyProvider - 2.12.0.

. Мы наблюдаем сбой (на iPhone X / XR / XSMax с iOS 13.1.2) при создании экземпляра контроллера навигации. Этот сбой происходит, если код выполняется в фоновом потоке. Однако, если один и тот же код выполняется в главном потоке, он работает отлично. У кода не происходит сбоев на версиях старше iOS13 или на iphone 6 и iphone 7 (даже с iOS 13.1.2).

Однако на iPhone X и выше (с iOS 13.1.2) кодИзвестно, что много раз сбой и работает очень ненадежно.

Наш код для аутентификации выглядит следующим образом (в AppDelegate.Swift):

func startPasswordAuthentication() -> AWSCognitoIdentityPasswordAuthentication {


    if (self.navigationController == nil) {

        // Instantiate navigationController
        //Crashes on the following line 

        self.navigationController = self.storyboard?.instantiateViewController(withIdentifier: "signinController") as? UINavigationController
    }

    if (self.signInViewController == nil) {
        self.signInViewController = self.navigationController?.viewControllers[0] as? DFLoginViewController
    }


    DispatchQueue.main.async {
        // present Root view  Controller
        self.navigationController!.popToRootViewController(animated: true)
        if (!self.navigationController!.isViewLoaded
        || self.navigationController!.view.window == nil) {
            self.window?.rootViewController?.present(self.navigationController!,
            animated: true,
            completion: nil)
        }
    }

    return signInViewController!

}

Мы пытались исправить, используя следующее:

  1. DispatchGroup Приведенный ниже код сгенерировал нарушение сегментации на этапе компиляции.

    let group = DispatchGroup()
    group.enter()
    
    DispatchQueue.main.async {
        // instantiate Navigation Controller
        // present Root view  Controller
        group.leave()
    }
    
    
    group.notify(queue: .main) {
        return signInViewController!
    }
    
  2. Написал startPasswordAuthentication (), используя обработчик завершения для возврата обратно signInController.
    Метод startPasswordAuthentication вообще не вызывался, возможно, из-за несоответствующей сигнатуры.

    
    func startPasswordAuthentication(completion: @escaping (AWSCognitoIdentityPasswordAuthentication?) -> Void) {
        DispatchQueue.main.async { [weak self] in
          guard let strongSelf = self else {
            completion(nil)
            return
          }
         if (self!.navigationController == nil) {
            self!.navigationController = self!.storyboard?.instantiateViewController(withIdentifier: "signinController") as? UINavigationController
          }
          self!.window?.rootViewController?.present((self?.navigationController!)!, animated: true, completion: {
          if strongSelf == nil {
            strongSelf.signInViewController = self!.navigationController?.viewControllers[0] as? DFLoginViewController
          }
                completion(strongSelf.signInViewController)
        })
        }
    }
    
...