Swift で Face ID や Touch ID を使って認証する方法
ここでは、Swift で Face ID や Touch ID を使って認証する方法をご説明します。
Face ID・Touch ID を使う iOS アプリの準備をする
まずはテスト用にボタンをタップして、Face ID・Touch ID で認証するための、簡単な iOS アプリを作ります。
Xcode で [iOS] の [App] の新規プロジェクトを作成します。
デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Button をひとつ追加して、Title を Login with Face ID にしておきます。
そのボタンから、loginButtonTapped という名前で TouchUpInside のアクションを作っておきます。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func loginButtonTapped(_ sender: Any) {
}
}
ボタンの追加の方法や、アクションの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。
Swift で Face ID や Touch ID を使って認証する方法
今回は、Face ID や Touch ID で認証できない時は、パスコードでも認証できるようにします。
最初に Face ID を使用するために、Privacy - Face ID Usage Description を info.plist に追加しておきます。
それでは、iOS アプリで Swift で Face ID や Touch ID を使って認証するコードを書いていきましょう。
LocalAuthentication framework を使うので、LocalAuthentication を import しておきます。
そして、loginButtonTapped() を次のように変更します。
import UIKit
import LocalAuthentication
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func loginButtonTapped(_ sender: Any) {
let laContext = LAContext()
var cepError:NSError?
if laContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &cepError) {
let reason = "Log in to your account"
laContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) {
success, epError in
if success {
print("Success!")
} else {
print("Error A: \(epError?.localizedDescription ?? "Failed to evaluate policy")")
}
}
} else {
print("Error B: \(cepError?.localizedDescription ?? "Can't evaluate policy")")
}
}
}
loginButtonTapped() のコードをご説明します。
11 行目で LAContext を定義します。 LAContext は Face ID や Touch ID を使って認証をハンドルするためのクラスです。
12 行目では、エラーを受け取るための変数を定義しています。
14 行目で canEvaluatePolicy(_:error:)メソッドを使って、deviceOwnerAuthentication ポリシーで認証できるかをチェックしています
Face ID や Touch ID で認証できない時はエラーにしたい時は deviceOwnerAuthenticationWithBiometrics ポリシーを指定してください。
ポリシーが評価できる時は canEvaluatePolicy(_:error:)メソッドが true を返します。
できない時は false を返し、cepError にエラーの内容が入ってくるので、27 行目でエラーを print しています。
続いて 17 行目で evaluatePolicy(_:localizedReason:reply:) メソッドを使って、deviceOwnerAuthentication ポリシーで、Face ID や Touch ID を使っての認証を評価しています。
Face ID や Touch ID の認証が失敗した時やサポートされていない時はパスコードでの認証が可能です。
Face ID や Touch ID の認証ができない時にエラーにしてしまいたい時は、deviceOwnerAuthenticationWithBiometrics ポリシーを指定してください。
認証が成功すると success が true になるので、21 行目で Success! を print しています。
ログインに使う時は、ログイン成功時の処理をここで行います。
エラーの時は、epError にエラーの内容が入ってくるので、23 行目でエラーを print しています。
Swift で Face ID や Touch ID を使って認証するコードは以上です。
iOS アプリを iPhone にインストールしてテストする
作ったアプリを iPhone や iPad にインストールしてテストします。
作った iOS アプリを iPhone にインストールする方法がわからない方は「Xcode からアプリを iPhone にインストールして実行する方法」をご覧ください。
フェイス ID をサポートしている iPhone を指定してこのアプリを実行すると、以下のような画面が表示されます。
Login with Face ID ボタンをタップすると、一度目は Face ID を使う許可を求めるダイアログが表示されるので、OK を選択します。
そうすると、フェイス ID の認証が実行され、認証に成功した時は Xcode の Output 画面に Success! と表示されます。
エラーのケースですが、ユーザーが認証を途中でキャンセルした時は Error A: Authentication canceled. が print されました。
canEvaluatePolicy に渡すポリシーを deviceOwnerAuthenticationWithBiometrics にして、Face ID を許可しないと Error B: Biometry is not available. が print されました。
localizedDescription ではなく、エラーのコードでエラーの内容を判別したい時は LAError.Code のリファレンスを参照してください。
この iOS アプリを、Face ID をサポートしておらず、Touch ID をサポートしているデバイスにインストールして実行すると、次のように Touch ID の認証が行われます。
以上、Swift で Face ID や Touch ID を使って認証する方法をご説明しました。