iOS 11指紋解鎖詳解,看一篇就夠了

1.應(yīng)用場(chǎng)景

指紋解鎖、指紋登錄浩姥、指紋支付

2.注意事項(xiàng)

5S開(kāi)始才有的指紋識(shí)別, 目前絕大部分的設(shè)備都可以支持
iOS8的時(shí)候蘋(píng)果開(kāi)放了指紋識(shí)別的API
需要LocalAuthentication框架

3.實(shí)現(xiàn)代碼

-(void)OnTouchIDBtn:(UIButton *)sender{
    //判斷版本號(hào)是否大于8.0 小于8.0則不支持指紋解鎖
    if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
        [self createAlterView:@"不支持指紋識(shí)別"];
        return;
    }else{
        //獲取指紋傳感器上下文
        LAContext *ctx = [[LAContext alloc] init];
        //設(shè)置 輸入密碼 按鈕的標(biāo)題
        ctx.localizedFallbackTitle = @"驗(yàn)證登錄密碼";
        //設(shè)置 取消 按鈕的標(biāo)題 iOS10之后
        ctx.localizedCancelTitle = @"取消";
        //檢測(cè)指紋數(shù)據(jù)庫(kù)更改 驗(yàn)證成功后返回一個(gè)NSData對(duì)象膀估,否則返回nil
        NSData *date = ctx.evaluatedPolicyDomainState;
        NSLog(@"%@",date);
        // 這個(gè)屬性應(yīng)該是類(lèi)似于支付寶的指紋開(kāi)啟應(yīng)用次员,如果你打開(kāi)他解鎖之后胆数,按Home鍵返回桌面完慧,再次進(jìn)入支付寶是不需要錄入指紋的刻蚯。因?yàn)檫@個(gè)屬性可以設(shè)置一個(gè)時(shí)間間隔绊含,在時(shí)間間隔內(nèi)是不需要再次錄入。默認(rèn)是0秒芦倒,最長(zhǎng)可以設(shè)置5分鐘
        ctx.touchIDAuthenticationAllowableReuseDuration = 5;
/*---------------------------------------------------------------------*/
        //iOS9之前用
        //LAPolicyDeviceOwnerAuthenticationWithBiometrics
        //連續(xù)三次指紋識(shí)別錯(cuò)誤后艺挪,會(huì)自動(dòng)彈出提示框(彈框需手動(dòng)設(shè)置,系統(tǒng)僅返回一個(gè)error,根據(jù)error.code進(jìn)行判斷彈框內(nèi)容),再2次指紋識(shí)別失敗后,也就是 3 + 2 = 5次指紋識(shí)別失敗后兵扬,Touch ID功能被鎖定麻裳,就只能通過(guò)密碼來(lái)進(jìn)行身份驗(yàn)證和解鎖Touch ID 功能(僅能通過(guò)屏幕解鎖或系統(tǒng)設(shè)置進(jìn)行解鎖,不能彈出密碼解鎖視圖)。
        NSError * error;
        _localizedReason = @"通過(guò)Home鍵驗(yàn)證已有手機(jī)指紋";
        // 判斷設(shè)備是否支持指紋識(shí)別
        if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
            // 驗(yàn)證指紋是否匹配器钟,需要彈出輸入密碼的彈框的話:
            [ctx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:_localizedReason reply:^(BOOL success, NSError * error) {
                if (success) {
                    [self createAlterView:@"指紋驗(yàn)證成功"];
                }else{
                    // 錯(cuò)誤碼 error.code
                    NSLog(@"指紋識(shí)別錯(cuò)誤描述 %@",error.description);
                    //如果LAPolicyDeviceOwnerAuthenticationWithBiometrics
                    // -1: 連續(xù)三次指紋識(shí)別錯(cuò)誤
                    // -2: 在TouchID對(duì)話框中點(diǎn)擊了取消按鈕
                    // -3: 在TouchID對(duì)話框中點(diǎn)擊了輸入密碼按鈕
                    // -4: TouchID對(duì)話框被系統(tǒng)取消津坑,例如按下Home或者電源鍵
                    // -8: 連續(xù)五次指紋識(shí)別錯(cuò)誤,TouchID功能被鎖定傲霸,下一次需要輸入系統(tǒng)密碼
                    NSString * message;
                    switch (error.code) {
                        case -1://LAErrorAuthenticationFailed
                            message = @"已經(jīng)連續(xù)三次指紋識(shí)別錯(cuò)誤了疆瑰,請(qǐng)輸入密碼驗(yàn)證";
                            _localizedReason = @"指紋驗(yàn)證失敗";
                            break;
                        case -2:
                            message = @"在TouchID對(duì)話框中點(diǎn)擊了取消按鈕";
                            return ;
                            break;
                        case -3:
                            message = @"在TouchID對(duì)話框中點(diǎn)擊了輸入密碼按鈕";
                            break;
                        case -4:
                            message = @"TouchID對(duì)話框被系統(tǒng)取消,例如按下Home或者電源鍵或者彈出密碼框";
                            break;
                        case -8:
                            message = @"TouchID已經(jīng)被鎖定,請(qǐng)前往設(shè)置界面重新啟用";
                            break;
                        default:
                            break;
                    }
                    //彈框提示
                    [self createAlterView:message];
                }
            }];
        }else{

            if (error.code == -8) {
                [self createAlterView:@"由于五次識(shí)別錯(cuò)誤TouchID已經(jīng)被鎖定,請(qǐng)前往設(shè)置界面重新啟用"];
            }else{
                [self createAlterView:@"TouchID沒(méi)有設(shè)置指紋,請(qǐng)前往設(shè)置"];
            }
        }
