首页 > 解决方案 > 如何在 3 次不正确的触摸/面部 id 识别后忽略 iOS 设备 PIN 提示

问题描述

我们的应用程序使用生物识别技术从钥匙串中保存和检索项目以进行身份​​验证。

在第三次不正确的尝试中,我被重定向到设备 PIN 码。而是想提示一条消息说 3 次不正确的尝试。

检索项目的代码

OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef);

看到美国银行应用程序的预期行为,它显示一条消息,用户需要在 3 次错误尝试后手动登录

标签: iosaclkeychaintouch-idface-id

解决方案


我假设您正在使用作为查询一部分的项目中的kSecAccessControlUserPresence选项将SecAccessControlCreateWithFlags项目添加到钥匙串。某处你有一些看起来像这样的东西:

SecAccessControlRef access = SecAccessControlCreateWithFlags(nil,
                        kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
                        kSecAccessControlUserPresence,
                        nil);

选项的文档kSecAccessControlUserPresence指出:

限制使用生物特征或密码访问项目。

它将根据需要回退到密码。要将其限制为仅使用生物识别,您应该使用kSecAccessControlBiometryAnyorkSecAccessControlBiometryCurrentSet标志。两者都需要 TouchID 或 FaceID 来解锁项目。kSecAccessControlBiometryAny需要任何匹配的生物特征,即使它们在设置钥匙串项目后被更改。kSecAccessControlBiometryCurrentSet如果用户在 TouchID 中添加或移除手指或重新注册 FaceID,则会导致项目无效。

您应该将上述访问控制代码更改为kSecAccessControlBiometryAny

SecAccessControlRef access = SecAccessControlCreateWithFlags(nil,
                        kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
                        kSecAccessControlBiometryAny,
                        nil);

或者这个kSecAccessControlBiometryCurrentSet

SecAccessControlRef access = SecAccessControlCreateWithFlags(nil,
                        kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
                        kSecAccessControlBiometryCurrentSet,
                        nil);

Apple 文档SecAccessControlCreateFlagshttps ://developer.apple.com/documentation/security/secaccesscontrolcreateflags?changes=_2&language=objc


推荐阅读