LoginSignup
4
4

More than 5 years have passed since last update.

MacBook Pro 2016に付いたTouch IDを使って認証をしてみる

Posted at

MacBook Pro 2016にiPhoneやiPadと同じようにTouch IDが付きました。そこで、MacBook ProのTouch IDを使って認証を行うコードを試してみました。

Local Authenticator

Touch IDを使って認証を行うには、Local Authenticatorを使用します。Local Authenticatorは、macOS 10.10以降、iOS 8.0以降で使用可能なフレームワークです。しかし、この記事のコードは、macOS 10.12以降で定義された定数を使っているので、macOS 10.12以降でしか動作しません。

サンプルコード

次のコードは、Local Authenticatorを使って認証を行って、その結果をアラートで表示するというものです。プロジェクトはGitHubの次のURLに置いています。

GitHub: akirark/Authentication
https://github.com/akirark/Authentication

ViewController.swift
@IBAction func authorize(_ sender: Any) {
    let context = LAContext()
    let reason = "管理者権限が必要なアクション"
    var error: NSError?

    // Touch IDかパスワードを使った認証が可能かどうかを調べる
    if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
        // Touch IDを使って認証を行う
        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason, reply: { (success, evaluateError) in
            // 認証後に実行される処理
            DispatchQueue.main.async {
                if success {
                    // 認証できた
                    self.show(message: "認証成功")
                } else {
                    if evaluateError != nil {
                        self.show(error: evaluateError! as NSError)
                    } else {
                        self.show(message: "予期しないエラーにより、認証失敗")
                    }
                }
            }
        })
    } else {
        if error != nil {
            self.show(error: error!)
        } else {
            self.show(message: "予期しないエラーにより、確認失敗")
        }
    }
}

deviceOwnerAuthenticationdeviceOwnerAuthenticationWithBiometricsの違い

evaluatePolicyメソッドでdeviceOwnerAuthenticationWithBiometricsを指定すると、Touch IDを使った認証が必須となります。ダイアログには「パスワードを使用する」という選択肢が表示されますが、こちらを選択すると認証失敗となります。deviceOwnerAuthenticationを指定した場合は、「パスワードを使用する」を選択すると、パスワードの入力ダイアログが表示されます。

TouchIDの付いたマシンで動かすと

TouchIDを使った認証ダイアログが表示されます。タッチバーにもメッセージが表示され、指紋の入力待ちになります。deviceOwnerAuthenticationに変更した場合はパスワードの入力待ちダイアログになります。

TouchIDが付いていないマシンで動かすと

認証失敗扱いになります。deviceOwnerAuthenticationに変更した場合はパスワードの入力待ちダイアログになります。

管理者権限を持っていないユーザーで実行すると

認証失敗になります。

evaluatePolicyreplyは別キューで実行される

evaluatePolicyreplyはメインキューでは無く、別キューで実行されます。そのため、アラートを表示するなど、GUIに関する処理はメインキューで実行するようにDispatchQueue.async経由で行う必要があります。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4