[iOS 8] Touch ID で指紋認証を行う

iOS 8 で指紋認証がアプリで利用可能に

iOS 8 では、Touch ID という指紋認証機能がサードパーティ製のアプリで利用可能になりました。ということで、Touch ID の使い方を改めておさらいしつつ、 Touch ID API の使い方を解説したいと思います。

Touch ID はどうやって使うの?

Touch ID は iPhone 5s から搭載された指紋認証機能です。iPhone 6 / iPhone 6 Plus / iPhone 5s から利用することができます(9月18日現在)。iPhone 5 以前や iPad 、 iPod touch などでは利用することができません。

App Store でアプリをインストールするとき、いちいちパスワードを入力するのが面倒だったという経験は誰しもがあると思いますが、Touch ID を登録しておくことによって、指紋認証するだけでアプリがインストールできるようになります。これは便利ですよね。

Touch ID API を使ってみる

それでは Touch ID の API を使ってみましょう。まず新しいプロジェクトを作成し、 Local Authentication.framework というフレームワークを追加します。iOS 8 で初めて追加されたフレームワークです。

Local Authentication Framework Reference | iOS Developer Library

次に、画面に適当なボタンを追加しましょう。ボタンをタップすると認証が走る、というイメージです。

あとは実装です。ボタンタップ時に呼び出されるメソッドを追加し、次のように実装してください。

import UIKit
import LocalAuthentication

class TouchViewController: UIViewController {
    
    @IBAction func buttonDidTouch(sender : AnyObject) {
        let context = LAContext();
        var error :NSError?
        // Touch ID が利用できるデバイスか確認する
        if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error) {
            // 利用できる場合は指紋認証を要求する
            context.evaluatePolicy(
                LAPolicy.DeviceOwnerAuthenticationWithBiometrics,
                localizedReason:"指紋認証よろしく!",
                reply: {
                    success, error in
                    if (success) {
                        // 指紋認証成功
                        NSLog("Success")
                    } else {
                        // 指紋認証失敗
                        NSLog("Error")
                    }
                })
        } else {
            // Touch ID が利用できない場合
            NSLog("An Error Occurred: \(error)")
        }
}

解説します。まずはじめに登場するのが LAContext です。Touch ID を利用するにはこのクラスのインスタンスを使っていきます。

次に canEvaluatePolicy() メソッドを実行しています。このメソッドは、実行中のデバイス(OS)が指定のポリシー(認証方法)に対応しているかどうかを精査してくれます。指紋認証の場合は LAPolicy.DeviceOwnerAuthenticationWithBiometrics を渡します。LAPolicy にはまだ DeviceOwnerAuthenticationWithBiometrics しかありませんが、今後追加されていく可能性があります。また、第二引数に NSError を渡すと、エラーが発生した(つまり対応していない)場合にエラーオブジェクトが渡されます。

次に evaluatePolicy() メソッドで実際に認証処理を実行します。第一引数には先ほどと同様 LAPolicy.DeviceOwnerAuthenticationWithBiometrics を渡しています。第二引数の localizedReason には、認証アラートに表示する文言を設定できます。第三引数は認証処理後に呼び出される (Bool, NSError!) -> Void)! 関数を渡します。この関数の第一引数の Bool は認証に成功したかどうか、第二引数は失敗時にエラーオブジェクトが渡されます。

それでは実行してみましょう。iPhone 5s などの Touch ID が搭載された実機で試してください。

ios8-touch-id01

アラートが表示されました。これで実際に指紋認証してみるとログに「Success」と表示されます。

またパスワードを設定していなかったり、Touch ID が搭載されていないなど、Touch ID を利用できないデバイスでは「Error」となります。 エラーコードは次の通りです。デバイスやユーザー設定に応じて、適切な認証要求をかけるためにはエラーコードを判定していく必要があります。

エラーコード 説明
AuthenticationFailed 認証が失敗した
UserCancel キャンセル操作が行われた
UserFallback 「パスワードを入力」が選択された
SystemCancel 何らかの理由によってシステムでキャンセルされた
PasscodeNotSet パスワードが未設定
TouchIDNotAvailable Touch ID が利用できないデバイス・OS
TouchIDNotEnrolled 何らかの理由により Touch ID が利用できない

まとめ

指紋認証はパスワードの入力の手間を省くことができ非常に便利ですが、Touch ID が搭載されていないデバイスは数多くあります。そのため、指紋認証だけで認証するアプリにしてしまうと、 iPhone 6 / iPhone 6 Plus / iPhone 5s のみで動作するアプリになってしまいます。Touch ID はパスワード入力をショートカットするための追加機能 として活用できる機能であるという認識で利用しましょう。

参考