iOS指紋解鎖TouchID


指紋解鎖的使用越來越普遍了鞍时,主要是使用方便喷面,再用之前還是先了解一下如何使用吧。

一丹诀、API介紹

使用指紋功能钝的,必須用到系統(tǒng)的庫(kù)翁垂,指紋用到的庫(kù)是LocalAuthentication.framework,所以接下來我介紹一下這個(gè)庫(kù)里的所有文件的作用硝桩。
我們打開這個(gè)LocalAuthentication.framework庫(kù)沿猜,發(fā)現(xiàn)里面就4個(gè).h文件

- LAContext.h
- LAError.h
- LAPublicDefines.h
- LocalAuthentication.h

1、LocalAuthentication.h

這個(gè)里面就兩行引入頭文件碗脊,很顯然這是我們引入指紋庫(kù)要調(diào)用的類啼肩,可以在文件中引入#import <LocalAuthentication/LocalAuthentication.h>

2、LAPublicDefines.h

這個(gè)里面就是定義了一些宏定義衙伶,很簡(jiǎn)單都能看懂祈坠。

3、LAError.h

這個(gè)類其實(shí)也不難矢劲,就是一個(gè)枚舉的里面列出了所有可能出現(xiàn)的錯(cuò)誤類型赦拘,每個(gè)錯(cuò)誤的類型都有注釋,我給翻譯一下

 LAErrorAuthenticationFailed //連續(xù)三次指紋驗(yàn)證失敗芬沉,可能指紋模糊或用錯(cuò)手指
 LAErrorUserCancel           //用戶取消驗(yàn)證躺同,點(diǎn)擊了取消按鈕
 LAErrorUserFallback         //用戶取消驗(yàn)證,點(diǎn)擊了輸入密碼按鈕
 LAErrorSystemCancel         //系統(tǒng)取消授權(quán)丸逸,如其他APP切入
 LAErrorPasscodeNotSet       //指紋驗(yàn)證無(wú)法啟動(dòng)/失敗笋籽,因?yàn)樵O(shè)備沒有設(shè)置密碼
 LAErrorTouchIDNotAvailable  //設(shè)備TouchID不可用,例如未打開
 LAErrorTouchIDNotEnrolled   //指紋驗(yàn)證無(wú)法啟動(dòng)椭员,因?yàn)闆]有錄入指紋(設(shè)置密碼了)
 LAErrorTouchIDLockout       //設(shè)備TouchID被鎖定车海,因?yàn)槭〉拇螖?shù)太多了
 LAErrorAppCancel            //應(yīng)用程序取消了身份驗(yàn)證,APP調(diào)用了-(void)invalidate方法使LAContext失效
 LAErrorInvalidContext       //實(shí)例化的LAContext對(duì)象失效隘击,再次調(diào)用evaluation...方法則會(huì)彈出此錯(cuò)誤信息

4侍芝、LAContext.h

這個(gè)類才是最重要的核心部分。


首先看到的是一個(gè)枚舉LAPolicy埋同,里面就兩個(gè)

LAPolicyDeviceOwnerAuthenticationWithBiometrics(iOS8以上可用):這種代表的是只用指紋去驗(yàn)證州叠。第一次指紋失敗,會(huì)出現(xiàn)“輸入密碼”按鈕凶赁,輸入密碼的標(biāo)題及功能可以自定義咧栗;第三次指紋失敗,彈窗消失虱肄;再次啟動(dòng)驗(yàn)證致板,還有兩次機(jī)會(huì),如果都失敗了咏窿,指紋驗(yàn)證鎖定斟或,不再?gòu)棾鲵?yàn)證窗。直至輸入密碼來解鎖指紋(可以鎖屏重新進(jìn)來使用輸入密碼的方式解鎖)集嵌。
LAPolicyDeviceOwnerAuthentication(iOS9以上可用):這種代表的是可以用指紋或密碼兩種方式去驗(yàn)證萝挤,優(yōu)先用指紋御毅。第一次指紋失敗,會(huì)出現(xiàn)“輸入密碼”按鈕怜珍,輸入密碼的標(biāo)題可以自定義端蛆,但是功能不能自定義了,而是必須輸入系統(tǒng)密碼(鎖屏密碼)酥泛;第三次驗(yàn)證失敗今豆,彈窗消失,彈出輸入系統(tǒng)密碼的界面揭璃;如果連續(xù)五次指紋失敗晚凿,則指紋鎖定亭罪,此時(shí)只會(huì)彈出輸入密碼界面瘦馍,直至輸入密碼成功解鎖。

兩種驗(yàn)證方式的比較:
相同點(diǎn):都是連續(xù)五次驗(yàn)證失敗就會(huì)鎖定
不同點(diǎn):前者的輸入密碼功能可以自定義应役,后者輸入密碼功能是固定輸入系統(tǒng)密碼
一般經(jīng)常使用前者LAPolicyDeviceOwnerAuthenticationWithBiometrics


