成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

iOS指紋識別登錄流程及實現

瀏覽:65日期:2022-09-17 11:17:45
閑談

最近一直在追青云志,總覺得電視劇沒有小說來的精彩。是的,大咖們演技堪稱驚艷,劇情改編也很緊湊,但不得不說很多東西單靠演是達不到的,主人公每一刻的內心也只能在小說中才能看的貼切(為了裝X,哥不惜二百兩買了一沓正版典藏版)。

iOS指紋識別登錄流程及實現

看過的童鞋知道,張小凡手中的法寶,是由攝魂與嗜血珠以張小凡精血為媒淬煉而成。而且此法寶,有一特大優秀品質,那就是除了與張小凡有血緣關系的人之外,即便你有通天本領也不能操控,忠誠如此夫復何求啊,說到這里大概就扯到正題了,對的,此法寶自帶安全驗證功能,類似我們今天的密碼校驗與 紋識別驗證 功能。

指紋識別簡析

蘋果設計的iOS是以安全性為核心的,不管是沙盒機制,還是代碼簽名等,他們的最終目的都是為了安全。

iOS指紋識別登錄流程及實現

iOS 安全架構圖

自iPhone 5S始,蘋果公司推出了全新生物安全識別技術---指紋識別驗證(Touch ID)。使得我們可以更快、更輕松地對設備進行安全的訪問。可貴的是,Touch ID做到了從任意角度讀取指紋數據,克服了基于密碼進行鎖定的不便。除此之外,蘋果還加入必須進行密碼校驗的場景,進一步確保安全,例如【1】:

剛開機或重啟;

超過 48 小時未解鎖設備;

設備收到了遠程鎖定命令;

五次未能成功匹配指紋;

進入Touch ID設置模塊或更新新指紋;

最重要的一點,蘋果公司提供Touch ID給第三方應用程序使用,程序只會收到認證是否成功的通知,而無法訪問 Touch ID 或與已注冊指紋相關的數據,這一點對安全而言尤為重要。

為了獲得更高的安全性,很多銀行類、支付類APP都集成了指紋、手勢等二次驗證功能。今天我們就重點來談談Touch ID集成到APP的具體流程及實現。

流程分析

指紋登錄流程:

iOS指紋識別登錄流程及實現

首次登錄.png

二次啟動后識別登錄:

iOS指紋識別登錄流程及實現

指紋驗證登錄.png

使用過指紋登錄的朋友,大概都知道上面的流程。這個業務實現的難點在于,首次登錄成功并啟用指紋授權--->退出APP后--->二次啟動APP,如何判斷是否要啟用指紋登錄驗證呢?這時就需要我們對數據持久化和數據共享有較深的理解,很多APP開發者,在開發 登錄保持 的時候,大都會使用持久化數據的方式,存儲 成功登錄 的標記。但對于安全性較高的APP,每次重新啟動時都會校驗登錄狀態,單靠持久化數據是不夠的。

我的解決方案是:

通過三個數據進行 登錄保持 ,

loginState:持久化數據,用于存儲用戶登錄成功,未激活狀態;

startAutoLoginState:持久化數據,是否開啟指紋識別授權;

isAppCurrentLoginState:共享數據,登錄激活狀態,該狀態的特點,每次重新啟動APP都會重新初始化數據。

首次登錄:

三個數據變化情況,

狀態loginStatestartAutoLoginStateisAppCurrentLoginState登錄之前null或NOnull或NONO登錄成功YESnull或NOYES啟用指紋授權YESYESYES不啟用授權YESNOYES

二次驗證登錄(指紋登錄):

三個數據變化情況,

如果loginState和startAutoLoginState同為YES,即可進行指紋登錄驗證,以下為數據變化情況;

狀態loginStatestartAutoLoginStateisAppCurrentLoginState驗證之前YESYESNO驗證失敗NOYESNO驗證成功YESYESYES

否則,重新登錄。

核心代碼實現

