Touch IDのエラーまとめ
LAContext
の以下のAPI
- (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void(^)(BOOL success, NSError * __nullable error))reply;
このAPIで指紋認証の LAPolicyDeviceOwnerAuthenticationWithBiometrics
を使ってみて実際に遭遇したエラー集
LocalAuthentication.framework の LAError.h に書かれているエラーの定義も合わせて確認すると良いかも。
Error Domain=com.apple.LocalAuthentication Code=-1 "Application retry limit exceeded." UserInfo={NSLocalizedDescription=Application retry limit exceeded.
Touch IDの認証失敗を繰り返して制限回数に達した時
LAPolicyDeviceOwnerAuthentication でパスコード認証中にキャンセル Error Domain=com.apple.LocalAuthentication Code=-2 "Canceled by user." UserInfo={NSLocalizedDescription=Canceled by user.}
Touch IDのシステムアラートを表示中にホームボタンを押す
またはTouch IDのシステムアラートの「キャンセル」ボタンを押した時
Error Domain=com.apple.LocalAuthentication Code=-3 "Fallback authentication mechanism selected." UserInfo={NSLocalizedDescription=Fallback authentication mechanism selected.}
Touch IDのシステムアラートを表示中に「パスコードを入力」ボタンを押した時
Error Domain=com.apple.LocalAuthentication Code=-4 "Canceled by another authentication." UserInfo={NSLocalizedDescription=Canceled by another authentication.}
Touch IDのシステムアラートを表示中に再度APIでTouch IDを表示しようとした時
Error Domain=com.apple.LocalAuthentication Code=-4 "Caller moved to background." UserInfo={NSLocalizedDescription=Caller moved to background.}
Touch IDのシステムアラートをAPIで表示するのと同時にホームボタンを押してホーム画面を表示した時
Error Domain=com.apple.LocalAuthentication Code=-4 "UI canceled by system." UserInfo={NSLocalizedDescription=UI canceled by system.}
Touch IDのシステムアラートを表示中に端末をロックした時
Error Domain=com.apple.LocalAuthentication Code=-8 "Biometry is locked out." UserInfo={NSLocalizedDescription=Biometry is locked out.}
Touch IDの認証制限回数に達した状態でAPIからTouch IDを呼んだ時
Error Domain=com.apple.LocalAuthentication Code=-1004 "User interaction is required." UserInfo={NSLocalizedDescription=User interaction is required.}
バックグラウンドにいる時にTouch IDのAPIを呼んだ時
これは - (void)applicationDidEnterBackground:(UIApplication *)application
のタイミングでTouch IDのAPIを呼ぶとたまに起こる。
このエラーを避けるにはAPIの呼び出しは - (void)applicationDidBecomeActive:(UIApplication *)application
で行いつつ、2重にAPIコールをしてしまわないようにAPIの呼び出し時に使った LAContext
のインスタンスを reply ブロックが呼ばれるまで保持したりして状態管理すると良い。