Touch ID验证对话框能否实时更新localizedReason无需重弹?
localizedReason的疑问 我目前使用以下代码实现Touch ID用户验证:
authenticationContext.evaluatePolicy( .DeviceOwnerAuthenticationWithBiometrics, localizedReason: "Only awesome people are allowed", reply: { [unowned self] (success, error) -> Void in if( success ) { // 指纹识别成功 // 跳转至目标控制器 self.navigateToAuthenticatedViewController() }else { // 处理错误情况 if let error = error { let message = self.errorMessageForLAErrorCode(error.code) self.showAlertViewAfterEvaluatingPolicyWithMessage(message) } } })
这段代码会弹出系统默认的Touch ID验证对话框。我现在想咨询:在这个对话框显示的过程中,有没有办法不用重新弹出对话框,就能实时更新localizedReason的内容来展示最新信息?
嘿,这个问题我之前也琢磨过,很遗憾的是——目前苹果并没有提供官方API支持在Touch ID验证对话框显示期间实时更新localizedReason文本。
原因其实很好理解:当你调用evaluatePolicy(_:localizedReason:reply:)的那一刻,系统就会用你传入的localizedReason生成那个系统级的验证对话框,一旦对话框弹出来,里面的文本就被固定死了,没有任何公开的接口允许你修改它的内容。毕竟这个对话框属于系统安全组件,苹果为了保证交互一致性和安全性,把这类修改权限锁得很死。
如果你的业务确实需要展示实时变化的提示信息,我有两个实用的替代方案给你参考:
取消当前会话后重新发起验证
你可以先调用authenticationContext.invalidate()终止当前的验证会话,然后立即重新调用evaluatePolicy方法,传入更新后的localizedReason。示例代码如下:// 终止当前验证会话 authenticationContext.invalidate() // 重新发起验证,使用更新后的提示文本 authenticationContext.evaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "最新的验证提示内容", reply: { [unowned self] (success, error) in // 沿用原有的结果处理逻辑 if success { self.navigateToAuthenticatedViewController() } else { if let error = error { let message = self.errorMessageForLAErrorCode(error.code) self.showAlertViewAfterEvaluatingPolicyWithMessage(message) } } })不过要注意,频繁弹出对话框可能会影响用户体验,建议只在必要场景下使用这个方案。
通过自定义前置界面展示实时信息
你可以先做一个自定义的前置提示界面,把需要实时更新的内容放在这个界面里展示,等用户确认要进行Touch ID验证时,再调用系统的验证方法,此时localizedReason只需传入固定的核心验证理由即可。这种方式既满足了实时信息的展示需求,又符合系统交互规范,用户体验也更流畅。
内容的提问来源于stack exchange,提问作者Son Le

