我们的应用程序使用生物识别技术从Keychain保存和检索项目以进行身份验证。
在第3次错误尝试时,我被重定向到设备PIN码。而是想提示一条消息说3次不正确的尝试。
检索项目的代码
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef);
看到了美国银行应用程序的预期行为,其中显示了一条消息,用户需要在3次不正确的尝试后手动登录
答案 0 :(得分:1)
我假设您正在kSecAccessControlUserPresence
项目中使用SecAccessControlCreateWithFlags
选项,这是查询的一部分,用于将项目添加到钥匙串中。在某个地方,您会看到以下内容:
SecAccessControlRef access = SecAccessControlCreateWithFlags(nil,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
kSecAccessControlUserPresence,
nil);
kSecAccessControlUserPresence
选项的文档说明:
约束使用生物特征或密码访问项目。
根据需要,它将退回到密码。要将其限制为仅使用生物识别,应使用kSecAccessControlBiometryAny
或kSecAccessControlBiometryCurrentSet
标志。两者都需要使用TouchID或FaceID来解锁该项目。 kSecAccessControlBiometryAny
需要任何匹配的生物特征,即使在设置了钥匙串项目之后更改了它们。如果用户在TouchID中添加或删除手指或重新注册FaceID,则kSecAccessControlBiometryCurrentSet
会使该项目无效。
对于kSecAccessControlBiometryAny
,您应该将以上访问控制代码更改为以下任一代码:
SecAccessControlRef access = SecAccessControlCreateWithFlags(nil,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
kSecAccessControlBiometryAny,
nil);
或kSecAccessControlBiometryCurrentSet
的这个:
SecAccessControlRef access = SecAccessControlCreateWithFlags(nil,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
kSecAccessControlBiometryCurrentSet,
nil);
关于SecAccessControlCreateFlags
的Apple文档:https://developer.apple.com/documentation/security/secaccesscontrolcreateflags?changes=_2&language=objc