I am working on the app that uses touch ID for login. It should ask for touch ID only at first launch (i.e. I am not asking for touch ID auth when app enters foreground from background). Here is what I do to show touchID:
AppDelegate.swift:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let loginViewController = storyboard.instantiateViewControllerWithIdentifier("login") as! LoginViewController
rootViewController = loginViewController
let navigationController = UINavigationController(rootViewController: rootViewController)
window!.rootViewController = navigationController
}
Then in viewDidAppear() of LoginViewController I ask for touch like so:
LoginViewController.swift:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let context = LAContext()
if context.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil) {
context.evaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics,
localizedReason: NSLocalizedString("Login To Your Account", comment: ""),
reply: { [weak self] (success, error) in
dispatch_async(dispatch_get_main_queue(), {
if success {
self?.loginUser()
} else if error!.code != LAError.UserCancel.rawValue {
self?.focusOnPassword()
} else
})
})
} else {
loginUser()
}
}
The problem is some of testers report that they are not getting TouchID alert at all. It just show shows password screen right away. I added error logging and the error I receive is:
Domain: com.apple.LocalAuthentication Code: -1004 NSLocalizedDescription: User interaction is required.
And I can't reproduce it at all. Touch ID works fine on all of my test devices, so I can't get the reason of that. Bugs were received from iPhone 6, 6S, 6s Plus, iOS 9.3.1-9.3.3.