iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Mobile Development

ios 的小小實驗室 2 !!系列 第 15

Local Authentication 2 生物辨識的實作

  • 分享至 

  • xImage
  •  

實作的部分

iPhoneOS 的限制:
Touch ID : iOS 8 以上
Face ID : iOS 11 以上 (需使用者同意開啟 FaceID 權限)

  1. 在專案中 import 我們身份驗證的框架
    import LocalAuthentication

  2. Info.plist 的部分

    在使用任何生物辨識技術的專案中,需要在 Info.plist 加入 NSFaceIDUsageDescription 的 key。如果沒有這個 key,系統將不允許你的 App 使用 Face ID。

    NSFaceIDUsageDescription 的 value 是系統在你的 App 首次使用 Face ID 時會向用戶顯示的字串。

    在這字串裡,應清楚地解釋你的 App 需要訪問此身份驗證機制的原因。

    但 Touch ID 的部分,系統不需要另外加上類似的用法說明。

  3. 在畫面中拉一個 UIButton

  4. 在 @IBAction 內

    1. 創建 LAContext 實例
    2. 設置取消按鈕標題
    3. 宣告一個變數接收 canEvaluatePolicy 返回的錯誤
    4. 評估是否可以針對 以下的給定方案 進行身份驗證
      1. deviceOwnerAuthentication 支援 Face ID、Touch ID、Apple Watch、裝置密碼 驗證
      2. deviceOwnerAuthenticationWithBiometrics 支援 Face ID、Touch ID 驗證
    5. 描述使用身份辨識的原因
    6. 評估指定方案
    7. 若使用者沒有設置生物辨識,會自動導向 設定 -> Face/Touch ID & Passcode
    // 創建 LAContext 實例
    let context = LAContext()
    
    // 設置取消按鈕標題
    context.localizedCancelTitle = "Cancel"
    
    // 宣告一個變數接收 canEvaluatePolicy 返回的錯誤
    var error: NSError?
    
    // 評估是否可以針對給定方案進行身份驗證
    // deviceOwnerAuthentication 支援 Face ID 、 Touch ID 驗證
    // deviceOwnerAuthenticationWithBiometrics 支援 Face ID 、 Touch ID 、 裝置密碼 驗證
    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
    
    	// 描述使用身份辨識的原因
    	let reason = "Log in to your account"
    
    	// 評估指定方案
    	context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { (success, error) in
    		if success {
    			DispatchQueue.main.async {
    				print("Login Successful")
    			}
    		}
    		else {
    			DispatchQueue.main.async {
    				print("Login Failed",error?.localizedDescription as Any)
    			}
    		}
    	}
    }
    else {
    	// 若使用者沒有設置生物辨識,會自動導向 設定 -> Face/Touch ID & Passcode
    	if error?.localizedDescription == "Biometry is not enrolled." {
    		print("unset Face ID")
    		let alertController = UIAlertController(title: "Biometrics can't used", message: "please add Face ID", preferredStyle: .alert)
    		let confirmAction = UIAlertAction(title: "ok", style: .default) { action in
    			guard let url = URL(string: "App-prefs:PASSCODE") else { return }
    			if (UIApplication.shared.canOpenURL(url)) {
    				UIApplication.shared.open(url) { success in
    					print(success)
    				}
    			}
    		}
    		alertController.addAction(confirmAction)
    		self.present(alertController, animated: true, completion: nil)
    	}
    	print("Failed",error?.localizedDescription as Any)
    }
    
  • Error事件:

    kLAErrorAuthenticationFailed = 驗證資訊出錯

    kLAErrorUserCancel = 使用者取消驗證

    kLAErrorUserFallback = 使用者選擇其他驗證方式

    kLAErrorSystemCancel = 被系統取消

    kLAErrorPasscodeNotSet = iPhone沒設定密碼

    kLAErrorTouchIDNotAvailable = 使用者裝置不支援Touch ID

    kLAErrorTouchIDNotEnrolled = 使用者裝置沒有設定Touch ID

    kLAErrorTouchIDLockout = 功能被鎖定(五次),下一次需要輸入手機密碼

    kLAErrorAppCancel = 在驗證中被其他app終止


  • 測試結果:
    • deviceOwnerAuthentication:
      若本身手機沒設 Face ID ,程式會自動使用密碼登入

    • deviceOwnerAuthenticationWithBiometrics:
      若本身手機沒設 Face ID ,則會丟出 Failed Optional("Biometry is not enrolled.")


GitHub - Local Authentication


上一篇
Local Authentication 1 生物辨識的介紹
下一篇
AVCaptureVideoPreviewLayer 1 - 掃描 QRCode - 設定權限、宣告變數
系列文
ios 的小小實驗室 2 !!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言