Сбой аутентификации AWS Cognito из-за сбоя на iOS 13.1.2

Мы используем 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)
        })
        }
    }
    

0 ответов

Другие вопросы по тегам