在 iOS 的開發過程中,難免會遇到生物識別的開發,之前介紹過「TDTouchID」這個免費的 FaceID、TouchID 驗證工具,不過「TDTouchID」是 Objective-C 版,如果你是用 Swift 開發,應該要下載 TJBioAuthenticator 這個工具,一樣提供了相當完善的封裝,個人覺得用起來很好用,你應該來試試。
◎◎軟體小檔案◎◎
■ 軟體名稱:TJBioAuthenticator
■ 軟體版本:20191102
■ 軟體介面:英文
■ 支援系統:iOS 開發
■ 軟體下載:【點我下載】
在 TJBioAuthenticator 中,主要是使用以下的函式做為驗證。
func authenticateUserWithBiometrics(reason: String = "", fallbackTitle: String? = "", cancelTitle: String? = "", success successBlock:@escaping AuthenticationSuccess, failure failureBlock:@escaping AuthenticationFailure) {
let reasonString = reason.isEmpty ? TJBioAuthenticator.shared.defaultBiometricAuthenticationReason() : reason
let context = LAContext()
context.localizedFallbackTitle = fallbackTitle
if #available(iOS 10.0, *) {
context.localizedCancelTitle = cancelTitle
} else {
// Fallback on earlier versions
}
// evaluate policy
TJBioAuthenticator.shared.evaluate(policy: LAPolicy.deviceOwnerAuthenticationWithBiometrics, with: context, reason: reasonString, success: successBlock, failure: failureBlock)
}
要使用臉部辨識或是指紋辨識很簡單,只要用這樣使用就好了。
TJBioAuthenticator.shared.authenticateUserWithBiometrics(success: {
// Biometric Authentication success
self.showSuccessAlert()
}) { (error) in
// Biometric Authentication unsuccessful
switch error{
case .biometryLockedout:
self.executePasscodeAuthentication()
default:
self.presentAlert(withTitle: "Error", message: error.getMessage())
break
}
}
因為無論驗證成功或是驗證失敗,都是在 block 中,因此無法更新 UI,所以函式一定要加上 DispatchQueue,讓函式能在 main thread 執行,如下.:
func showSuccessAlert() {
DispatchQueue.main.async {
self.presentAlert(withTitle: "Success", message: "Login successful")
}
}
而要判斷裝置是否支援生物識別,也只這樣使用:
let isBiometricAvailable = TJBioAuthenticator.shared.isBiometricAuthenticationAvailable()
最後,來提一下這隻程式的 bug,他有一個函式是驗證是否支援臉部辨識,如下:
func isFaceIDAvailable() -> Bool {
if #available(iOS 11.0, *) {
return (LAContext().biometryType == .faceID)
}
return false
}
建議將以上的函式改成如下,我們才可以支援此裝置是否支援臉部辨識:
func isFaceIDAvailable() -> Bool {
if #available(iOS 11.0, *) {
let context = LAContext()
var error: NSError? = nil
context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error)
return (context.biometryType == .faceID)
}
return false
}