/*---------------------------------------------------------------------*/
        //iOS9之后用
        //LAPolicyDeviceOwnerAuthentication 昙啄;
        //連續(xù)三次指紋識(shí)別錯(cuò)誤后穆役,會(huì)自動(dòng)彈出密碼框,通過(guò)Touch ID的密碼進(jìn)行身份驗(yàn)證梳凛,如果此時(shí)取消密碼驗(yàn)證耿币,再1次指紋識(shí)別失敗后,也就是 3 + 1 = 4次指紋識(shí)別失敗后韧拒,Touch ID功能被鎖定淹接,就只能通過(guò)密碼來(lái)進(jìn)行身份驗(yàn)證和解鎖Touch ID 功能(會(huì)彈出密碼解鎖視圖)。
        NSError * error;
        _localizedReason = @"通過(guò)Home鍵驗(yàn)證已有手機(jī)指紋";
        // 判斷設(shè)備是否支持指紋識(shí)別
        if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
            // 驗(yàn)證指紋是否匹配叛溢,需要彈出輸入密碼的彈框的話:
            [ctx evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:_localizedReason reply:^(BOOL success, NSError * error) {
                if (success) {
                    [self createAlterView:@"指紋驗(yàn)證成功"];
                }else{
                    // 錯(cuò)誤碼 error.code
                    NSLog(@"指紋識(shí)別錯(cuò)誤描述 %@",error.description);
                    //如果LAPolicyDeviceOwnerAuthentication,在error中只能出現(xiàn)-2的錯(cuò)誤代碼
                    // -2: 在TouchID對(duì)話框中點(diǎn)擊了取消按鈕
                    //取消時(shí)不會(huì)出現(xiàn)createAlterView所以不需要設(shè)置失敗彈窗

                }
            }];
        }else{
                [self createAlterView:@"TouchID沒(méi)有設(shè)置指紋,請(qǐng)前往設(shè)置"];
        }
/*---------------------------------------------------------------------*/
    }
}

- (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.常見(jiàn)錯(cuò)誤整理

/*
 typedef NS_ENUM(NSInteger, LAError)
 {
 //授權(quán)失敗
 LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
 
 //用戶取消Touch ID授權(quán)
 LAErrorUserCancel           = kLAErrorUserCancel,
 
 //用戶選擇輸入密碼
 LAErrorUserFallback         = kLAErrorUserFallback,
 
 //系統(tǒng)取消授權(quán)(例如其他APP切入)
 LAErrorSystemCancel         = kLAErrorSystemCancel,
 
 //系統(tǒng)未設(shè)置密碼
 LAErrorPasscodeNotSet       = kLAErrorPasscodeNotSet,
 
 //設(shè)備Touch ID不可用塑悼,例如未打開(kāi)
 LAErrorTouchIDNotAvailable  = kLAErrorTouchIDNotAvailable,
 
 //設(shè)備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中也會(huì)出現(xiàn)的情況厢蒜,但并未歸為單獨(dú)的錯(cuò)誤類(lèi)型,這個(gè)錯(cuò)誤出現(xiàn),源自用戶多次連續(xù)使用Touch ID失敗郭怪,Touch ID被鎖支示,需要用戶輸入密碼解鎖刊橘,這個(gè)錯(cuò)誤的交互LocalAuthentication.framework已經(jīng)封裝好了鄙才,不需要開(kāi)發(fā)者關(guān)心。
 
 LAErrorAppCancel和LAErrorSystemCancel相似促绵,都是當(dāng)前軟件被掛起取消了授權(quán)攒庵,但是前者是用戶不能控制的掛起,例如突然來(lái)了電話败晴,電話應(yīng)用進(jìn)入前臺(tái)浓冒,APP被掛起。后者是用戶自己切到了別的應(yīng)用尖坤,例如按home鍵掛起稳懒。
 
 LAErrorInvalidContext很好理解,就是授權(quán)過(guò)程中,LAContext對(duì)象被釋放掉了慢味,造成的授權(quán)失敗场梆。
 
 */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纯路,隨后出現(xiàn)的幾起案子或油,更是在濱河造成了極大的恐慌,老刑警劉巖驰唬,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顶岸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叫编,警方通過(guò)查閱死者的電腦和手機(jī)辖佣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搓逾,“玉大人卷谈,你說(shuō)我怎么就攤上這事∈崖撸” “怎么了雏搂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寇损。 經(jīng)常有香客問(wèn)我凸郑,道長(zhǎng),這世上最難降的妖魔是什么矛市? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任芙沥,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘而昨。我一直安慰自己救氯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布歌憨。 她就那樣靜靜地躺著着憨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪务嫡。 梳的紋絲不亂的頭發(fā)上甲抖,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音心铃,去河邊找鬼准谚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛去扣,可吹牛的內(nèi)容都是我干的柱衔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼愉棱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唆铐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起羽氮,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤或链,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后档押,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體澳盐,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年令宿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叼耙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粒没,死狀恐怖筛婉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情癞松,我是刑警寧澤爽撒,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站响蓉,受9級(jí)特大地震影響硕勿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枫甲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一源武、第九天 我趴在偏房一處隱蔽的房頂上張望扼褪。 院中可真熱鬧,春花似錦粱栖、人聲如沸话浇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)幔崖。三九已至,卻和暖如春跋核,著一層夾襖步出監(jiān)牢的瞬間岖瑰,已是汗流浹背叛买。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工砂代, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人率挣。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓刻伊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親椒功。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捶箱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容