DemoLibrary之一:【TouchID指紋識(shí)別】

由于近段時(shí)間項(xiàng)目告一段落啦,所以決定將近段時(shí)間接觸的一些功能集中整理總結(jié)一下排苍,寫成了一個(gè)簡(jiǎn)單的Demo接校,以供參考。此篇文章主要是介紹了第三方登錄分享以及指紋識(shí)別的配置過程:

一:指紋識(shí)別

TouchID指紋識(shí)別主要是 iPhone 5s 添加的功能設(shè)備刊咳,有了這個(gè)功能之后,極大的方便了果粉的使用儡司,當(dāng)然越來越多的應(yīng)用也開始在應(yīng)用中集成指紋識(shí)別功能娱挨。其實(shí)官方提供的API中可以看出,?在應(yīng)用中集成也是比簡(jiǎn)單的捕犬,主要用到的是 LocalAuthentication.framework 這個(gè)庫让蕾,當(dāng)打開之后可以發(fā)現(xiàn)頭文件:

SDK.png
其實(shí)在這是個(gè)頭文件中看出,真正使用的接口類是LAContext.h或听,另外的幾個(gè)頭文件都是一些枚舉以及宏定義;下面來看一下暴露出來的幾個(gè)接口API【常用API】:

# 用來檢查當(dāng)前設(shè)備是否可用touchID笋婿,返回一個(gè)BOOL值
@param  policy 是一個(gè)枚舉類型

第一個(gè)枚舉LAPolicyDeviceOwnerAuthenticationWithBiometrics就是說誉裆,用的是手指指紋去驗(yàn)證的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用
第二個(gè)枚舉LAPolicyDeviceOwnerAuthentication少了WithBiometrics則是使用TouchID或者密碼驗(yàn)證,默認(rèn)是錯(cuò)誤兩次指紋或者鎖定后,彈出輸入密碼界面;NS_ENUM_AVAILABLE(10_11, 9_0)iOS 9可用

- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
調(diào)用驗(yàn)證方法缸濒,注意這里的三個(gè)參數(shù):
第一個(gè)參數(shù)policy是要使用上面那個(gè)LAPolicy的枚舉
第二個(gè)參數(shù)localizedReason是NSString類型的驗(yàn)證理由
第三個(gè)參數(shù)reply則是一個(gè)回調(diào)Block足丢,block內(nèi)有一個(gè)BOOL類型的success判斷是否成功驗(yàn)證,還有一個(gè)用于判斷錯(cuò)誤信息的NSError類型的error
- (void)evaluatePolicy:(LAPolicy)policy
       localizedReason:(NSString *)localizedReason
                 reply:(void(^)(BOOL success, NSError * __nullable error))reply
invalidate方法用來廢止這個(gè)context
- (void)invalidate NS_AVAILABLE(10_11, 9_0)

以下是提供的幾個(gè)屬性方法

// /返回按鈕標(biāo)題庇配。允許設(shè)置密碼輸入按鈕標(biāo)題斩跌。如果設(shè)置為空字符串時(shí),按鈕會(huì)隱藏
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;

 //取消按鈕標(biāo)題。允許設(shè)置取消按鈕標(biāo)題捞慌。如果設(shè)置為空字符串時(shí),按鈕會(huì)隱藏NS_AVAILABLE(10_12, 10_0)說明10.0之后才有
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);

// 設(shè)置最大允許認(rèn)證失敗次數(shù)NS_DEPRECATED_IOS(8_3, 9_0)耀鸦,說明這個(gè)屬性在iOS 8.3被引入,在iOS 9.0被廢棄,所以如果系統(tǒng)版本高于9.0是無法使用的袖订。
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;

// 這個(gè)跟可以檢測(cè)你的指紋數(shù)據(jù)庫的變化,增加或者刪除指紋這個(gè)屬性會(huì)做出相應(yīng)的反應(yīng)
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;

