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