ObjecTips

Swift & Objective-C で iOS とか macOS とか

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 ブロックが呼ばれるまで保持したりして状態管理すると良い。