Touch ID を使用してキーチェーンからシークレットを読み取るアプリケーションに取り組んでいます。
前回の読み取りの直後にキーチェーンから読み取ると、PIN コードを使用して最初にシークレットを読み取ると、2 回目の読み取りで文字列値が返されないことがわかりました。ユーザーが最初に指紋を使用すると、Touch ID ダイアログが 2 回目に表示され、別の読み取りが成功します。
アプリケーションの例を次に示します: https://github.com/cnandreu/KeychainTouchIdError
以下は、KeychainTouchIdError デモ アプリケーションを使用するいくつかのシナリオです。これらは、タッチ ID センサーを備えた iOS 8 を実行している実際のデバイスで実行する必要があります。Touch ID ダイアログが表示されないため、シミュレーターを使用すると、すべてのシナリオが期待どおりに機能します。
シナリオ 1 (作業中)
- kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly で保護されたキーチェーンに値を格納します。
- キーチェーンから読み取り、指紋を使用してロックを解除します。
- 遅延なし。
- キーチェーンから読み取り、指紋または PIN を使用してロックを解除します。
シナリオ 2 (デバイスで破損):
- kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly で保護されたキーチェーンに値を格納します。
- キーチェーンから読み取り、PIN を使用してロックを解除します。
- 遅延なし。
- キーチェーンから読み取ります。デバイスを使用している場合、タッチ ID ダイアログは表示されず、キーチェーンから null 文字列が返されます。ただし、シミュレーターを使用すると、キーチェーンに格納されている値が正しく取得されます。
シナリオ 3 (動作中):
- kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly で保護されたキーチェーンに値を格納します。
- キーチェーンから読み取り、PIN を使用してロックを解除します。
- 500ミリ秒待ちます。
- キーチェーンから読み取ります。ユーザーにはダイアログが表示され、指紋または PIN を使用した後にシークレットを再度読み取ることができます。
デモ アプリケーションで使用できるボタン
保存 - kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly によって保護されたキーチェーンにシークレットを書き込みます。
読み取り - キーチェーンからシークレットを読み取ります。
削除 - キーチェーンからシークレットを削除します。
クイック - シナリオ 1 および 2 を実行するために使用されます。
Quick with Delay - シナリオ 3 を実行するために使用します。
コメント
私たちの推測では、下にスワイプして約 250 ミリ秒続く PIN のロック解除のアニメーションが、2 回目の読み取りに干渉している可能性があります。指紋でロック解除するときのアニメーションはありません。これは単なる推測ですが。
シナリオ 2 で問題が発生した理由について何か考えはありますか? キーチェーンが再び「読み取り可能」になるのを待つために必要なことはありますか?