4

我们正在开发一个应用程序,我们使用 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 问题的任何想法?是否需要做任何事情来等待钥匙串再次“可读”?

4

0 回答 0