iPhone Xの実機を入手したのでFace IDを使った認証を試してみた
ついにiPhone Xを入手!
10月27日に予約してからずっと待っていましたが、ついにiPhone Xが届きました!
ということでiPhone Xならではの機能であるFace IDを使った認証を試してみました。
検証環境
本エントリは以下の環境で検証を行っています。
- macOS Sierra バージョン 10.12.6
- Xcode Version 9.1 (9B55)
- Swift 4
- iPhone X 実機 iOS 11.1
Face IDを使った認証処理の準備
Face IDをアプリで使うにはInfo.plistにNSFaceIDUsageDescription
キーを含める必要があります。
値にはStringでFace IDを使う理由・目的を記載します。
<key>NSFaceIDUsageDescription</key> <string>認証のために使います</string>
ここに記載した文言は、ユーザーにFace IDの使用許可を求めるポップアップに表示されます。
コードを書く
あとはコードを書くだけです。
LocalAuthenticationフレームワークを使うのでimportします。
大きな処理の流れとしては以下です。
LAContext
クラスのcanEvaluatePolicy(_:error:)
メソッドでFace IDが使えるかを確認するLAContext
クラスのevaluatePolicy(_:localizedReason:reply:)
メソッドを使って認証処理を実行する- 認証結果に応じた処理を行う
import UIKit import LocalAuthentication class ViewController: UIViewController { @IBAction func didTapFaceIDButton(_ sender: Any) { let ctx = LAContext() let localizedReasonString = "ロックを解除" var error: NSError? if ctx.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) { ctx.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: localizedReasonString) { (success, evaluateError) in if success { let ac = UIAlertController(title: "認証成功", message: "", preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) self.present(ac, animated: true) } else { let ac = UIAlertController(title: "認証失敗", message: evaluateError?.localizedDescription, preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) self.present(ac, animated: true) } } } else { print("Face IDが利用できない") let ac = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) present(ac, animated: true) } } }
実行結果
アプリを起動するとボタンが1つだけある画面が表示されます。
Face IDが設定されていない場合
Face IDが設定されていない場合にボタンをタップするとcanEvaluatePolicy(_:error:)
メソッドでエラーとなり以下のような表示となりました。そのまんまですね。
Face IDが設定されている場合
Face IDが設定されている状態でボタンをタップすると以下のようにユーザーにFace IDの使用許可を求めるポップアップが表示されますのでOKをタップします。
ちなみにInfo.plistにNSFaceIDUsageDescription
キーを含めずに実行した場合、ポップアップが以下のような文言になりました。
試したところ、OKをタップすればこの状態でもFace IDが使えるようですがなんとも気持ち悪いですね。素直にNSFaceIDUsageDescription
キーを含めた方が良いと思います。
OKをタップするとFace IDのアイコンが表示され顔を認識する状態になります。
認証が成功すると以下のような表示になります。
自分で実装した認証成功時のアラートもちゃんと表示されました。
顔の認識がうまくできないと以下のようにリトライするかキャンセルするかを選ぶ画面が表示されます。「Face IDをやり直す」をタップすれば再び顔を認識する状態になります。
一方、キャンセルをタップすると認証は失敗となります。
数回Face IDに失敗するとパスワードを入力するかキャンセルするかを選ぶ画面が表示されます。
ここで「パスワードを入力」をタップすると以下のように認証失敗となります。Face IDの認証が失敗したということですね。
この場合は別途パスワード入力画面などを実装する必要がありそうです。
Face IDが使えない時はパスコードで認証させたい場合
その場合はcanEvaluatePolicy(_:error:)
メソッドとevaluatePolicy(_:localizedReason:reply:)
メソッドで指定しているLAPolicy
の値にdeviceOwnerAuthenticationWithBiometrics
ではなくdeviceOwnerAuthentication
を指定します。
そうすることでFace IDに失敗した場合にiPhoneのパスコードを入力する選択肢が表示され、パスコードによる認証が行えます。
おわりに
iPhone Xならではの機能であるFace IDを試してみました。
まだ数回試しただけですが、認識スピードがすごいですね!!
ますますiPhoneが快適になった気がします。