//因?yàn)檫@個(gè)屬性可以設(shè)置一個(gè)時(shí)間間隔氮帐,在時(shí)間間隔內(nèi)是不需要再次錄入。默認(rèn)是0秒洛姑,最長(zhǎng)可以設(shè)置5分鐘上沐。
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(NA, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;

在API中提供的方法屬性本來就不多,只要能夠理解每個(gè)方法和屬性的意義楞艾,TouchID使用起來就是得心應(yīng)手的啦参咙,下列是Demo事例中的一個(gè)簡(jiǎn)單應(yīng)用方法:

/// 檢測(cè) 指紋
/*
 1、 驗(yàn)證(指紋/密碼)不能開啟的錯(cuò)誤信息(指紋系統(tǒng)被判定為無效):
 LAErrorPasscodeNotSet : 設(shè)備密碼未設(shè)置
 LAErrorTouchIDNotAvailable : TOUCH ID不可用
 LAErrorTouchIDNotEnrolled : 指紋未錄入
 LAErrorTouchIDLockout : TOUCH ID被鎖定
 LAErrorAppCancel : APP調(diào)用了- (void)invalidate
 方法使LAContext
 失效
 LAErrorInvalidContext : 實(shí)例化的LAContext
 對(duì)象失效硫眯,再次調(diào)用evaluation...
 方法則會(huì)彈出此錯(cuò)誤信息
 2蕴侧、 其他錯(cuò)誤信息(指紋系統(tǒng)判定有效,但是驗(yàn)證指紋錯(cuò)誤):
 LAErrorAuthenticationFailed : 鑒定失敗
 LAErrorUserCancel : 用戶取消
 LAErrorUserFallback : 用戶選擇輸入密碼
 LAErrorSystemCancel : 系統(tǒng)取消(如:另外一個(gè)應(yīng)用進(jìn)入前臺(tái))
 
 */

/**
 *    指紋驗(yàn)證解鎖的主要方法
 *
 *  @param localizedFallbackTitle  密碼輸入按鈕標(biāo)題 例如:定義標(biāo)題
 *  @param localizedReason    指紋解鎖彈出框副標(biāo)題 例如:這是副標(biāo)題
 *  @param touchBlock         結(jié)果回調(diào)
 */
-(void)touchIDWithlocalizedFallbackTitle:(NSString *)localizedFallbackTitle localizedReason:(NSString*)localizedReason success:(void(^)(BOOL success, NSString *errorMsg)) touchBlock{
    
    [SVProgressHUD show];
    
    LAContext *context = [[LAContext alloc]init];//使用 new 不會(huì)給一些屬性初始化賦值
        
    if (!localizedReason) {
        localizedReason = @"請(qǐng)驗(yàn)證已有指紋";
    }
    
    context.localizedFallbackTitle = localizedFallbackTitle ? : @"密碼登錄";//@""可以不讓 feedBack 按鈕顯示
    
    NSError * err;
    
    self.canUseTouchId = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&err];
    // 指紋識(shí)別被鎖定舟铜,需要輸入密碼驗(yàn)證
    if (err.code == LAErrorTouchIDLockout) {
        
        [SVProgressHUD dismiss];
        
        if (touchBlock) {
            touchBlock(NO,@"Touch ID被鎖戈盈,需要用戶輸入密碼解鎖");
        }
        return;
    }
    
    if (self.canUseTouchId) {// 檢測(cè)手機(jī)是否可以使用TouchId
        

        //LAPolicyDeviceOwnerAuthenticationWithBiometrics
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:localizedReason reply:^(BOOL success, NSError * _Nullable error) {
            
            [SVProgressHUD dismiss];

            //SVProgressHUD dismiss 需要 0.15才會(huì)消失;所以dismiss 后進(jìn)行下一步操作;但是0.3是適當(dāng)延長(zhǎng)時(shí)間;留點(diǎn)余量
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                
                self.completeMsg = nil;
                
                if (success){
                    
                    NSLog(@"指紋識(shí)別成功");
                    // 指紋識(shí)別成功,回主線程更新UI
                    dispatch_async(dispatch_get_main_queue(), ^{
                        //成功操作
                        self.completeMsg = @"指紋識(shí)別成功";
                        
                        if (touchBlock) {
                            touchBlock(success,self.completeMsg);
                        }
                        
                    });
                }
                
                if (error) {
                    //指紋識(shí)別失敗谆刨,回主線程更新UI
                    dispatch_async(dispatch_get_main_queue(), ^{
                        //失敗操作
                        LAError errorCode = error.code;
                        
                        switch (errorCode) {
                                
                            case LAErrorAuthenticationFailed:
                            {
                                NSLog(@"授權(quán)失敗"); // -1 連續(xù)三次指紋識(shí)別錯(cuò)誤
                                self.completeMsg = @"授權(quán)失敗";
                            }
                                break;
                            case LAErrorUserCancel: // Authentication was canceled by user (e.g. tapped Cancel button)
                            {
                                NSLog(@"用戶取消驗(yàn)證Touch ID"); // -2 在TouchID對(duì)話框中點(diǎn)擊了取消按鈕
                                self.completeMsg = @"用戶取消驗(yàn)證Touch ID";
                                
                            }
                                break;
                            case LAErrorUserFallback: // Authentication was canceled, because the user tapped the fallback button (Enter Password)
                            {
                                NSLog(@"用戶選擇輸入密碼塘娶,切換主線程處理"); // -3 在TouchID對(duì)話框中點(diǎn)擊了輸入密碼按鈕
                                self.completeMsg = @"用戶選擇輸入密碼,切換主線程處理";
                                
                            }
                                break;
                            case LAErrorSystemCancel: // Authentication was canceled by system (e.g. another application went to foreground)
                            {
                                NSLog(@"取消授權(quán)痊夭,如其他應(yīng)用切入"); // -4 TouchID對(duì)話框被系統(tǒng)取消刁岸,例如按下Home或者電源鍵
                                self.completeMsg = @"取消授權(quán),如其他應(yīng)用切入";
                                
                            }
                                break;
                            case LAErrorPasscodeNotSet: // Authentication could not start, because passcode is not set on the device.
                                
                            {
                                NSLog(@"設(shè)備系統(tǒng)未設(shè)置密碼"); // -5
                                self.completeMsg = @"設(shè)備系統(tǒng)未設(shè)置密碼";
                                
                            }
                                break;
                            case LAErrorTouchIDNotAvailable: // Authentication could not start, because Touch ID is not available on the device
                            {
                                NSLog(@"設(shè)備未設(shè)置Touch ID"); // -6
                                self.completeMsg = @"設(shè)備未設(shè)置Touch ID";
                                
                            }
                                break;
                            case LAErrorTouchIDNotEnrolled: // Authentication could not start, because Touch ID has no enrolled fingers
                            {
                                NSLog(@"用戶未錄入指紋"); // -7
                                self.completeMsg = @"用戶未錄入指紋";
                                
                            }
                                break;
                            case LAErrorTouchIDLockout: //Authentication was not successful, because there were too many failed Touch ID attempts and Touch ID is now locked. Passcode is required to unlock Touch ID, e.g. evaluating LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite 用戶連續(xù)多次進(jìn)行Touch ID驗(yàn)證失敗她我,Touch ID被鎖虹曙,需要用戶輸入密碼解鎖,先Touch ID驗(yàn)證密碼
                            {
                                NSLog(@"Touch ID被鎖番舆,需要用戶輸入密碼解鎖"); // -8 連續(xù)五次指紋識(shí)別錯(cuò)誤酝碳,TouchID功能被鎖定,下一次需要輸入系統(tǒng)密碼
                                self.completeMsg = @"Touch ID被鎖恨狈,需要用戶輸入密碼解鎖";
                                
                            }
                                break;
                            case LAErrorAppCancel: // Authentication was canceled by application (e.g. invalidate was called while authentication was in progress) 如突然來了電話疏哗,電話應(yīng)用進(jìn)入前臺(tái),APP被掛起啦");
                            {
                                NSLog(@"用戶不能控制情況下APP被掛起"); // -9
                                self.completeMsg = @"用戶不能控制情況下APP被掛起";
                                
                            }
                                break;
                            case LAErrorInvalidContext: // LAContext passed to this call has been previously invalidated.
                            {
                                NSLog(@"LAContext傳遞給這個(gè)調(diào)用之前已經(jīng)失效"); // -10
                                self.completeMsg = @"指紋識(shí)別失效";
                                
                            }
                                break;
                        }
                        
                        if (touchBlock) {
                            touchBlock(success,self.completeMsg);
                        }
                        
                    });
                }
                
            });
        }];
        
    }else{
        
        [SVProgressHUD dismiss];

        if (touchBlock) {
            touchBlock(NO,[NSString stringWithFormat:@"設(shè)備不支持指紋解鎖-- %@",err.localizedFailureReason ? : @""]);
        }
    }
    
}

