我们正在开发一个应用程序,我们使用 Touch ID 从钥匙串中读取一个秘密。
我们发现,当您立即从钥匙串中读取从钥匙串中读取时,如果第一次使用 PIN 码读取密钥,则第二次读取不会返回字符串值。如果用户第一次使用他们的指纹,第二次将出现 Touch ID 对话框,并且再次读取成功。
这是一个示例应用程序:https ://github.com/cnandreu/KeychainTouchIdError
下面是使用 KeychainTouchIdError 的演示应用程序的一些场景。这些必须在运行 iOS 8 且带有触摸 id 传感器的真实设备上执行。使用模拟器时,所有场景都按预期工作,因为从未出现过 Touch ID 对话框。
场景一(工作)
- 将值存储在受 kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly 保护的钥匙串中。
- 从钥匙串读取,使用指纹解锁。
- 没有延迟。
- 从钥匙串读取,使用指纹或 PIN 解锁。
场景 2(在设备上损坏):
- 将值存储在受 kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly 保护的钥匙串中。
- 从钥匙串中读取,使用 PIN 解锁。
- 没有延迟。
- 从钥匙串中读取。使用设备时,不显示触摸 ID 对话框,并且从钥匙串返回空字符串。但是,在使用模拟器时,存储在钥匙串中的值会被正确检索。
场景3(工作):
- 将值存储在受 kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly 保护的钥匙串中。
- 从钥匙串中读取,使用 PIN 解锁。
- 等待 500 毫秒。
- 从钥匙串中读取。用户会看到一个对话框,并且可以在使用他们的指纹或 PIN 后再次读取密码。
演示应用程序中可用的按钮
保存 - 将密钥写入受 kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly 保护的钥匙串。
读取 - 从钥匙串中读取一个秘密。
删除 - 从钥匙串中删除秘密。
快速 - 用于执行场景 1 和 2。
Quick with Delay - 用于执行场景 3。
注释
我们最好的猜测是,PIN 解锁动画(向下滑动并持续约 250 毫秒)干扰了第二次读取。指纹解锁时没有动画。这只是一个猜测。
关于我们为什么遇到场景 2 问题的任何想法?是否需要做任何事情来等待钥匙串再次“可读”?