iOS TouchID 開發(fā)(簡單Demo)

Touch ID

最近一直比較有空,所以就在這段空閑時間就打算梳理一下以前做過的一些項目酣倾,并且把一些簡單常用的API回顧回顧幸海,今天看了一下指紋解鎖的官方Demo,就想學(xué)習(xí)一下汰具。其實功能實現(xiàn)起來很簡單哪亿,畢竟蘋果官方都幫我們封裝好了富寿,我們只需要學(xué)習(xí)幾個方法,實現(xiàn)一下即可讓自己的App有手勢解鎖的功能了锣夹。

實現(xiàn)效果圖

一页徐、API介紹

iOS的指紋解鎖官方提供了LocalAuthentication.framework這個系統(tǒng)庫,打開這個庫我們會發(fā)現(xiàn)里面只有以下4個.h文件

  • LAContext.h
  • LAError.h
  • LAPublicDefines.h
  • LocalAuthentication.h
①LAContext.h(最核心部分)

一開始我們就看到LAPolicy這個枚舉

typedef NS_ENUM(NSInteger, LAPolicy)

LAPolicyDeviceOwnerAuthenticationWithBiometrics(iOS8以上可用):這種代表的是只用指紋去驗證银萍。第一次指紋失敗变勇,會出現(xiàn)“輸入密碼”按鈕,輸入密碼的標(biāo)題及功能可以自定義贴唇;第三次指紋失敗搀绣,彈窗消失;再次啟動驗證戳气,還有兩次機(jī)會链患,如果都失敗了,指紋驗證鎖定瓶您,不再彈出驗證窗麻捻。直至輸入密碼來解鎖指紋(可以鎖屏重新進(jìn)來使用輸入密碼的方式解鎖)纲仍。
LAPolicyDeviceOwnerAuthentication(iOS9以上可用):這種代表的是可以用指紋或密碼兩種方式去驗證,優(yōu)先用指紋贸毕。第一次指紋失敗郑叠,會出現(xiàn)“輸入密碼”按鈕,輸入密碼的標(biāo)題可以自定義明棍,但是功能不能自定義了乡革,而是必須輸入系統(tǒng)密碼(鎖屏密碼);第三次驗證失敗摊腋,彈窗消失沸版,彈出輸入系統(tǒng)密碼的界面;如果連續(xù)五次指紋失敗兴蒸,則指紋鎖定视粮,此時只會彈出輸入密碼界面,直至輸入密碼成功解鎖类咧。

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

然后我們可以看到以下面幾個方法

①這個方法是判斷當(dāng)前設(shè)備是否支持TouchID的
/*
  這個方法用來檢查當(dāng)前設(shè)備是否可用touchID蟹腾,返回一個BOOL值
  policy: 這個就是上面的枚舉的兩個驗證方式痕惋,一般用前者
  error:  錯誤的類型可參考LAError.h里的類型
*/
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));

@discussion Policies can have certain requirements which, when not satisfied, would always cause
/// the policy evaluation to fail. Examples can be a passcode set or a fingerprint
/// enrolled with Touch ID. This method allows easy checking for such conditions.
///
/// Applications should consume the returned value immediately and avoid relying on it
/// for an extensive period of time. At least, it is guaranteed to stay valid until the
/// application enters background.

@return YES if the policy can be evaluated, NO otherwise.

