Сбой аутентификации 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!
}
Мы пытались исправить, используя следующее:
DispatchGroup Приведенный ниже код сгенерировал нарушение сегментации на этапе компиляции.
let group = DispatchGroup() group.enter() DispatchQueue.main.async { // instantiate Navigation Controller // present Root view Controller group.leave() } group.notify(queue: .main) { return signInViewController! }
Написал 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) }) } }