我正在使用触控ID进行登录的应用。它应该仅在首次启动时询问触摸ID(即,当应用程序从后台进入前景时,我不要求触摸ID身份验证)。以下是我展示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
}
然后在LoginViewController的viewDidAppear()中,我要求触摸:
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()
}
}
问题是一些测试人员报告他们根本没有获得TouchID警报。它只是显示密码屏幕立即显示。我添加了错误记录,我收到的错误是:
Domain: com.apple.LocalAuthentication Code: -1004 NSLocalizedDescription: User interaction is required.
我根本无法复制它。 Touch ID在我的所有测试设备上都能正常工作,所以我无法理解这一点。 从iPhone 6,6S,6s Plus,iOS 9.3.1-9.3.3收到错误。
答案 0 :(得分:8)
即使您的应用程序位于前台,也会在iOS 10上发生这种情况。正如Android Noob在其中一条评论中提到的那样。
我做了进一步调查,发现当您有多个具有相同产品/可执行文件名称的应用时会发生这种情况。
在我的场景中,我有3个版本的相同应用程序(代码),具有不同的包标识符和显示名称。其中只有一个,即安装的最后一个,使用Touch ID。其他人返回了“用户交互必需错误”。
关于OP的问题。测试人员可能在其设备上安装了另一个具有相同可执行文件名称的应用程序。这可能是您应用的另一个版本或其他开发人员的应用。
要解决问题,请更改您的可执行文件或产品名称:目标 - > [您的目标名称] - >构建设置 - >包装 - >产品名称
我的测试和发现:
鉴于3个应用程序具有相同的代码和产品名称,但捆绑ID和显示名称不同:CI,UAT和Prod。
安装CI:
安装UAT:
安装产品:
卸载产品:
卸载UAT和CI,重新安装CI:
更改UAT产品名称并安装UAT:
答案 1 :(得分:0)
查看this SO post regarding the same issue。
答案是
基本上这种错误发生在你的应用程序从后台唤醒时,你的代码某处要求Touch ID(我的情况是本地身份验证类型,我还没有使用keychain类型进行测试)。当应用程序在后台运行时,用户无法与提示的Touch ID进行交互,因此出现错误消息。
如果您也遇到同样的情况,则需要在AppDelegate
方法中添加一些逻辑:
- (void)applicationWillEnterForeground:(UIApplication *)application