效果圖如下:

解鎖頁面
自定義密碼輸入標(biāo)題禾怠、副標(biāo)題.png
取消.PNG
TouchID鎖定.PNG
識(shí)別成功.PNG

TouchID的簡(jiǎn)單集成使用功能就是這樣返奉,如果想要了解更詳細(xì)的內(nèi)容,可以具體參考蘋果官方文檔:

lacontext官方文檔

https://developer.apple.com/reference/localauthentication/lacontext

TouchID官方文檔:

https://developer.apple.com/reference/localauthentication/lacontext

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吗氏,一起剝皮案震驚了整個(gè)濱河市芽偏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弦讽,老刑警劉巖污尉,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡十厢,警方通過查閱死者的電腦和手機(jī)等太,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛮放,“玉大人缩抡,你說我怎么就攤上這事“洌” “怎么了瞻想?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娩嚼。 經(jīng)常有香客問我蘑险,道長(zhǎng),這世上最難降的妖魔是什么岳悟? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任佃迄,我火速辦了婚禮,結(jié)果婚禮上贵少,老公的妹妹穿的比我還像新娘呵俏。我一直安慰自己,他們只是感情好滔灶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布普碎。 她就那樣靜靜地躺著,像睡著了一般录平。 火紅的嫁衣襯著肌膚如雪麻车。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天斗这,我揣著相機(jī)與錄音动猬,去河邊找鬼。 笑死表箭,一個(gè)胖子當(dāng)著我的面吹牛枣察,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燃逻,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼臂痕!你這毒婦竟也來了伯襟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤握童,失蹤者是張志新(化名)和其女友劉穎姆怪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稽揭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年俺附,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溪掀。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡事镣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揪胃,到底是詐尸還是另有隱情璃哟,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布喊递,位于F島的核電站随闪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏骚勘。R本人自食惡果不足惜铐伴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俏讹。 院中可真熱鬧当宴,春花似錦、人聲如沸藐石。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽于微。三九已至逗嫡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間株依,已是汗流浹背驱证。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恋腕,地道東北人抹锄。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荠藤,于是被迫代替她去往敵國和親伙单。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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