LocalAuthentication iOSで生体認証(Face ID, Touch ID)のまとめ
- Info.plist(Face ID使用時)
<key>NSFaceIDUsageDescription</key>
<string>FaceID使います。</string>
LAPolicy
//認証失敗時にパスワード入力の選択が出るが、選択してもダイアログが閉じるだけ。
* deviceOwnerAuthenticationWithBiometrics
// 認証失敗時にパスワード入力の選択が出る、選択するとパスワード入力画面が出る。
* deviceOwnerAuthentication
★ Touch ID、Face ID用コード
import UIKit
import LocalAuthentication
class ViewController: UIViewController {
@IBAction func tappedAuthbutton(_ sender: UIButton) {
let context = LAContext();
var error :NSError?
// Touch ID が利用できるデバイスか確認する
if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
// 利用できる場合は指紋認証を要求する
context.evaluatePolicy(
LAPolicy.deviceOwnerAuthenticationWithBiometrics,
localizedReason:"指紋認証メッセージ") { success, error in
// 認証成功
if #available(iOS 11.0, *) /* iOS11以降 */ {
if (success) {
switch context.biometryType {
case .faceID:
// Face IDが利用出来る
print("Available FaceID")
case .touchID:
// Touch IDが利用できる
print("Available TouchID")
case .none:
// Face ID, Touch IDの利用が出来ない (この場合、この条件には入ってこないはず)
break
}
} else {
print("許可しないを選択")
}
} else {
// Fallback on earlier versions
if (success) {
// 指紋認証成功
print("Success")
} else {
// 指紋認証失敗
print("Failed")
}
}
if let error = error {
print("An Error Occurred: \(String(describing: error))")
}
}
} else {
// 許可しないで、利用できない場合
print("An Error Occurred: \(String(describing: error))")
}
}
}
★ Touch ID,Face ID & パスコード入力
import UIKit
import LocalAuthentication
class ViewController: UIViewController {
@IBAction func tappedAuthbutton(_ sender: UIButton) {
let context = LAContext();
var error :NSError?
// Touch ID が利用できるデバイスか確認する
if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: &error) {
// 利用できる場合は指紋認証を要求する
context.evaluatePolicy(
LAPolicy.deviceOwnerAuthentication,
localizedReason:"指紋認証メッセージ") { success, error in
// 認証成功
if #available(iOS 11.0, *) /* iOS11以降 */ {
if (success) {
switch context.biometryType {
case .faceID:
// Face IDが利用出来る
print("Available FaceID")
case .touchID:
// Touch IDが利用できる
print("Available TouchID")
case .none:
// Face ID, Touch IDの利用が出来ない (この場合、この条件には入ってこないはず)
break
}
} else {
print("許可しないを選択")
}
} else {
// Fallback on earlier versions
if (success) {
// 指紋認証成功
print("Success")
} else {
// 指紋認証失敗
print("Failed")
}
}
if let error = error {
print("An Error Occurred: \(String(describing: error))")
}
}
} else {
// 許可しないで、利用できない場合
print("An Error Occurred: \(String(describing: error))")
}
}
}
LAError.Code種別 | Error Code | 説明 |
---|---|---|
authenticationFailed | -1 | ユーザーが生体認証を利用するにあたり必要な情報を獲得できなかった為、認証に失敗 |
appCancel | -9 | アプリ側でキャンセルが掛かった |
invalidContext | -10 | 何かしらのエラー |
notInteractive | -1004 | インタラクティブではない? |
passcodeNotSet | -5 | 端末にパスコードがセットされていない |
systemCancel | -4 | システムで認証がキャンセルされた |
touchIDLockout | -8 | Face ID/Touch IDがロックアウトされた |
touchIDNotAvailable | -6 | 端末でFace ID/Touch IDを使用できない為、認証できなかった |
touchIDNotEnrolled | -7 | 指紋認証に失敗 |
userCancel | -2 | 認証ダイアログでユーザがキャンセルボタンを押した |
userFallback | -3 | ユーザが認証ダイアログでFallbackしたが、認証ポリシーにFallbackが使用できなかった。 |