②這個方法是用來驗證TouchID的,會有彈出框出來
/*
  這個方法是開始驗證指紋的方法
  policy: 這個就是上面的枚舉的兩個驗證方式娃殖,一般用前者
  localizedReason: 指紋驗證框上面的提示信息值戳,一般為“通過Home鍵驗證已有手機(jī)指紋”(不能為空否則崩潰)
  reply: 一個block,返回指紋驗證結(jié)果炉爆,成功: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);

然后下面還有幾個方法不是很常用赴捞,我們可以忽略
接下來介紹一下比較重要的屬性

// 可以設(shè)置指紋彈框“輸入密碼”按鈕的標(biāo)題,如果不設(shè)置或設(shè)置為nil郁稍,則顯示默認(rèn)的“輸入密碼”赦政;如果設(shè)置為@"",則彈框不再顯示這個按鈕
@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);
// 最大指紋嘗試錯誤次數(shù)(iOS8.3 - iOS9.0可用)
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
// 這個可以檢測你的指紋數(shù)據(jù)庫的變化,增加或者刪除指紋這個屬性會做出相應(yīng)的反應(yīng)(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;财破。

②LAError.h

這個類主要枚舉了可能出現(xiàn)的錯誤類型掰派,具體中文解釋如下

 LAErrorAuthenticationFailed //連續(xù)三次指紋驗證失敗,可能指紋模糊或用錯手指
 LAErrorUserCancel           //用戶取消驗證左痢,點擊了取消按鈕
 LAErrorUserFallback         //用戶取消驗證靡羡,點擊了輸入密碼按鈕
 LAErrorSystemCancel         //系統(tǒng)取消授權(quán)系洛,如其他APP切入
 LAErrorPasscodeNotSet       //指紋驗證無法啟動/失敗,因為設(shè)備沒有設(shè)置密碼
 LAErrorTouchIDNotAvailable  //設(shè)備TouchID不可用亿眠,例如未打開
 LAErrorTouchIDNotEnrolled   //指紋驗證無法啟動碎罚,因為沒有錄入指紋(設(shè)置密碼了)
 LAErrorTouchIDLockout       //設(shè)備TouchID被鎖定,因為失敗的次數(shù)太多了
 LAErrorAppCancel            //應(yīng)用程序取消了身份驗證纳像,APP調(diào)用了-(void)invalidate方法使LAContext失效
 LAErrorInvalidContext       //實例化的LAContext對象失效荆烈,再次調(diào)用evaluation...方法則會彈出此錯誤信息

③LAPublicDefines.h

只是這個庫的一些宏定義


LAPublicDefines.h

④LocalAuthentication.h

這個里面就兩行引入頭文件,很顯然這是我們引入指紋庫要調(diào)用的類竟趾,在文件中引入#import <LocalAuthentication/LocalAuthentication.h>即可憔购。


二、實現(xiàn)指紋解鎖

*第1步:引入指紋解鎖頭文件

#import <LocalAuthentication/LocalAuthentication.h>

*第2步:實現(xiàn)指紋解鎖的主要方法

- (void)evaluateAuthenticate
{
    //iOS 8以上才支持指紋識別接口
    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]) {
        //支持指紋驗證
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請驗證已有手機(jī)指紋" reply:^(BOOL success, NSError *error) {
            if (success) {
                //驗證成功岔帽,主線程處理UI
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    NSLog(@"指紋驗證成功");
                }];
            } else {
                NSLog(@"驗證失敗 == %@", error.localizedDescription);
                switch (error.code) {
                    case LAErrorSystemCancel:{
                        NSLog(@"系統(tǒng)取消授權(quán)玫鸟,如其他APP切入");
                    }
                        break;
                    case LAErrorUserCancel:{
                        NSLog(@"用戶取消驗證,點擊了取消按鈕");
                    }
                        break;
                    case LAErrorUserFallback:{
                        NSLog(@"用戶取消驗證犀勒,點擊了輸入密碼按鈕");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //用戶選擇輸入密碼屎飘,切換主線程處理

                        }];
                    }
                        break;
                    case LAErrorAuthenticationFailed:{
                        NSLog(@"連續(xù)三次指紋驗證失敗,可能指紋模糊或用錯手指");
                    }
                        break;
                    case LAErrorTouchIDLockout:{
                        NSLog(@"設(shè)備TouchID被鎖定贾费,因為失敗的次數(shù)太多了");
                    }
                        break;
                    default:{
                        NSLog(@"設(shè)備TouchID不可用钦购。。褂萧。");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //其他情況押桃,切換主線程處理
                        }];
                    }
                        break;
                }
            }
        }];
    } else {
        //該設(shè)備不支持TouchID
        NSLog(@"不支持TouchID == %@", Error.localizedDescription);
        switch (Error.code) {
            case LAErrorTouchIDNotEnrolled:{
                NSLog(@"指紋驗證無法啟動,因為沒有錄入指紋");
            }
                break;
            case LAErrorPasscodeNotSet:{
                NSLog(@"指紋驗證無法啟動导犹,因為設(shè)備沒有設(shè)置密碼");
            }
                break;
            case LAErrorTouchIDLockout:{
                NSLog(@"設(shè)備TouchID被鎖定唱凯,因為失敗的次數(shù)太多了");
            }
                break;
            default:{
                NSLog(@"設(shè)備TouchID不可用。谎痢。磕昼。");
            }
                break;
        }
    }
}

最后就附上簡單的Demo原碼,如果文章對你有幫助記得點贊哦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市节猿,隨后出現(xiàn)的幾起案子票从,更是在濱河造成了極大的恐慌,老刑警劉巖沐批,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纫骑,死亡現(xiàn)場離奇詭異,居然都是意外死亡九孩,警方通過查閱死者的電腦和手機(jī)先馆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躺彬,“玉大人煤墙,你說我怎么就攤上這事梅惯。” “怎么了仿野?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵铣减,是天一觀的道長。 經(jīng)常有香客問我脚作,道長葫哗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上瀑凝,老公的妹妹穿的比我還像新娘。我一直安慰自己熙尉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般襟己。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牍陌,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天擎浴,我揣著相機(jī)與錄音,去河邊找鬼呐赡。 笑死退客,一個胖子當(dāng)著我的面吹牛骏融,可吹牛的內(nèi)容都是我干的链嘀。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼档玻,長吁一口氣:“原來是場噩夢啊……” “哼怀泊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起误趴,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤霹琼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凉当,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枣申,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年看杭,在試婚紗的時候發(fā)現(xiàn)自己被綠了忠藤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡楼雹,死狀恐怖模孩,靈堂內(nèi)的尸體忽然破棺而出尖阔,到底是詐尸還是另有隱情,我是刑警寧澤榨咐,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布介却,位于F島的核電站,受9級特大地震影響块茁,放射性物質(zhì)發(fā)生泄漏齿坷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一数焊、第九天 我趴在偏房一處隱蔽的房頂上張望胃夏。 院中可真熱鬧,春花似錦昌跌、人聲如沸仰禀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽答恶。三九已至,卻和暖如春萍诱,著一層夾襖步出監(jiān)牢的瞬間悬嗓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工裕坊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留包竹,地道東北人。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓籍凝,卻偏偏與公主長得像周瞎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饵蒂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,348評論 25 707
  • 原創(chuàng) 2016-12-14 小不拉拉 發(fā)布于公眾號 有機(jī)餐桌 我的手機(jī)上一直保存著一條信息声诸,那是2015年春節(jié)的時...
    賣土雞的小不拉拉閱讀 1,162評論 6 51
  • Java堆 Image Space: 存放一些預(yù)加載的類 Zygote Space: 對應(yīng)Davlik的Zygot...
    dexteryu閱讀 1,402評論 0 0
  • 今天在教育群里看到武校長發(fā)表的一個日記說的太好了。媽媽們退盯,孩子是用來愛的彼乌,不是用來打的、罵的渊迁,他們需要母親的溫柔與...
    相王飛閱讀 332評論 0 1
  • 一覺醒來慰照, 天空還是那樣藍(lán), 花草還是這樣綠琉朽, 時間還是在你一呼一吸間毒租, 奔跑……
    小劇在成長閱讀 158評論 0 2