iOS: Touch Id не отображается при вызове открытого URL-адреса AppDelegate - PullRequest
0 голосов
/ 18 сентября 2018

Мое приложение поддерживает открытие документов, таких как изображения, 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 </p>

1 Ответ

0 голосов
/ 18 сентября 2018

Вы должны добавить это, когда приложение 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")
                }
            }
    })

}

})
...