TouchID错误代码:-1004 NSLocalizedDescription:用户交互是必需的
我正在使用触摸ID进行login的应用程序。 它应该只在第一次启动时才要求触摸ID(即,当应用从后台进入前景时,我不要求触摸IDauthentication)。 这是我做什么来显示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 }
然后在viewViewController的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() } }
问题是一些testing人员报告说,他们没有得到TouchID警报。 它只是显示密码屏幕显示。 我添加了错误日志logging,我收到的错误是:
Domain: com.apple.LocalAuthentication Code: -1004 NSLocalizedDescription: User interaction is required.
而我根本无法复制它。 Touch ID在我所有的testing设备上都能正常工作,所以我不能明白这个原因。 从iPhone 6,6S,6s Plus,iOS 9.3.1-9.3.3收到错误。
即使您的应用程序位于前台,这也会发生在iOS 10上。 正如Android Noob在其中一个评论中提到的那样。
我做了进一步的调查,发现当你有多个具有相同产品/可执行文件名称的应用程序时会发生这种情况
在我的情况下,我有不同的包标识符和显示名称相同的应用程序(代码)的3个版本。 只有其中一个,最后一个安装了Touch ID。 其他人返回了“用户交互要求错误”。
关于OP的问题。 testing人员有可能在其设备上安装了另一个具有相同可执行文件名称的应用程序。 这可能是您的应用或其他开发人员的应用的另一个版本。
要绕过这个问题,请更改您的可执行文件或产品名称:目标 – > [您的目标名称] – >生成设置 – >打包 – >产品名称
我的testing和发现:
给定3个具有相同代码和产品名称但具有不同捆绑ID和显示名称的应用程序:CI,UAT和Prod。
安装CI:
- CI – Touch ID的作品
安装UAT:
- UAT – Touch ID的作品
- CI – 触摸ID失败,出现“需要用户交互”错误
安装Prod:
- Prod – Touch ID的作品
- UAT – 触摸ID失败,出现“需要用户交互”错误
- CI – 触摸ID失败,出现“需要用户交互”错误
卸载Prod:
- UAT – Touch ID的作品(但似乎已经失去了上下文,因为它不显示应用程序的名称)
- CI – Touch ID的作品(但似乎已经失去了上下文,因为它不显示应用程序的名称)
卸载UAT和CI,重新安装CI:
- CI – Touch ID的作品
更改UAT产品名称并安装UAT:
- CI – Touch ID的作品
- UAT – Touch ID的作品
看看这个SOpost关于同样的问题 。
答案是这样的
基本上这个错误发生在你的应用从后台被唤醒的时候,以及你要求的Touch ID(我的情况是本地authenticationtypes,我没有用钥匙串typestesting)。 当应用程序在后台运行时,用户无法与Touch ID进行交互,因此出现错误消息。
如果同样的情况也发生在你身上,你需要在下面的AppDelegate
方法中添加一些逻辑:
- (void)applicationWillEnterForeground:(UIApplication *)application