iPhone Xの実機を入手したのでFace IDを使った認証を試してみた

2017.11.09

ついにiPhone Xを入手!

10月27日に予約してからずっと待っていましたが、ついにiPhone Xが届きました!

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します。
大きな処理の流れとしては以下です。

  1. LAContextクラスのcanEvaluatePolicy(_:error:)メソッドでFace IDが使えるかを確認する
  2. LAContextクラスのevaluatePolicy(_:localizedReason:reply:)メソッドを使って認証処理を実行する
  3. 認証結果に応じた処理を行う
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_sample_app

Face IDが設定されていない場合

Face IDが設定されていない場合にボタンをタップするとcanEvaluatePolicy(_:error:)メソッドでエラーとなり以下のような表示となりました。そのまんまですね。

face_id_not_enrolled

Face IDが設定されている場合

Face IDが設定されている状態でボタンをタップすると以下のようにユーザーにFace IDの使用許可を求めるポップアップが表示されますのでOKをタップします。

face_id_confirmation

ちなみにInfo.plistにNSFaceIDUsageDescriptionキーを含めずに実行した場合、ポップアップが以下のような文言になりました。
試したところ、OKをタップすればこの状態でもFace IDが使えるようですがなんとも気持ち悪いですね。素直にNSFaceIDUsageDescriptionキーを含めた方が良いと思います。

face_id_no_NSFaceIDUsageDescription_key

OKをタップするとFace IDのアイコンが表示され顔を認識する状態になります。

face_id

認証が成功すると以下のような表示になります。

face_id_ok

自分で実装した認証成功時のアラートもちゃんと表示されました。

face_id_ok_alert

顔の認識がうまくできないと以下のようにリトライするかキャンセルするかを選ぶ画面が表示されます。「Face IDをやり直す」をタップすれば再び顔を認識する状態になります。

face_id_retry_or_cancel

一方、キャンセルをタップすると認証は失敗となります。

face_id_canceled

数回Face IDに失敗するとパスワードを入力するかキャンセルするかを選ぶ画面が表示されます。

face_id_password

ここで「パスワードを入力」をタップすると以下のように認証失敗となります。Face IDの認証が失敗したということですね。
この場合は別途パスワード入力画面などを実装する必要がありそうです。

face_id_tap_password

Face IDが使えない時はパスコードで認証させたい場合

その場合はcanEvaluatePolicy(_:error:)メソッドとevaluatePolicy(_:localizedReason:reply:)メソッドで指定しているLAPolicyの値にdeviceOwnerAuthenticationWithBiometricsではなくdeviceOwnerAuthenticationを指定します。

そうすることでFace IDに失敗した場合にiPhoneのパスコードを入力する選択肢が表示され、パスコードによる認証が行えます。

face_id_passcode_or_cancel

face_id_tap_passcord

おわりに

iPhone Xならではの機能であるFace IDを試してみました。
まだ数回試しただけですが、認識スピードがすごいですね!!
ますますiPhoneが快適になった気がします。

参考