[iOS] Touch ID API の使い方をおさらいする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。モバイルアプリサービス部の平屋です。

Touch ID API について調査する機会がありましたので、その結果をまとめてみました。

目次

検証環境

今回は、以下の環境を対象に調査しました。

  • Xcode Version 7.2 (7C68)
  • Development Target: iOS 8.0

Touch ID の概要

Touch ID は iPhone 5s から搭載された 指紋認証センサー です。デバイスのロックの解除やアプリの購入などを行うときに使用できます。

デバイスの仕様や使用環境によっては、指紋認証が利用できない場合があります。ゆえに Touch ID は、パスワード入力をショートカットするためのオプション という位置づけの機能になります。

また、iOS 8Touch ID API がサードパーティーの開発者に開放され、Touch ID を利用した認証 をアプリに組み込むことが出来できるようになりました。

touch-id-api-2016-000

例:Dropbox アプリ

基本的な使い方

iOS 8 で追加された Local Authentication FrameworkLAContext クラスを使用します。

@import LocalAuthentication;

Touch ID API を利用するときの大まかな手順は以下の通りです。

  1. Touch ID API が利用可能かをチェックする
  2. 認証処理を実行する

1. Touch ID API が利用可能かをチェックする

LAContext クラスの canEvaluatePolicy:error: メソッドを使用して Touch ID API が利用できるかをチェックします。

第一引数に LAPolicyDeviceOwnerAuthenticationWithBiometrics を、第二引数に NSError オブジェクトをセットします。

// Touch ID API が利用できるかをチェック
NSError *authError = nil;
BOOL canEvaluatePolicy =
[context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                     error:&authError];

利用するための条件

Touch ID API を利用するには、以下の 3 つの条件を満たしている必要があります。

  • (1) パスコードが設定されている
    • 設定アプリで設定
  • (2) デバイスが Touch ID API に対応している
    • 対応 OS
      • iOS 8.0 以上
    • 対応機種
      • iPhone
        • iPhone 6s
        • iPhone 6s Plus
        • iPhone 6
        • iPhone 6 Plus
        • iPhone 5s
      • iPad
        • iPad Pro
        • iPad mini 4
        • iPad Air 2
        • iPad mini 3
  • (3) 指紋が登録されている
    • 設定アプリで登録

エラーハンドリング

Touch ID API が利用できない場合は、canEvaluatePolicy:error: メソッドに渡した NSError オブジェクトにエラーの内容が格納されます。NSError オブジェクトの code プロパティを確認すれば理由がわかります。

この場合にとりうるエラーコードの定数とその内容は以下の通りです。

Constants 内容
LAErrorPasscodeNotSet パスコードが設定されていない
LAErrorTouchIDNotAvailable デバイスが Touch ID API に対応していない
LAErrorTouchIDNotEnrolled 指紋が登録されていない

2. 認証処理を実行する

LAContext クラスの evaluatePolicy:localizedReason:reply: メソッドを使用して認証処理を実行します。

[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
        localizedReason:@"指紋認証してください!"
                  reply:^(BOOL success, NSError *error) {
                      if (success) {
                          // 認証成功時の処理

                      } else {
                          // 認証失敗時の処理

                      }
                  }];

このメソッドを呼ぶと Touch ID 認証ダイアログが表示されます。

touch-id-api-2016-001

第一引数

LAPolicyDeviceOwnerAuthenticationWithBiometrics をセットします。

第二引数

第二引数には、指紋認証を使う理由を設定します。この文字列は Touch ID 認証ダイアログのサブタイトルとして使用されます。

nil または空文字 を設定すると例外が投げられてしまいます。簡潔かつ適切な説明を設定しましょう!

@warning localizedReason parameter is mandatory and the call will throw NSInvalidArgumentException if nil or empty string is specified. (LAContext.h ファイルより引用)

第三引数

第三引数には認証処理が完了した時に実行するブロックをセットします。

認証成功した場合はブロックの引数の success の値が YES になります。

認証失敗 (あるいはキャンセル) した場合は、 success の値が NO になり、 NSError オブジェクトにエラーの内容が格納されます。

この場合にとりうるエラーコードの定数とその内容は以下の通りです。