接下來就是實(shí)例方法情组,創(chuàng)建實(shí)例對(duì)象:LAContext *context = [LAContext alloc] init];context來調(diào)用。

/*
  這個(gè)方法用來檢查當(dāng)前設(shè)備是否可用touchID箩祥,返回一個(gè)BOOL值
  policy: 這個(gè)就是上面的枚舉的兩個(gè)驗(yàn)證方式院崇,一般用前者
  error:  錯(cuò)誤的類型可參考LAError.h里的類型
*/
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
/*
  這個(gè)方法是開始驗(yàn)證指紋的方法
  policy: 這個(gè)就是上面的枚舉的兩個(gè)驗(yàn)證方式,一般用前者
  localizedReason: 指紋驗(yàn)證框上面的提示信息袍祖,一般為“通過Home鍵驗(yàn)證已有手機(jī)指紋”(不能為空否則崩潰)
  reply: 一個(gè)block底瓣,返回指紋驗(yàn)證結(jié)果,成功:success為YES蕉陋,失敗:success為NO捐凭,同時(shí)返回錯(cuò)誤類型的error,同樣參考LAError.h里的類型
*/
- (void)evaluatePolicy:(LAPolicy)policy
       localizedReason:(NSString *)localizedReason
                 reply:(void(^)(BOOL success, NSError * __nullable error))reply;
//用來廢止該實(shí)例對(duì)象context
- (void)invalidate NS_AVAILABLE(10_11, 9_0);

下面的兩個(gè)枚舉和三個(gè)方法一般用不到凳鬓,這里就不做介紹了

// 兩個(gè)枚舉
LACredentialType
LAAccessControlOperation

// 三個(gè)方法
- (BOOL)setCredential:(nullable NSData *)credential
                 type:(LACredentialType)type NS_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_UNAVAILABLE;

- (BOOL)isCredentialSet:(LACredentialType)type NS_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_UNAVAILABLE;

- (void)evaluateAccessControl:(SecAccessControlRef)accessControl
                    operation:(LAAccessControlOperation)operation
              localizedReason:(NSString *)localizedReason
                        reply:(void(^)(BOOL success, NSError * __nullable error))reply
                        NS_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_UNAVAILABLE;


還有五個(gè)屬性

// 可以設(shè)置指紋彈框“輸入密碼”按鈕的標(biāo)題茁肠,如果不設(shè)置或設(shè)置為nil,則顯示默認(rèn)的“輸入密碼”缩举;如果設(shè)置為@""垦梆,則彈框不再顯示這個(gè)按鈕
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
// 可以設(shè)置指紋彈框“取消”按鈕的標(biāo)題(iOS10.0以上可用),如果不設(shè)置或設(shè)置為nil或設(shè)置為@""仅孩,都顯示默認(rèn)的“取消”
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);
// 最大指紋嘗試錯(cuò)誤次數(shù)(iOS8.3 - iOS9.0可用)
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
// 這個(gè)可以檢測(cè)你的指紋數(shù)據(jù)庫(kù)的變化,增加或者刪除指紋這個(gè)屬性會(huì)做出相應(yīng)的反應(yīng)(iOS9.0以上可用)
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
// 兩次開啟指紋之間的時(shí)間間隔托猩,決定第二次是否需要指紋解鎖
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(NA, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;

二、使用方法

1辽慕、首先站刑,引入依賴框架 LocalAuthentication.framework

#import <LocalAuthentication/LocalAuthentication.h>

2、集成指紋解鎖的方法

- (void)evaluateAuthenticate
{
    //iOS 8以上才支持指紋識(shí)別接口
    if ([[UIDevice currentDevice].systemVersion floatValue] < 8) {
        NSLog(@"不支持TouchID (版本必須高于iOS 8.0才能使用)");
        return;
    }
    
    //創(chuàng)建LAContext
    LAContext *context = [[LAContext alloc] init];
    context.localizedFallbackTitle = @"輸入密碼吧";
    
    NSError *Error = nil;
    
    //判斷設(shè)備支持狀態(tài)
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&Error]) {
        //支持指紋驗(yàn)證
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請(qǐng)驗(yàn)證已有手機(jī)指紋" reply:^(BOOL success, NSError *error) {
            if (success) {
                //驗(yàn)證成功鼻百,主線程處理UI
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    NSLog(@"指紋驗(yàn)證成功");
                }];
            } else {
                NSLog(@"驗(yàn)證失敗 == %@", error.localizedDescription);
                switch (error.code) {
                    case LAErrorSystemCancel:{
                        NSLog(@"系統(tǒng)取消授權(quán)绞旅,如其他APP切入");
                    }
                        break;
                    case LAErrorUserCancel:{
                        NSLog(@"用戶取消驗(yàn)證摆尝,點(diǎn)擊了取消按鈕");
                    }
                        break;
                    case LAErrorUserFallback:{
                        NSLog(@"用戶取消驗(yàn)證,點(diǎn)擊了輸入密碼按鈕");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //用戶選擇輸入密碼因悲,切換主線程處理
                            
                        }];
                    }
                        break;
                    case LAErrorAuthenticationFailed:{
                        NSLog(@"連續(xù)三次指紋驗(yàn)證失敗堕汞,可能指紋模糊或用錯(cuò)手指");
                    }
                        break;
                    case LAErrorTouchIDLockout:{
                        NSLog(@"設(shè)備TouchID被鎖定,因?yàn)槭〉拇螖?shù)太多了");
                    }
                        break;
                    default:{
                        NSLog(@"設(shè)備TouchID不可用晃琳。讯检。。");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //其他情況卫旱,切換主線程處理
                        }];
                    }
                        break;
                }
            }
        }];
    } else {
        //該設(shè)備不支持TouchID
        NSLog(@"不支持TouchID == %@", Error.localizedDescription);
        switch (Error.code) {
            case LAErrorTouchIDNotEnrolled:{
                NSLog(@"指紋驗(yàn)證無(wú)法啟動(dòng)人灼,因?yàn)闆]有錄入指紋");
            }
                break;
            case LAErrorPasscodeNotSet:{
                NSLog(@"指紋驗(yàn)證無(wú)法啟動(dòng),因?yàn)樵O(shè)備沒有設(shè)置密碼");
            }
                break;
            case LAErrorTouchIDLockout:{
                NSLog(@"設(shè)備TouchID被鎖定顾翼,因?yàn)槭〉拇螖?shù)太多了");
            }
                break;
            default:{
                NSLog(@"設(shè)備TouchID不可用投放。。适贸。");
            }
                break;
        }
    }
}

