TJBioAuthenticator 免費的 FaceID、TouchID 驗證工具

在 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
}

發表迴響