效果 想必大家對 iPhone 的指紋解鎖功能已經相當的熟悉了。來看看效果吧! Local Authentication 概述 Local Authentication 框架提供了按照指定的安全策略請求用戶授權(本地授權)的工具。例如, 通過 Touch ID 請求用戶授權。 LAContext L ...
效果
想必大家對 iPhone 的指紋解鎖功能已經相當的熟悉了。來看看效果吧!
Local Authentication
- 概述
- Local Authentication 框架提供了按照指定的安全策略請求用戶授權(本地授權)的工具。例如, 通過 Touch ID 請求用戶授權。
- LAContext
- LAContext 提供了用戶授權的上下文。在該上下文中,你可以獲取用戶授權的相關信息。通常會基於用戶的授權狀態來進行相應的操作。
- 授權策略
如圖
上圖為官方文檔的截圖,下圖是 Xcode 的 library 中的截圖(他們是有出入的哦)
- LAPolicyDeviceOwnerAuthenticationWithBiometrics
- 可以簡單的理解為,基於 TouchID 的授權;若 Touch ID 不可用,將會授權失敗。在後面我們會詳細闡述這種授權方式
- Touch ID,將在錯誤輸入 5 次後被鎖定。鎖定後,需要輸入密碼來解鎖
- LAPolicyDeviceOwnerAuthentication
- 支持兩種授權方式,即:Touch ID 和 輸入密碼
- 優先以 Touch ID 方式進行授權,若 Touch ID 和 輸入密碼都不用,將授權失敗
- 輸入密碼授權,將在錯誤輸入 6 次後被鎖定
- 請求用戶授權
邏輯
- 步驟
- 創建授權上下文
- 初始化授權相關信息
判斷是否支持指定的授權策略
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * _Nullable *)error
註意:若授權上下文為空(即:context = nil), 此時進行判斷,會失敗,且 error.code 為 0(初始值)
- 若支持,則執行下一步;否則,授權失敗,根據授權失敗信息執行相關操作,錯誤類型如下
- 該設備不支持 Touch ID
- 未設置密碼
- 未註冊 Touch ID
按照指定的策略請求用戶授權
- (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void (^)(BOOL success, NSError *error))reply
註意:請不要再 Block reply 中在此判斷是否支持指定的策略,及調用 - canEvaluatePolicy:error:;否則會死迴圈
- 根據用戶授權狀態進行下一步操作
- 用戶取消了授權
- 用戶點擊了“輸入密碼”按鈕
- 您已授權失敗3次
- 指紋被鎖定
- 應用程式進入後臺
- LAPolicy
- LAPolicyDeviceOwnerAuthenticationWithBiometrics,Touch ID 驗證
- LAPolicyDeviceOwnerAuthentication,密碼驗證(iOS 9.0)
- LAError(失敗信息)
- 授權策略是否可用
- LAErrorPasscodeNotSet,沒有設置密碼
- LAErrorTouchIDNotEnrolled,沒有註冊 Touch ID
- kLAErrorTouchIDNotAvailable,該設備不支持 Touch ID
- 授權失敗
- LAErrorUserCancel,用戶取消授權
- LAErrorUserFallback,Touch ID 授權失敗的情況下,用戶點擊“輸入密碼”按鈕
- LAErrorAuthenticationFailed,授權失敗三次
- LAErrorTouchIDLockout(iOS 9.0),Touch ID 被鎖定(失敗五次)
- LAErrorSystemCancel,應用進入後臺時,授權失敗
- 其他
- LAErrorAppCancel(iOS 9.0)
- LAErrorInvalidContext(iOS 9.0)
- 授權策略是否可用
Touch ID Authentication
使用 Touch ID 進行用戶授權
- (IBAction)authenticationButtonClick:(UIButton *)sender { // 1.創建授權上下文 LAContext *context = [[LAContext alloc] init]; // 2.初始化授權相關的信息 NSError *authError = nil; NSString *localizedReasoningString = @"error"; bool isAvailable = false; isAvailable = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]; // 3.判斷是否支持指定的授權策略 if (isAvailable) { // 5.按照指定策略請求用戶授權 [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:localizedReasoningString reply:^(BOOL success, NSError * _Nullable error) { if (success) { NSLog(@"success"); } else { // 6.根據用戶授權狀態進行下一步操作 switch (error.code) { case LAErrorUserCancel: NSLog(@"用戶取消了授權 - %@", error.localizedDescription); break; case LAErrorUserFallback: NSLog(@"用戶點擊了“輸入密碼”按鈕 - %@", error.localizedDescription); break; case LAErrorAuthenticationFailed: NSLog(@"您已授權失敗3次 - %@", error.localizedDescription); break; case LAErrorTouchIDLockout: NSLog(@"指紋被鎖定 - %@", error.localizedDescription); break; case LAErrorSystemCancel: NSLog(@"應用程式進入後臺 - %@", error.localizedDescription); break; default: NSLog(@"++%@--%zd", error.localizedDescription, error.code); break; } } }]; } else { // 4.根據授權失敗信息執行相關操作 switch (authError.code) { case LAErrorPasscodeNotSet: NSLog(@"未設置密碼 - %@", authError.localizedDescription); break; case LAErrorTouchIDNotEnrolled: NSLog(@"未註冊 Touch ID - %@", authError.localizedDescription); break; case kLAErrorTouchIDNotAvailable: NSLog(@"該設備不支持 Touch ID - %@", authError.localizedDescription); break; default: NSLog(@"--%@--%zd", authError.localizedDescription, authError.code); break; } } }