Constants 内容
LAErrorAuthenticationFailed 認証が失敗した
LAErrorUserCancel 「キャンセル」ボタンが押された
LAErrorUserFallback 「フォールバック (パスワードを入力)」ボタンが押された
LAErrorSystemCancel システムによってキャンセルされた

Touch ID 認証ダイアログ上のボタンが押された場合もエラー扱いになります。ボタンが押されたイベントをハンドリングしたい場合は、エラーコードで判別します。

Touch ID API の基本的な使い方は以上です。

ダイアログのカスタマイズ

一部の項目のみカスタマイズできるようになっています。

touch-id-api-2016-002

(1) アプリ名

CFBundleDisplayName に設定している文字列が表示されます。

(2) メッセージ (指紋認証を使う理由)

こちらは、2. 認証処理を実行するセクションで解説しました。evaluatePolicy:localizedReason:reply: メソッドで文字列を指定できます。

(3) フォールバックボタン

LAContext クラスの localizedFallbackTitle プロパティに文字列を設定すれば、ボタンのタイトルを変更できます。

LAContext *context = [LAContext new];
context.localizedFallbackTitle = @"password を入力";

touch-id-api-2016-003

localizedFallbackTitle プロパティに nil が設定されている場合はボタンのタイトルが「パスワードを入力」になります。空文字が設定されている場合はボタン自体が非表示になります。

フォールバックボタンの初期表示

iOS 8.3 より古い OS かどうかで フォールバックボタンの表示が異なるようです。(フォールバックボタンを表示するようにしている場合)

iOS 8.3 以降の場合

指紋認証がまだ 1 回も失敗していないと状態だと、フォールバックボタンが表示されません。1 回失敗したら、フォールバックボタンが表示されます。

touch-id-api-2016-004

iOS 8.3 よりも古い OS の場合

失敗回数にかかわらず、フォールバックボタンが表示されます。

touch-id-api-2016-005

指紋認証の試行回数

指紋認証の試行回数は以下のとおりです。

  • 指紋認証に 3 回失敗すると、ダイアログが非表示になる
  • 指紋認証に 5 回失敗すると、指紋認証がロックされ、パスコード入力画面が表示される

touch-id-api-2016-006

例えば、毎回認証に失敗し続けた場合の動きは以下のようになります。

  • 1 回目のダイアログ表示
    • ダイアログを表示させる (evaluatePolicy:localizedReason:reply: メソッドを呼ぶ)
    • 指紋認証を 3 回失敗させる
    • ダイアログが非表示になる (3 回失敗したのでダイアログが非表示になる)
  • 2 回目のダイアログ表示
    • ダイアログを表示させる
    • 指紋認証を 2 回失敗させる
    • ダイアログが非表示になる (合計 5 回失敗したので指紋認証がロックされ、ダイアログが非表示になる)
  • 3 回目のダイアログ表示
    • ダイアログを表示させる
    • Touch ID 認証ダイアログは表示されず、パスコード入力画面が表示される
    • パスコード入力を突破すると、再び Touch ID 認証ダイアログが表示される

クラスリファレンス

LAContext クラスのリファレンスは、こちらにありますが、更新が追いついていないようです。

リファレンスだけではなく LAContext.h ファイルも確認したほうが良さそうです。

また、本記事では iOS 8.0 から利用できるメソッド・プロパティしか扱っていません。iOS 8.3 あるいは iOS 9.0 から利用できるメソッド・プロパティもありますので、興味がある方は LAContext.h ファイルを確認してみてください。

まとめ

本記事の内容をまとめますと、以下のようになります。

  • Touch ID 認証を利用するには、Local Authentication Framework の LAContext クラスを使用する
  • Touch ID API の 処理は 2 段階
    • API が利用可能かをチェックする
    • 認証処理を実行する
  • Touch ID 認証ダイアログ
    • UI 自体は基本的にカスタム不可
    • メッセージとフォールバックボタンのタイトルを指定できる
  • 以下のイベントをハンドリングできる
    • 認証成功
    • 認証失敗
    • フォールバックボタンが押された
    • キャンセルボタンが押された
  • 「iOS 8.3 以降の OS」と「それよりも古いバージョンの OS」との間で挙動が異なる部分がある
  • クラスリファレンスだけではなく LAContext.h ファイルも確認すべし

Touch ID を利用した認証をアプリに組み込む際の参考になれば幸いです。

参考ページ