三灸芳、demo

這里有我封裝好的一個(gè)demo,歡迎參考!
如有任何問題拜姿,歡迎留言烙样!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蕊肥,隨后出現(xiàn)的幾起案子谒获,更是在濱河造成了極大的恐慌,老刑警劉巖壁却,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批狱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡儒洛,警方通過查閱死者的電腦和手機(jī)精耐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琅锻,“玉大人卦停,你說我怎么就攤上這事∧张睿” “怎么了惊完?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)处硬。 經(jīng)常有香客問我小槐,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任凿跳,我火速辦了婚禮件豌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘控嗜。我一直安慰自己茧彤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布疆栏。 她就那樣靜靜地躺著曾掂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壁顶。 梳的紋絲不亂的頭發(fā)上珠洗,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音若专,去河邊找鬼许蓖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛富岳,可吹牛的內(nèi)容都是我干的蛔糯。 我是一名探鬼主播拯腮,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼窖式,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了动壤?” 一聲冷哼從身側(cè)響起萝喘,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琼懊,沒想到半個(gè)月后阁簸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼丈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年启妹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醉旦。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饶米,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出车胡,到底是詐尸還是另有隱情檬输,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布匈棘,位于F島的核電站丧慈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏主卫。R本人自食惡果不足惜逃默,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一鹃愤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧完域,春花似錦昼浦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乌妙,卻和暖如春使兔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藤韵。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工虐沥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泽艘。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓欲险,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匹涮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子天试,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評(píng)論 25 707
  • 簡(jiǎn)述: 在類似支付寶為首的應(yīng)用以及各種理財(cái)?shù)壬婕板X財(cái)對(duì)安全性要求較高的應(yīng)用中,目前普遍對(duì)關(guān)鍵數(shù)據(jù)都做了安全訪問限制...
    C_HPY閱讀 2,941評(píng)論 0 18
  • 正確的認(rèn)識(shí)曝光 按下快門按鈕然低,在快門啟動(dòng)的瞬間喜每,光線通過光圈的光孔使數(shù)碼相機(jī)的傳感器或傳統(tǒng)相機(jī)的膠片感光,這就是攝...
    奧哈閱讀 813評(píng)論 0 7
  • “一向年光有限身雳攘,等閑離別易傷魂带兜。酒筵歌席莫辭頻。 滿目山河空念遠(yuǎn)吨灭,落花風(fēng)雨更傷春刚照。不如憐取眼前人⌒郑”這是晏殊的一...
    憶言如晤閱讀 416評(píng)論 0 5
  • 陽(yáng)光柔了不少无畔,溫暖似乎盈滿了時(shí)光的間隙,一切都變得那樣虛幻繁莹。 西瓜帶著口罩檩互,穿著一身休閑裝,挺拔的身材和清俊的面龐...
    塵世若沫or梓盡言沐閱讀 136評(píng)論 0 0