1.應用場景
指紋解鎖、指紋登錄、指紋支付
2.注意事項
5S開始才有的指紋識別, 目前絕大部分的設備都可以支持
iOS8的時候蘋果開放了指紋識別的API
需要LocalAuthentication框架
3.實現代碼
-(void)OnTouchIDBtn:(UIButton *)sender{
//判斷版本號是否大于8.0 小于8.0則不支持指紋解鎖
if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
[self createAlterView:@"不支持指紋識別"];
return;
}else{
//獲取指紋傳感器上下文
LAContext *ctx = [[LAContext alloc] init];
//設置 輸入密碼 按鈕的標題
ctx.localizedFallbackTitle = @"驗證登錄密碼";
//設置 取消 按鈕的標題 iOS10之后
ctx.localizedCancelTitle = @"取消";
//檢測指紋數據庫更改 驗證成功后返回一個NSData對象,否則返回nil
NSData *date = ctx.evaluatedPolicyDomainState;
NSLog(@"%@",date);
// 這個屬性應該是類似于支付寶的指紋開啟應用,如果你打開他解鎖之后,按Home鍵返回桌面,再次進入支付寶是不需要錄入指紋的。因為這個屬性可以設置一個時間間隔,在時間間隔內是不需要再次錄入。默認是0秒,最長可以設置5分鐘
ctx.touchIDAuthenticationAllowableReuseDuration = 5;
/*---------------------------------------------------------------------*/
//iOS9之前用
//LAPolicyDeviceOwnerAuthenticationWithBiometrics
//連續三次指紋識別錯誤后,會自動彈出提示框(彈框需手動設置,系統僅返回一個error,根據error.code進行判斷彈框內容),再2次指紋識別失敗后,也就是 3 + 2 = 5次指紋識別失敗后,Touch ID功能被鎖定,就只能通過密碼來進行身份驗證和解鎖Touch ID 功能(僅能通過屏幕解鎖或系統設置進行解鎖,不能彈出密碼解鎖視圖)。
NSError * error;
_localizedReason = @"通過Home鍵驗證已有手機指紋";
// 判斷設備是否支持指紋識別
if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
// 驗證指紋是否匹配,需要彈出輸入密碼的彈框的話:
[ctx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:_localizedReason reply:^(BOOL success, NSError * error) {
if (success) {
[self createAlterView:@"指紋驗證成功"];
}else{
// 錯誤碼 error.code
NSLog(@"指紋識別錯誤描述 %@",error.description);
//如果LAPolicyDeviceOwnerAuthenticationWithBiometrics
// -1: 連續三次指紋識別錯誤
// -2: 在TouchID對話框中點擊了取消按鈕
// -3: 在TouchID對話框中點擊了輸入密碼按鈕
// -4: TouchID對話框被系統取消,例如按下Home或者電源鍵
// -8: 連續五次指紋識別錯誤,TouchID功能被鎖定,下一次需要輸入系統密碼
NSString * message;
switch (error.code) {
case -1://LAErrorAuthenticationFailed
message = @"已經連續三次指紋識別錯誤了,請輸入密碼驗證";
_localizedReason = @"指紋驗證失敗";
break;
case -2:
message = @"在TouchID對話框中點擊了取消按鈕";
return ;
break;
case -3:
message = @"在TouchID對話框中點擊了輸入密碼按鈕";
break;
case -4:
message = @"TouchID對話框被系統取消,例如按下Home或者電源鍵或者彈出密碼框";
break;
case -8:
message = @"TouchID已經被鎖定,請前往設置界面重新啟用";
break;
default:
break;
}
//彈框提示
[self createAlterView:message];
}
}];
}else{
if (error.code == -8) {
[self createAlterView:@"由于五次識別錯誤TouchID已經被鎖定,請前往設置界面重新啟用"];
}else{
[self createAlterView:@"TouchID沒有設置指紋,請前往設置"];
}
}
/*---------------------------------------------------------------------*/
//iOS9之后用
//LAPolicyDeviceOwnerAuthentication ;
//連續三次指紋識別錯誤后,會自動彈出密碼框,通過Touch ID的密碼進行身份驗證,如果此時取消密碼驗證,再1次指紋識別失敗后,也就是 3 + 1 = 4次指紋識別失敗后,Touch ID功能被鎖定,就只能通過密碼來進行身份驗證和解鎖Touch ID 功能(會彈出密碼解鎖視圖)。
NSError * error;
_localizedReason = @"通過Home鍵驗證已有手機指紋";
// 判斷設備是否支持指紋識別
if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
// 驗證指紋是否匹配,需要彈出輸入密碼的彈框的話:
[ctx evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:_localizedReason reply:^(BOOL success, NSError * error) {
if (success) {
[self createAlterView:@"指紋驗證成功"];
}else{
// 錯誤碼 error.code
NSLog(@"指紋識別錯誤描述 %@",error.description);
//如果LAPolicyDeviceOwnerAuthentication,在error中只能出現-2的錯誤代碼
// -2: 在TouchID對話框中點擊了取消按鈕
//取消時不會出現createAlterView所以不需要設置失敗彈窗
}
}];
}else{
[self createAlterView:@"TouchID沒有設置指紋,請前往設置"];
}
/*---------------------------------------------------------------------*/
}
}
- (void)createAlterView:(NSString *)message{
UIAlertController * vc = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:vc animated:NO completion:^(void){
[NSThread sleepForTimeInterval:1.0];
[vc dismissViewControllerAnimated:YES completion:nil];
}];
}
4.常見錯誤整理
/*
typedef NS_ENUM(NSInteger, LAError)
{
//授權失敗
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
//用戶取消Touch ID授權
LAErrorUserCancel = kLAErrorUserCancel,
//用戶選擇輸入密碼
LAErrorUserFallback = kLAErrorUserFallback,
//系統取消授權(例如其他APP切入)
LAErrorSystemCancel = kLAErrorSystemCancel,
//系統未設置密碼
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
//設備Touch ID不可用,例如未打開
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
//設備Touch ID不可用,用戶未錄入
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
} NS_ENUM_AVAILABLE(10_10, 8_0);
LAErrorTouchIDLockout NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout,
LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
其中,LAErrorTouchIDLockout是在8.0中也會出現的情況,但并未歸為單獨的錯誤類型,這個錯誤出現,源自用戶多次連續使用Touch ID失敗,Touch ID被鎖,需要用戶輸入密碼解鎖,這個錯誤的交互LocalAuthentication.framework已經封裝好了,不需要開發者關心。
LAErrorAppCancel和LAErrorSystemCancel相似,都是當前軟件被掛起取消了授權,但是前者是用戶不能控制的掛起,例如突然來了電話,電話應用進入前臺,APP被掛起。后者是用戶自己切到了別的應用,例如按home鍵掛起。
LAErrorInvalidContext很好理解,就是授權過程中,LAContext對象被釋放掉了,造成的授權失敗。
*/