1

我已经在视图控制器上实现了密码/TouchID/FaceID,当我遇到成功案例时,我希望提示停止触发,但它只是一遍又一遍地触发。

在我的 VC 中:

var context: LAContext!

func authenticateReturningUser() {
    context = LAContext()
    var error: NSError?

    if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
        let reason = "Verify that this is your device to continue."

        context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { success, error in
            DispatchQueue.main.sync {
                guard success else {
                    guard let error = error else {
                        // show error
                        return
                    }

                    switch error {
                    case LAError.userCancel:
                        // do stuff
                        return
                    default: return
                    }
                }

                print("success")
            }
        }
    }
}

如果用户成功授权,提示应该触发一次而不是再次触发

编辑

authenticateReturningUser从 AppDelegate 的applicationDidBecomeActive函数调用:

self.coverVC?.completionHandler = { self.removeBackgroundVC() }
self.coverVC?.authenticateReturningUser()
4

2 回答 2

1

据我记得,当显示 Touch ID 提示时,您的应用程序会变为非活动状态。因此,当提示被解除时,您的应用程序再次变为活动状态,再次触发 App Delegate applicationDidBecomeActive

您可能会考虑引入一个标志来存储应用程序是否因为 Touch ID / Face ID 等或其他原因而变得不活动,并使用它applicationDidBecomeActive来决定是否应该触发身份验证。

于 2018-01-25T20:26:11.903 回答
0

你在哪里打电话authenticateReturningUser()?您可能想要创建一个静态布尔值authenticated,如果为 false,则允许调用authenticateReturningUser(),如果为 true,则跳过调用,并authenticated = true在调用函数一次后设置。

于 2018-01-25T19:31:58.097 回答