iOS指紋解鎖TouchID


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

一、API介紹

使用指紋功能,必須用到系統的庫,指紋用到的庫是LocalAuthentication.framework,所以接下來我介紹一下這個庫里的所有文件的作用。
我們打開這個LocalAuthentication.framework庫,發現里面就4個.h文件

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

1、LocalAuthentication.h

這個里面就兩行引入頭文件,很顯然這是我們引入指紋庫要調用的類,可以在文件中引入#import <LocalAuthentication/LocalAuthentication.h>

2、LAPublicDefines.h

這個里面就是定義了一些宏定義,很簡單都能看懂。

3、LAError.h

這個類其實也不難,就是一個枚舉的里面列出了所有可能出現的錯誤類型,每個錯誤的類型都有注釋,我給翻譯一下

 LAErrorAuthenticationFailed //連續三次指紋驗證失敗,可能指紋模糊或用錯手指
 LAErrorUserCancel           //用戶取消驗證,點擊了取消按鈕
 LAErrorUserFallback         //用戶取消驗證,點擊了輸入密碼按鈕
 LAErrorSystemCancel         //系統取消授權,如其他APP切入
 LAErrorPasscodeNotSet       //指紋驗證無法啟動/失敗,因為設備沒有設置密碼
 LAErrorTouchIDNotAvailable  //設備TouchID不可用,例如未打開
 LAErrorTouchIDNotEnrolled   //指紋驗證無法啟動,因為沒有錄入指紋(設置密碼了)
 LAErrorTouchIDLockout       //設備TouchID被鎖定,因為失敗的次數太多了
 LAErrorAppCancel            //應用程序取消了身份驗證,APP調用了-(void)invalidate方法使LAContext失效
 LAErrorInvalidContext       //實例化的LAContext對象失效,再次調用evaluation...方法則會彈出此錯誤信息

4、LAContext.h

這個類才是最重要的核心部分。


首先看到的是一個枚舉LAPolicy,里面就兩個

LAPolicyDeviceOwnerAuthenticationWithBiometrics(iOS8以上可用):這種代表的是只用指紋去驗證。第一次指紋失敗,會出現“輸入密碼”按鈕,輸入密碼的標題及功能可以自定義;第三次指紋失敗,彈窗消失;再次啟動驗證,還有兩次機會,如果都失敗了,指紋驗證鎖定,不再彈出驗證窗。直至輸入密碼來解鎖指紋(可以鎖屏重新進來使用輸入密碼的方式解鎖)。
LAPolicyDeviceOwnerAuthentication(iOS9以上可用):這種代表的是可以用指紋或密碼兩種方式去驗證,優先用指紋。第一次指紋失敗,會出現“輸入密碼”按鈕,輸入密碼的標題可以自定義,但是功能不能自定義了,而是必須輸入系統密碼(鎖屏密碼);第三次驗證失敗,彈窗消失,彈出輸入系統密碼的界面;如果連續五次指紋失敗,則指紋鎖定,此時只會彈出輸入密碼界面,直至輸入密碼成功解鎖。

兩種驗證方式的比較:
相同點:都是連續五次驗證失敗就會鎖定
不同點:前者的輸入密碼功能可以自定義,后者輸入密碼功能是固定輸入系統密碼
一般經常使用前者LAPolicyDeviceOwnerAuthenticationWithBiometrics


接下來就是實例方法,創建實例對象:LAContext *context = [LAContext alloc] init];context來調用。

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

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

// 兩個枚舉
LACredentialType
LAAccessControlOperation

