日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

iOS指紋識別登錄流程及實現(xiàn)

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

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

iOS指紋識別登錄流程及實現(xiàn)

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

指紋識別簡析

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

iOS指紋識別登錄流程及實現(xiàn)

iOS 安全架構(gòu)圖

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

剛開機或重啟;

超過 48 小時未解鎖設(shè)備;

設(shè)備收到了遠程鎖定命令;

五次未能成功匹配指紋;

進入Touch ID設(shè)置模塊或更新新指紋;

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

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

流程分析

指紋登錄流程:

iOS指紋識別登錄流程及實現(xiàn)

首次登錄.png

二次啟動后識別登錄:

iOS指紋識別登錄流程及實現(xiàn)

指紋驗證登錄.png

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

我的解決方案是:

通過三個數(shù)據(jù)進行 登錄保持 ,

loginState:持久化數(shù)據(jù),用于存儲用戶登錄成功,未激活狀態(tài);

startAutoLoginState:持久化數(shù)據(jù),是否開啟指紋識別授權(quán);

isAppCurrentLoginState:共享數(shù)據(jù),登錄激活狀態(tài),該狀態(tài)的特點,每次重新啟動APP都會重新初始化數(shù)據(jù)。

首次登錄:

三個數(shù)據(jù)變化情況,

狀態(tài)loginStatestartAutoLoginStateisAppCurrentLoginState登錄之前null或NOnull或NONO登錄成功YESnull或NOYES啟用指紋授權(quán)YESYESYES不啟用授權(quán)YESNOYES

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

三個數(shù)據(jù)變化情況,

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

狀態(tài)loginStatestartAutoLoginStateisAppCurrentLoginState驗證之前YESYESNO驗證失敗NOYESNO驗證成功YESYESYES

否則,重新登錄。

核心代碼實現(xiàn)

判斷設(shè)備是否支持指紋識別

