自從公司的PM買了iPhone X后,于是就走上了適配這條不歸路。原先項(xiàng)目里有接入TouchID,一切都是那么的完美。直到某天PM拿著手機(jī)給我看了張圖.

FaceID權(quán)限
PM說iPhoneX是高端用戶,就不要讓他們看到TouchID字眼。嗯好的,你都是對(duì)的。然后我把這個(gè)功能模塊封裝了一下,后面會(huì)提供demo。
開啟權(quán)限
在info.plist文件里設(shè)置NSFaceIDUsageDescription就ok。這個(gè)可以理解為開啟FaceID權(quán)限,就相當(dāng)于調(diào)定位、相冊(cè)那些權(quán)限一樣。
引入框架
#import <LocalAuthentication/LocalAuthentication.h>
驗(yàn)證方式
-
LAPolicyDeviceOwnerAuthenticationWithBiometrics(只有指紋/FaceID驗(yàn)證功能) -
LAPolicyDeviceOwnerAuthentication(包含指紋/FaceID驗(yàn)證和密碼驗(yàn)證)
調(diào)用前判斷
NSString *message = IS_IPHONE_X ? @"面容 ID 短時(shí)間內(nèi)失敗多次,需要驗(yàn)證手機(jī)密碼" : @"請(qǐng)把你的手指放到Home鍵上";// 當(dāng)deviceType為L(zhǎng)APolicyDeviceOwnerAuthentication的時(shí)候,iPhone X會(huì)需要前面這段描述
NSInteger deviceType = LAPolicyDeviceOwnerAuthenticationWithBiometrics;//單純指紋或FaceID,LAPolicyDeviceOwnerAuthentication會(huì)有密碼驗(yàn)證
LAContext *laContext = [[LAContext alloc] init];
laContext.localizedFallbackTitle = @""; // 隱藏左邊的按鈕(默認(rèn)是忘記密碼的按鈕)
NSError *error = nil;
BOOL isSupport = [laContext canEvaluatePolicy:(deviceType) error:&error];
調(diào)用FaceID或者TouchID(方法是同一個(gè),系統(tǒng)會(huì)自己判斷)
if (isSupport) {
[laContext evaluatePolicy:(deviceType) localizedReason:message reply:^(BOOL s, NSError * _Nullable error) {
if (s) {
success();
}else {
failure(error, LAContextErrorAuthorFailure);
}
}];
}else {
failure(error, LAContextErrorAuthorNotAccess);
}
-
localizedReason:這個(gè)參數(shù)不可為空,否則會(huì)crash
回調(diào)失敗的處理(只記錄了幾個(gè)我在項(xiàng)目中測(cè)試出來的)
error.code == -8 :出TouchID嘗試次數(shù)或FaceID嘗試次數(shù),已被鎖
error.code == -7 :未開啟TouchID權(quán)限(沒有可用的指紋)
error.code == -6 :iPhoneX設(shè)置里面沒有開啟FaceID權(quán)限/非iPhoneX手機(jī)且該手機(jī)不支持TouchID(如iPhone5、iPhone4s)
大體上就是這些,這里是demo。如果有表述錯(cuò)誤的,歡迎指正??