生体認証を初めて実装したので、次に実装する際に忘れないよう備忘録。
##実装の準備
最初にLocalAuthenticationをimportする。
BiometricsTest.swift
import LocalAuthentication
続いてinfo.plistの中に、
Privacy - Face ID Usage Description
を設定する。位置情報等と同じでPrivacyの使用目的が必要。
##実装
まずは、端末が生体認証に対応しているかどうかを確認する。
BiometricsTest.swift
/// 生体認証が利用可能かどうか
func canUseBiometrics() -> Bool {
let context = LAContext()
var error: NSError? = nil
let result = context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error)
guard !result else { return true }
if let error = error {
// iOS11以降とそれ以前ではErrorのコード名が異なるため、場合分け
if #available(iOS 11.0, *) {
switch error.code {
case LAError.biometryNotEnrolled.rawValue, LAError.biometryLockout.rawValue:
return true
default:
return false
}
} else {
switch error.code {
case LAError.touchIDNotEnrolled.rawValue, LAError.touchIDLockout.rawValue:
return true
default:
return false
}
}
}
return false
}
注意するのは、指紋または顔認証が設定されていない場合falseが返ってくること。また、端末にPassCodeが設定されていない場合もfalseが返ってくる。
続いて、実際に生体認証を実行する
BiometricsTest.swift
/// 生体認証を実行する
func doBiometricsAuthentication() {
let context = LAContext()
// 生体認証を使う理由。空文字だと失敗扱いになるので、必ず文字を入れる
let reason = "ロックを解除"
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { (success, evaluateError) in
if success {
print("Success!!")
} else {
guard let error = evaluateError as NSError? else {
print("Error")
return
}
print("\(error.code): \(error.localizedDescription)")
}
}
}
以上で生体認証を使うことができる。
BiometricsTest.swift
@IBAction func actionBiometricsAuthentication(_ sender: Any) {
if canUseBiometrics() {
doBiometricsAuthentication()
}
}