// 三個方法
- (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;


還有五個屬性

// 可以設置指紋彈框“輸入密碼”按鈕的標題,如果不設置或設置為nil,則顯示默認的“輸入密碼”;如果設置為@"",則彈框不再顯示這個按鈕
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
// 可以設置指紋彈框“取消”按鈕的標題(iOS10.0以上可用),如果不設置或設置為nil或設置為@"",都顯示默認的“取消”
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);
// 最大指紋嘗試錯誤次數(iOS8.3 - iOS9.0可用)
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
// 這個可以檢測你的指紋數據庫的變化,增加或者刪除指紋這個屬性會做出相應的反應(iOS9.0以上可用)
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
// 兩次開啟指紋之間的時間間隔,決定第二次是否需要指紋解鎖
@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以上才支持指紋識別接口
    if ([[UIDevice currentDevice].systemVersion floatValue] < 8) {
        NSLog(@"不支持TouchID (版本必須高于iOS 8.0才能使用)");
        return;
    }
    
    //創建LAContext
    LAContext *context = [[LAContext alloc] init];
    context.localizedFallbackTitle = @"輸入密碼吧";
    
    NSError *Error = nil;
    
    //判斷設備支持狀態
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&Error]) {
        //支持指紋驗證
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請驗證已有手機指紋" reply:^(BOOL success, NSError *error) {
            if (success) {
                //驗證成功,主線程處理UI
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    NSLog(@"指紋驗證成功");
                }];
            } else {
                NSLog(@"驗證失敗 == %@", error.localizedDescription);
                switch (error.code) {
                    case LAErrorSystemCancel:{
                        NSLog(@"系統取消授權,如其他APP切入");
                    }
                        break;
                    case LAErrorUserCancel:{
                        NSLog(@"用戶取消驗證,點擊了取消按鈕");
                    }
                        break;
                    case LAErrorUserFallback:{
                        NSLog(@"用戶取消驗證,點擊了輸入密碼按鈕");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //用戶選擇輸入密碼,切換主線程處理
                            
                        }];
                    }
                        break;
                    case LAErrorAuthenticationFailed:{
                        NSLog(@"連續三次指紋驗證失敗,可能指紋模糊或用錯手指");
                    }
                        break;
                    case LAErrorTouchIDLockout:{
                        NSLog(@"設備TouchID被鎖定,因為失敗的次數太多了");
                    }
                        break;
                    default:{
                        NSLog(@"設備TouchID不可用。。。");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //其他情況,切換主線程處理
                        }];
                    }
                        break;
                }
            }
        }];
    } else {
        //該設備不支持TouchID
        NSLog(@"不支持TouchID == %@", Error.localizedDescription);
        switch (Error.code) {
            case LAErrorTouchIDNotEnrolled:{
                NSLog(@"指紋驗證無法啟動,因為沒有錄入指紋");
            }
                break;
            case LAErrorPasscodeNotSet:{
                NSLog(@"指紋驗證無法啟動,因為設備沒有設置密碼");
            }
                break;
            case LAErrorTouchIDLockout:{
                NSLog(@"設備TouchID被鎖定,因為失敗的次數太多了");
            }
                break;
            default:{
                NSLog(@"設備TouchID不可用。。。");
            }
                break;
        }
    }
}

三、demo

這里有我封裝好的一個demo,歡迎參考!
如有任何問題,歡迎留言!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,715評論 25 708
  • 簡述: 在類似支付寶為首的應用以及各種理財等涉及錢財對安全性要求較高的應用中,目前普遍對關鍵數據都做了安全訪問限制...
    C_HPY閱讀 2,996評論 0 18
  • 正確的認識曝光 按下快門按鈕,在快門啟動的瞬間,光線通過光圈的光孔使數碼相機的傳感器或傳統相機的膠片感光,這就是攝...
    奧哈閱讀 837評論 0 7
  • “一向年光有限身,等閑離別易傷魂。酒筵歌席莫辭頻。 滿目山河空念遠,落花風雨更傷春。不如憐取眼前人。”這是晏殊的一...
    憶言如晤閱讀 428評論 0 5
  • 陽光柔了不少,溫暖似乎盈滿了時光的間隙,一切都變得那樣虛幻。 西瓜帶著口罩,穿著一身休閑裝,挺拔的身材和清俊的面龐...
    塵世若沫or梓盡言沐閱讀 142評論 0 0