判斷設備是否支持指紋識別

/** * 判斷設備是否支持指紋識別 */ - (IBAction)loginBtnAction:(UIButton *)sender{ [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@'loginState']; EVNHelper *helper = [EVNHelper shareHelper]; helper.isAppCurrentLoginState = YES; LAContext *context = [[LAContext alloc] init]; // 初始化上下文對象 NSError *error = nil; // 判斷設備是否支持指紋識別功能 if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 支持指紋驗證 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@'登錄成功!' message:@'是否啟用指紋登錄' preferredStyle:UIAlertControllerStyleAlert];__weak typeof (self) weakSelf = self; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@'稍后' style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@'startAutoLoginState']; weakSelf.transLoginStateBlock(); // 回傳 [self dismissViewControllerAnimated:YES completion:nil];}]; UIAlertAction *startUseAction = [UIAlertAction actionWithTitle:@'啟用' style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@'startAutoLoginState']; weakSelf.transLoginStateBlock(); // 回傳 [self dismissViewControllerAnimated:YES completion:nil];}];[alertController addAction:cancelAction];[alertController addAction:startUseAction];[self presentViewController:alertController animated:YES completion:nil]; } else {[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@'startAutoLoginState']; self.transLoginStateBlock(); // 回傳 [self dismissViewControllerAnimated:YES completion:nil]; }}

指紋登錄驗證

/** * 指紋登錄驗證 */ - (void)loadAuthentication{ __weak typeof(self) weakSelf = self; LAContext *myContext = [[LAContext alloc] init]; // 這個屬性是設置指紋輸入失敗之后的彈出框的選項 myContext.localizedFallbackTitle = @'忘記密碼'; NSError *authError = nil; NSString *myLocalizedReasonString = @'請按住Home鍵完成驗證'; // MARK: 判斷設備是否支持指紋識別 if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:myLocalizedReasonString reply:^(BOOL success, NSError * _Nullable error) { if(success) { NSLog(@'指紋認證成功');weakSelf.helper.isAppCurrentLoginState = YES;weakSelf.logoutBtnAction.hidden = NO;weakSelf.userInfo.text = @'仁伯安'; } else {weakSelf.helper.isAppCurrentLoginState = NO; NSLog(@'指紋認證失敗,%@',error.description); NSLog(@'%ld', (long)error.code); // 錯誤碼 error.code switch (error.code){ case LAErrorAuthenticationFailed: // Authentication was not successful, because user failed to provide valid credentials { NSLog(@'授權失敗'); // -1 連續三次指紋識別錯誤 } break; case LAErrorUserCancel: // Authentication was canceled by user (e.g. tapped Cancel button) { NSLog(@'用戶取消驗證Touch ID'); // -2 在TouchID對話框中點擊了取消按鈕 } break; case LAErrorUserFallback: // Authentication was canceled, because the user tapped the fallback button (Enter Password) {[[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@'用戶選擇輸入密碼,切換主線程處理'); // -3 在TouchID對話框中點擊了輸入密碼按鈕 }]; } break; case LAErrorSystemCancel: // Authentication was canceled by system (e.g. another application went to foreground) { NSLog(@'取消授權,如其他應用切入,用戶自主'); // -4 TouchID對話框被系統取消,例如按下Home或者電源鍵 } break; case LAErrorPasscodeNotSet: // Authentication could not start, because passcode is not set on the device. { NSLog(@'設備系統未設置密碼'); // -5 } break; case LAErrorTouchIDNotAvailable: // Authentication could not start, because Touch ID is not available on the device { NSLog(@'設備未設置Touch ID'); // -6 } break; case LAErrorTouchIDNotEnrolled: // Authentication could not start, because Touch ID has no enrolled fingers { NSLog(@'用戶未錄入指紋'); // -7 } break; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0 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 用戶連續多次進行Touch ID驗證失敗,Touch ID被鎖,需要用戶輸入密碼解鎖,先Touch ID驗證密碼 { NSLog(@'Touch ID被鎖,需要用戶輸入密碼解鎖'); // -8 連續五次指紋識別錯誤,TouchID功能被鎖定,下一次需要輸入系統密碼 } break; case LAErrorAppCancel: // Authentication was canceled by application (e.g. invalidate was called while authentication was in progress) 如突然來了電話,電話應用進入前臺,APP被掛起啦'); { NSLog(@'用戶不能控制情況下APP被掛起'); // -9 } break; case LAErrorInvalidContext: // LAContext passed to this call has been previously invalidated. { NSLog(@'LAContext傳遞給這個調用之前已經失效'); // -10 } break; #else #endif default: {[[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@'其他情況,切換主線程處理');}]; break; }} }}]; } else { NSLog(@'設備不支持指紋'); NSLog(@'%ld', (long)authError.code);weakSelf.helper.isAppCurrentLoginState = NO; switch (authError.code){ case LAErrorTouchIDNotEnrolled: { NSLog(@'Authentication could not start, because Touch ID has no enrolled fingers'); break; } case LAErrorPasscodeNotSet: { NSLog(@'Authentication could not start, because passcode is not set on the device'); break; } default: { NSLog(@'TouchID not available'); break; }} }}

參考文獻:

【1】 iOS security guide ;

【2】 Apple Objective-C ;

【3】 Apple Swift API .

來自:http://www.jianshu.com/p/67fd93408517

標簽: IOS
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美婷婷在线| 在线成人欧美| 欧美1区3d| 精品国产精品网麻豆系列| 石原莉奈在线亚洲二区| 国产欧美日韩视频一区二区三区| 国产精品久久久久一区二区三区共| 91免费版pro下载短视频| 日韩欧美你懂的| 国产精品一二三区| 欧美一二区视频| 国产盗摄一区二区| 日韩网站在线看片你懂的| 成人国产精品免费观看| 日韩欧美中文一区二区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日韩和欧美一区二区| 美女精品在线观看| 亚洲电影一级片| 久久午夜精品| 欧美96一区二区免费视频| 久久永久免费| 毛片不卡一区二区| 日韩一卡二卡三卡| 国产精华液一区二区三区| 欧美日韩国产一区二区三区地区| 韩国视频一区二区| 日韩女优毛片在线| 91丝袜美腿高跟国产极品老师 | 国产一区二区伦理| 欧美成人性战久久| 欧美jizzhd精品欧美喷水| 国产精品成人免费在线| 国产美女在线精品免费观看| 日韩专区中文字幕一区二区| 欧美日韩在线直播| 高清国产一区二区| 国产精品欧美久久久久一区二区| 亚洲福利一区| 亚洲成人福利片| 51精品久久久久久久蜜臀| 91亚洲国产成人精品一区二区三| 中文字幕一区二区三区视频| 亚洲一区二区三区免费在线观看| 久久精品国产99国产| 精品国产一二三| 在线观看一区视频| 日本伊人色综合网| 日韩欧美高清在线| 永久久久久久| 蜜桃在线一区二区三区| 日韩欧美自拍偷拍| 国产一区二区三区四区三区四| 亚洲精品成人悠悠色影视| 91久久香蕉国产日韩欧美9色| 成人性视频免费网站| 中文字幕视频一区| 91国偷自产一区二区开放时间 | 日韩一级黄色片| 女同性一区二区三区人了人一| 亚洲色图欧美偷拍| 色综合久久天天| 成人性生交大片| 2021久久国产精品不只是精品| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美天天视频| 午夜久久电影网| 欧美一级在线观看| 亚洲黄色影片| 国产综合色在线| 国产精品久久久久9999吃药| 老司机精品导航| av在线一区二区三区| 亚洲精品视频观看| 欧美日韩三级一区| 国产精品啊v在线| 久久99这里只有精品| 国产精品视频第一区| 久久婷婷影院| 欧美国产一区二区三区激情无套| 亚洲aaa精品| 久久久蜜桃精品| 色网综合在线观看| 欧美韩日精品| 奇米在线7777在线精品| 国产天堂亚洲国产碰碰| 在线观看免费成人| 国产精品二区影院| 精品亚洲porn| 亚洲三级在线观看| 91精品国产高清一区二区三区| 亚洲茄子视频| 国产69精品久久久久毛片| 亚洲欧美激情一区二区| 欧美一级一级性生活免费录像| 中日韩男男gay无套| 99免费精品视频| 日本不卡123| 中文字幕永久在线不卡| 91精品久久久久久久99蜜桃 | 欧美日韩在线不卡一区| 乱一区二区av| 中文字幕在线一区免费| 91精品国产综合久久久久久| 国产精品久久国产愉拍| 不卡视频免费播放| 青青草97国产精品免费观看无弹窗版 | 欧美色老头old∨ideo| 国产精品啊啊啊| 国产一区二区久久| 亚洲自拍偷拍九九九| 久久久午夜精品理论片中文字幕| 色婷婷av一区| 在线视频观看日韩| 97久久精品人人澡人人爽| 美美哒免费高清在线观看视频一区二区 | 中文日韩在线| 农村妇女精品| 国产精品综合网| 丝袜美腿亚洲一区二区图片| 国产精品久线在线观看| 欧美成人免费网站| 欧美日韩一区高清| 国产精品尤物| 影音先锋久久| 91视视频在线观看入口直接观看www | 亚洲经典在线| 成人av免费网站| 久久97超碰色| 香蕉影视欧美成人| 亚洲精品视频在线看| 欧美国产乱子伦| 欧美xxxx老人做受| 欧美日韩国产一级片| 久久久久国产精品一区二区| 一色屋精品视频在线看| www.成人网.com| 国产成人av电影在线播放| 美女视频黄a大片欧美| 丝袜亚洲另类丝袜在线| 亚洲在线中文字幕| 专区另类欧美日韩| 日本一区二区三区国色天香| 欧美成人bangbros| 欧美一区二区黄| 欧美日韩精品欧美日韩精品一| 麻豆九一精品爱看视频在线观看免费| 成人在线一区二区三区| 国产剧情av麻豆香蕉精品| 久久精品国产色蜜蜜麻豆| 偷窥国产亚洲免费视频| 亚洲精品国产第一综合99久久| 国产精品嫩草影院av蜜臀| 2014亚洲片线观看视频免费| 日韩一级黄色片| 9191成人精品久久| 欧美日韩国产a| 欧美日韩和欧美的一区二区| 欧美在线制服丝袜| 欧美性猛片xxxx免费看久爱| 色老汉av一区二区三区| 久久精品在线| 国产午夜精品在线| 亚洲看片一区| 99精品视频免费| 亚洲久久视频| 99精品国产一区二区青青牛奶| 国产综合自拍| 精品不卡视频| 国产视频一区欧美| 亚洲欧美日韩综合一区| 久久精品官网| 色成人在线视频| 欧美色视频一区| 欧美精品视频www在线观看| 欧美日本不卡视频| 91精品国产综合久久久蜜臀粉嫩 | 国内精品久久久久久久97牛牛 | 波多野结衣中文一区| 国产传媒欧美日韩成人| 国产伦理精品不卡| 国产成人亚洲精品狼色在线 | 亚洲一区二区成人| 亚洲一区欧美激情| 六月天综合网| 在线免费精品视频| 538prom精品视频线放| 亚洲精品一线二线三线无人区| 久久美女艺术照精彩视频福利播放| 久久久亚洲精品一区二区三区| 日本一区二区不卡视频| 亚洲欧美日韩国产综合在线| 亚洲一区二区黄色| 免费在线观看日韩欧美| 人人精品人人爱| 久久se精品一区二区| 成人性生交大片| 午夜精品短视频| 国产一区二区高清| 91成人看片片|