11月
29

iOS8から使える指紋認証・TouchID(Local Authentication)を実装する方法

Written by takashings posted on 11月 29, 2014 in Objective-C, Swift

How to implement touch id for ios

iOS8からサードパーティー製のアプリでも指紋認証・TouchIDを使うことができるようになりました。

基本的にはiPhone、iPadのロック画面を解除するのと同様にアプリ側のパスワード画面を指紋認証で解除することができる、というのが主な使い方になると思います。

今開発しているアプリでそれを使おうと思っているので、メモがてら実装方法を書いてみたいと思います。

指紋認証を使うには「LocalAuthentication.Framework」を追加する必要がありますので、以下を追加します。

・Swift

import LocalAuthentication

・Objectie-C

#import 

これがないとエラーになるので、これを追加します。

そして、指紋認証が使えるかどうかをまず確認します。
iPhone5以降の端末ではiOS8をインストールすることができます。
しかし、指紋認証がハードウェアに搭載されていないので、そのような端末では回避する必要があります。

・Swift

// 指紋認証用のインスタンス生成
let myContext = LAContext()

// エラー用変数
var error : NSError?

// 端末が指紋認証を使えるかどうか判定
if myContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error) {
	// 指紋認証を使える端末
} else {
	// 指紋認証を使えない端末
    // 指紋認証を使える端末だが、ユーザーが指紋認証機能をオフにしている
}

・Objective-C

// 指紋認証用のインスタンス生成
LAContext *myContext = [[LAContext alloc] init];

// エラー用変数
NSError *error = nil;

// 端末が指紋認証を使えるかどうか判定
if([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
	// 指紋認証を使える端末
} else {
	// 指紋認証を使えない端末
    // 指紋認証を使える端末だが、ユーザーが指紋認証機能をオフにしている
}

指紋認証が使えるようであれば、指紋認証画面を表示します。

指紋認証画面では任意のメッセージを表示することも出来ます。

・Swift

if (myContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error)) {
    myContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,
        localizedReason: "指紋認証どうぞ!",
        reply:{ (success, error) -> Void in
            
            if (success) {
                // 指紋認証成功
            } else {
                // 何らかの理由で指紋認証失敗
                }
            }
    })
}

・Objective-C

// 指紋認証が使えるかを判別
if([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
	// 指紋認証画面に表示するメッセージ
	NSString *myLocalizedReasonString = @"指紋認証どうぞ!";

	// 指紋認証画面を表示
	[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
              localizedReason:myLocalizedReasonString
                        reply:^(BOOL success, NSError *error) {
                            if(success) {
                                // 指紋認証成功
                            } else {
                                // 何らかの理由で指紋認証失敗
                                }
                            }];
}

指紋認証ができたら、パスワード画面を閉じたり、任意の処理を行うということになると思います。

何らかの理由で指紋認証ができなかった場合はerrorの返ってくる値で処理を分岐することができます。

エラーコード(Swift) エラーコード(Objective-C) 説明
AuthenticationFailed LAErrorAuthenticationFailed 認証が失敗した
UserCancel LAErrorUserCancel 「キャンセル」ボタンが押された
UserFallback LAErrorUserFallback 「パスワードを入力」が選択された
SystemCancel LAErrorSystemCancel 何らかの理由によってシステムでキャンセルされた
PasscodeNotSet LAErrorPasscodeNotSet パスワードが未設定
TouchIDNotAvailable LAErrorTouchIDNotAvailable Touch ID が利用できないデバイス・OS
TouchIDNotEnrolled LAErrorTouchIDNotEnrolled 何らかの理由により Touch ID が利用できない

認証が失敗した場合やパスワードを入力した場合にはアプリで設定されたパスワード画面を表示したり、再度ボタンを押させて指紋認証画面を出す等の処理を行うことになると思います。

実装の注意点をいくつか

注意点としては、この機能を使えるのはiOS8からということ。
つまり、指紋認証の機能を使えるかどうか、という判別処理の前にiOS8以上かの判別が必要ということ。

そして、ここ重要なのですが、認証が失敗した後にパスコードを入力させることになると思いますが、認証の失敗の処理部分でソフトウェアキーボード表示ができない場合がありました。
一定の時間をおいてから表示をしようと思っても、なぜかできませんでした。

なので、実装する場合はソフトウェアキーボードを使わずにロック画面を解除するような独自のUIでパスコード画面を実装する方がいいかと思います。

指紋認証の実装自体は簡単なので、パスコードを使った認証画面を使っているアプリは実装したいところです。

詳解 Swift
詳解 Swift

posted with amazlet at 14.11.29
荻原 剛志
SBクリエイティブ
売り上げランキング: 2,336


この記事をシェアする

  • このエントリーをはてなブックマークに追加