/** * 判斷設(shè)備是否支持指紋識別 */ - (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; // 判斷設(shè)備是否支持指紋識別功能 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]; // 這個屬性是設(shè)置指紋輸入失敗之后的彈出框的選項 myContext.localizedFallbackTitle = @'忘記密碼'; NSError *authError = nil; NSString *myLocalizedReasonString = @'請按住Home鍵完成驗證'; // MARK: 判斷設(shè)備是否支持指紋識別 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(@'授權(quán)失敗'); // -1 連續(xù)三次指紋識別錯誤 } 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(@'取消授權(quán),如其他應(yīng)用切入,用戶自主'); // -4 TouchID對話框被系統(tǒng)取消,例如按下Home或者電源鍵 } break; case LAErrorPasscodeNotSet: // Authentication could not start, because passcode is not set on the device. { NSLog(@'設(shè)備系統(tǒng)未設(shè)置密碼'); // -5 } break; case LAErrorTouchIDNotAvailable: // Authentication could not start, because Touch ID is not available on the device { NSLog(@'設(shè)備未設(shè)置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 用戶連續(xù)多次進行Touch ID驗證失敗,Touch ID被鎖,需要用戶輸入密碼解鎖,先Touch ID驗證密碼 { NSLog(@'Touch ID被鎖,需要用戶輸入密碼解鎖'); // -8 連續(xù)五次指紋識別錯誤,TouchID功能被鎖定,下一次需要輸入系統(tǒng)密碼 } break; case LAErrorAppCancel: // Authentication was canceled by application (e.g. invalidate was called while authentication was in progress) 如突然來了電話,電話應(yīng)用進入前臺,APP被掛起啦'); { NSLog(@'用戶不能控制情況下APP被掛起'); // -9 } break; case LAErrorInvalidContext: // LAContext passed to this call has been previously invalidated. { NSLog(@'LAContext傳遞給這個調(diào)用之前已經(jīng)失效'); // -10 } break; #else #endif default: {[[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@'其他情況,切換主線程處理');}]; break; }} }}]; } else { NSLog(@'設(shè)備不支持指紋'); 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

標(biāo)簽: IOS
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩欧美2区| 午夜电影亚洲| 日韩精彩视频在线观看| 99riav国产精品| 美女精品网站| 日本欧美在线看| 免费在线观看不卡| 69精品国产久热在线观看| 日本aⅴ亚洲精品中文乱码 | 欧美午夜不卡| 日韩中文字幕亚洲一区二区va在线 | 国产欧美日韩一区二区三区在线| 香蕉久久一区| 国产欧美日韩在线一区二区 | 日韩精品一区二区三区免费观影| 日韩精品首页| 亚洲精品成人一区| 国产精品成人国产| 日韩免费小视频| 免费观看在线色综合| 久久国产婷婷国产香蕉| 日韩精品dvd| 亚洲免费一区三区| 精品视频高潮| 亚洲一区二区三区四区五区午夜| 日韩精品一级| 欧美69视频| 国产精品亚洲欧美一级在线| 五月激情久久| 亚洲人成亚洲精品| 福利一区二区| 首页国产欧美久久| 精品欧美日韩精品| 亚洲精品护士| 久久一级电影| 久久99视频| 四虎精品一区二区免费| 日韩欧美一区二区三区免费观看| 蜜桃视频一区二区| 欧美日韩一区二区三区视频播放| 日韩激情啪啪| 久久国产精品亚洲77777| 在线精品亚洲欧美日韩国产| 91成人在线精品视频| 999精品色在线播放| 国产精品99精品一区二区三区∴ | 欧美日韩18| 丝袜亚洲另类欧美| 午夜电影亚洲| 午夜欧美精品久久久久久久| 中文字幕人成乱码在线观看 | 日本三级亚洲精品| 欧美另类综合| 欧美黄页在线免费观看| 日本亚洲视频| 中文字幕av一区二区三区人| 五月天激情综合网| 久久一区二区三区喷水| 国产精品成人国产| 国产精品一区二区三区美女| 深夜日韩欧美| 国产亚洲在线| 快she精品国产999| 亚洲人www| 日韩国产在线观看一区| 日本aⅴ免费视频一区二区三区| 亚洲日产av中文字幕| 亚洲精品韩国| 91成人在线网站| 成人在线视频区| 视频二区不卡| 国产精品日本| 日本精品另类| 国产精品a级| 日韩啪啪电影网| 九九久久婷婷| 日韩在线一二三区| 亚洲精品一二三**| 免费亚洲婷婷| 成人免费电影网址| 欧美.日韩.国产.一区.二区 | 国产资源在线观看入口av| 国产精品嫩模av在线| 国产欧美一区二区三区精品观看 | 国产亚洲一级| 日本不卡不码高清免费观看 | 日韩毛片网站| 伊人国产精品| 国产一级久久| 国产香蕉精品| 另类国产ts人妖高潮视频| 亚洲精品激情| 激情中国色综合| 亚洲午夜黄色| 国产精品密蕾丝视频下载| 日韩在线高清| 97久久精品| 日韩国产激情| 一区福利视频| 国产极品嫩模在线观看91精品| 中文字幕在线视频网站| 视频在线观看一区| 亚洲国产成人二区| 国产亚洲在线观看| 国产成人77亚洲精品www| 视频一区二区不卡| 日韩精品久久久久久久电影99爱| 日韩中出av| 99国产精品99久久久久久粉嫩| 精品视频国产| 无码日韩精品一区二区免费| 在线看片一区| 欧美特黄a级高清免费大片a级| 国产精品美女午夜爽爽| 日韩中文欧美在线| 亚洲精品小说| 深夜视频一区二区| 国产成人精品一区二区三区视频 | 国产传媒av在线| 国产精品美女午夜爽爽| 深夜日韩欧美| 午夜久久影院| 日韩精品诱惑一区?区三区| 国产亚洲精品精品国产亚洲综合| 丝袜亚洲精品中文字幕一区| 午夜欧美视频| 午夜久久免费观看| 欧美日中文字幕| 久久高清精品| 国精品一区二区三区| 久久婷婷丁香| 免费观看不卡av| 国产h片在线观看| 欧美国产精品| 水蜜桃精品av一区二区| 精品一区二区三区视频在线播放| 国产日韩一区二区三区在线 | 好看的亚洲午夜视频在线| 国产h片在线观看| 亚洲成av人片一区二区密柚| 视频二区不卡| 亚洲作爱视频| 成人av二区| 亚洲精品乱码久久久久久蜜桃麻豆| 在线日韩成人| 欧美精品不卡| 99精品视频在线| 日韩在线一二三区| 国产丝袜一区| 人人精品亚洲| 日韩专区视频网站| 日韩不卡一区| 国产精品呻吟| 91在线成人| 中文在线免费视频| 在线亚洲免费| 国产乱论精品| 精品免费视频| 99久久视频| 国产综合色产| 国产欧美另类| 99精品美女| 日本成人中文字幕| 日本免费久久| 蜜臀久久久99精品久久久久久| 欧美日韩一视频区二区| 日韩中文影院| 久久国产免费看| 九九综合在线| 国产一区调教| 日韩一区二区三区免费视频| 日本一区二区高清不卡| 亚洲黄页一区| 成人影视亚洲图片在线| 亚洲欧美久久| 91tv亚洲精品香蕉国产一区| 国产高清日韩| 日本欧美在线看| 免费久久精品| 亚洲日本网址| 精品亚洲精品| 国产精品一区高清| 日本电影久久久| 水蜜桃久久夜色精品一区的特点| 日韩大片在线播放| 国产精品午夜av| 免费精品视频最新在线| 黄色在线网站噜噜噜| 久久99精品久久久久久园产越南| 久久国产精品亚洲77777| 久久天堂成人| 里番精品3d一二三区| 欧美日韩中出| 亚洲婷婷丁香| 亚洲一区日本| 在线视频精品| 蜜臀久久99精品久久久久宅男| 日韩不卡视频在线观看| 日韩免费在线| 日韩一区二区在线免费|