本記事ではSwiftでFace IDを使った生体認証を実装する方法について説明します。

環境

こちらの環境で実装しました。

  • Xcodeバージョン: 15.2
  • フレームワーク: UIKit
  • 使用デバイス: iPhone 14 Pro
  • iOSバージョン: 16.5.1

info.plistにPrivacy – Face ID Usage Descriptionを追加

まずはinfo.plistにPrivacy – Face ID Usage Descriptionを追加します。

必要なフレームワークのインポート

実装するファイルにLocalAuthenticationをインポートします。

import LocalAuthentication

顔認証のメソッドを実装

以下のように変数とメソッドを実装します。
生体認証が可能かどうか確認し、可能だったら認証処理を実行するメソッドです。

// 認証成功フラグ
var isFaceAuthSuccessful = false

// 認証登録フラグ
var isFaceAuthEnabled = true

func authenticateUser() {
    // LAContextインスタンスを作成
    let context = LAContext()

    // 認証理由のメッセージを設定
    let reason = "This app uses Touch ID / Face ID to secure your data."

    // 認証エラーを保持するための変数を宣言
    var authError: NSError?

    // Face IDが利用可能かどうかを確認
    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) {
        // 生体認証を実行
        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { (success, error) in
            if success {
                // 認証が成功した場合
                DispatchQueue.main.async {
                    self.showMessage("Authenticated")
                }
                // 認証成功フラグをtrueに設定
                self.isFaceAuthSuccessful = true
            } else {
                // 認証が失敗した場合
                let message = error?.localizedDescription ?? "Failed to authenticate"
                DispatchQueue.main.async {
                    self.showMessage(message)
                }
            }
        }
    } else {
        // Face IDが利用できない場合
        let message = authError?.localizedDescription ?? "canEvaluatePolicy returned false"
        DispatchQueue.main.async {
            self.showMessage(message)
            // 認証登録フラグをfalseに設定
            self.isFaceAuthEnabled = false
        }
    }
}

メソッドを呼び出す部分を実装

メソッドを呼び出す箇所はアプリによるのでどこでも良いかと思いますが、私はテスト的にviewDidAppearメソッド内で呼び出すように実装しました。

override func viewDidAppear(_ animated: Bool) {
    // 顔認証が有効かどうかをチェック
    if (self.isFaceAuthEnabled) {
        // 顔認証を実行
        self.authenticateUser()
    }
}

実際の画面

  • 認証に成功した場合
  • 認証に失敗した場合
  • 複数回失敗するとパスワード入力を提案してくれました。

まとめ

実装方法
  1. Privacy – Face ID Usage Descriptionを追加しました。
  2. Face IDが利用可能かどうかを確認し、認証を実行しました。
  3. 認証が成功した場合の処理と、失敗した場合の処理を作成しました。
考慮すべき点
  1. デバイス依存:
    Face IDやTouch IDは対応デバイスでのみ利用可能です。非対応デバイスでは対応できません。
  2. 認証失敗時の処理:
    認証が失敗した場合のエラー表示やパスコード入力などの代替手段を提供が必要です。

参考文献

https://developer.apple.com/documentation/localauthentication/logging-a-user-into-your-app-with-face-id-or-touch-id
https://developer.apple.com/documentation/localauthentication/