iOS: Touch Id не отображается при вызове открытого URL-адреса AppDelegate
Мое приложение поддерживает открытие документов, таких как изображения, PDF-файлы из других приложений. Идентификатор Tocuh реализован, как показано ниже, он запрашивается, когда приложение выходит на передний план
NotificationCenter.default.addObserver(forName: .UIApplicationWillEnterForeground, object: nil, queue: .main) { (notification) in
LAContext().evaluatePolicy( .deviceOwnerAuthenticationWithBiometrics, localizedReason: "Request Touch ID", reply: { [unowned self] (success, error) -> Void in
if (success) {
} else {
}
})
Теперь запрос на Touch Id работает нормально, когда пользователь открывает приложение из Фона или перезапускается. Эта проблема возникает, когда приложение открывается из другого приложения, например нажатия на URL-адрес приложения, обмена документами из внешнего приложения с помощью параметра "Копировать в MyApp", когда метод открытого URL-адреса AppDelegate вызывается, как показано ниже.
public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
//validate and save url
return true
}
Проблема заключается в том, что когда приложение запускается из внешнего приложения, вышеупомянутый метод open url вызывается, а также вызывается наблюдатель UIApplicationWillEnterForeground, как и ожидалось. Но в этом наблюдателе UIApplicationWillEnterForeground LAContext().valuPolicy неожиданно завершается с ошибкой "Абонент перешел на задний план".
Обратите внимание, что проблема может быть замечена на iOS 11.0.3, 11.3, тогда как это не воспроизводимо с iOS 11.4 или <11
1 ответ
Вы должны добавить это, когда приложение applicationDidBecomeActive
NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { (notification) in
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(
LAPolicy.deviceOwnerAuthenticationWithBiometrics,
error: &error) {
// Device can use biometric authentication
context.evaluatePolicy(
LAPolicy.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "Access requires authentication",
reply: {(success, error) in
DispatchQueue.main.async {
if let err = error {
switch err._code {
case LAError.Code.systemCancel.rawValue:
self.notifyUser("Session cancelled",
err: err.localizedDescription)
case LAError.Code.userCancel.rawValue:
self.notifyUser("Please try again",
err: err.localizedDescription)
case LAError.Code.userFallback.rawValue:
self.notifyUser("Authentication",
err: "Password option selected")
// Custom code to obtain password here
default:
self.notifyUser("Authentication failed",
err: err.localizedDescription)
}
} else {
self.notifyUser("Authentication Successful",
err: "You now have full access")
}
}
})
}
})