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
@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: "予期しないエラーにより、確認失敗")
}
}
}
deviceOwnerAuthentication
とdeviceOwnerAuthenticationWithBiometrics
の違い
evaluatePolicy
メソッドでdeviceOwnerAuthenticationWithBiometrics
を指定すると、Touch IDを使った認証が必須となります。ダイアログには「パスワードを使用する」という選択肢が表示されますが、こちらを選択すると認証失敗となります。deviceOwnerAuthentication
を指定した場合は、「パスワードを使用する」を選択すると、パスワードの入力ダイアログが表示されます。
TouchIDの付いたマシンで動かすと
TouchIDを使った認証ダイアログが表示されます。タッチバーにもメッセージが表示され、指紋の入力待ちになります。deviceOwnerAuthentication
に変更した場合はパスワードの入力待ちダイアログになります。
TouchIDが付いていないマシンで動かすと
認証失敗扱いになります。deviceOwnerAuthentication
に変更した場合はパスワードの入力待ちダイアログになります。
管理者権限を持っていないユーザーで実行すると
認証失敗になります。
evaluatePolicy
のreply
は別キューで実行される
evaluatePolicy
のreply
はメインキューでは無く、別キューで実行されます。そのため、アラートを表示するなど、GUIに関する処理はメインキューで実行するようにDispatchQueue.async
経由で行う必要があります。