您好,登錄后才能下訂單哦!
這篇文章主要介紹iOS指紋驗(yàn)證TouchID的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
app喚醒的時(shí)候出現(xiàn)的畫面
點(diǎn)擊取消按鈕出現(xiàn)的頁面
這里我先掛上github的鏈接地址,畢竟本文的篇幅較長,也沒什么人有耐心有時(shí)間看到最后,頂多看下demo,快速的知道怎么調(diào)用啥的就可以了。(popViewForTouchID)
因?yàn)槲抑皼]遇到個(gè)這種情況,所以我做的都是自己瞎搞搞出來的,也不知道平時(shí)大家做的時(shí)候是怎么做的,就搞出來這樣的,這里我打算用兩種方法來實(shí)現(xiàn),不過這個(gè)東西放進(jìn)app中貌似是需要適配的。還是有些許問題的??赡芤{(diào)下。
在app被喚醒的時(shí)候,出現(xiàn)頁面我用了兩種方式,一種是present出來一個(gè)單獨(dú)的頁面,一種方式是自定義彈出view。
但是本文呢,主要就介紹一下彈出式view的方式,因?yàn)閜resent的方式跟這種方式差別就是在于一個(gè)是view一個(gè)是Controller,主要的思想還是一樣的。
第一部分
第一步
引入需要用的文件,以及創(chuàng)建pch文件,因?yàn)槭切emo,所以一些宏定義直接丟進(jìn)去就可以了。
第二步
創(chuàng)建pch文件,引入一些需要用到的文件以及宏定義,這里要是有問題的話可以參照我之前一篇文章寫的引入pch文件,當(dāng)然也可以老老實(shí)實(shí)的每個(gè)文件里都去引入頭文件啥的,這個(gè)很隨意的,畢竟是demo。
#import "AppDelegate.h" #import "WJTouchID.h" #import "MBProgressHUD.h" #import "MBProgressHUD+Add.h" // 屏幕bounds #define YLSScreenBounds [UIScreen mainScreen].bounds //位置 #define ZLRect(x, y, w, h) CGRectMake([UIScreen mainScreen].bounds.size.width * x, [UIScreen mainScreen].bounds.size.height * y, [UIScreen mainScreen].bounds.size.width * w, [UIScreen mainScreen].bounds.size.height * h) //字體大小 #define ZCFont(f) [UIScreen mainScreen].bounds.size.width * f
第三步
實(shí)現(xiàn)基礎(chǔ)頁面,如下圖
聲明變量,遵守指紋驗(yàn)證控件的協(xié)議
@interface ViewController ()<WJTouchIDDelegate> /** NoticeLabel */ @property (nonatomic,strong) UILabel *label; /** UISwitch */ @property (nonatomic,strong) UISwitch *touchIDSwitch; @property (nonatomic, strong) WJTouchID *touchID; @end
懶加載
-(UISwitch *)touchIDSwitch { if (!_touchIDSwitch) { self.touchIDSwitch = [[UISwitch alloc]init]; } return _touchIDSwitch; }
添加子控件
-(void)setSubViews { self.label = [[UILabel alloc]init]; [self.view addSubview:self.label]; [self.label setFrame:ZLRect(0, 100/667, 1, 20/667)]; [self.label setText:@"指紋解鎖"]; [self.label setTextAlignment:NSTextAlignmentCenter]; [self.label setFont:[UIFont systemFontOfSize:ZCFont(18/375)]]; self.touchIDSwitch = [[UISwitch alloc]init]; [self.touchIDSwitch setFrame:ZLRect(160/375, 200/667, 50/375, 28/667)]; [self.view addSubview:self.touchIDSwitch]; if ([[[NSUserDefaults standardUserDefaults]objectForKey:@"TouchID"] isEqualToString:@"1"]) { self.touchIDSwitch.on = YES; }else { self.touchIDSwitch.on = NO; } [self.touchIDSwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged]; }
這里要說一下
[[[NSUserDefaults standardUserDefaults]objectForKey:@"TouchID"] isEqualToString:@"1"]
這個(gè)我是將是否設(shè)置了指紋驗(yàn)證存到了本地,因?yàn)楫?dāng)你進(jìn)入設(shè)置頁面的時(shí)候,必須知道你本機(jī)是否已經(jīng)設(shè)置了指紋驗(yàn)證,這里存在著設(shè)置與未設(shè)置的一個(gè)頁面UI差別,我這邊就是用switch的開關(guān)來打開關(guān)閉指紋驗(yàn)證,也是用開關(guān)狀態(tài)來表示指紋驗(yàn)證是否打開。
第四步
在viewdidload方法中調(diào)用設(shè)置子控件的方法,并且實(shí)現(xiàn)開關(guān)切換的方法。
- (void)viewDidLoad { [super viewDidLoad]; [self setSubViews]; }
切換方法里呢,就是需要調(diào)用者會(huì)問驗(yàn)證,一般軟件設(shè)置指紋驗(yàn)證的時(shí)候都會(huì)要求你先驗(yàn)證一下子,我在這里設(shè)置成只要你開或關(guān)閉都需要驗(yàn)證一下。
-(void)changeSwitch:(id)sender { NSLog(@"------changeSwitch-------"); WJTouchID *touchid = [[WJTouchID alloc]init]; [touchid startWJTouchIDWithMessage:WJNotice(@"自定義信息", @"The Custom Message") fallbackTitle:WJNotice(@"", @"Fallback Title") delegate:self]; self.touchID = touchid; }
第五步
在上述調(diào)用指紋驗(yàn)證成功后,必須得實(shí)現(xiàn)它的回調(diào)函數(shù),在成功或者失敗的方法中寫上你需要執(zhí)行的代碼。
//TouchID驗(yàn)證成功 - (void) WJTouchIDAuthorizeSuccess { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; if (self.touchIDSwitch.on == YES) { [MBProgressHUD showText:@"成功開啟指紋解鎖" view:self.view]; [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"TouchID"]; }else{ [MBProgressHUD showText:@"指紋解鎖關(guān)閉成功" view:self.view]; [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"TouchID"]; } } //TouchID驗(yàn)證失敗 - (void) WJTouchIDAuthorizeFailure { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; if (self.touchIDSwitch.on == YES){ self.touchIDSwitch.on = NO; [MBProgressHUD showText:@"指紋解鎖開啟失敗" view:self.view]; [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"TouchID"]; }else { self.touchIDSwitch.on = YES; [MBProgressHUD showText:@"指紋解鎖關(guān)閉失敗" view:self.view]; [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"TouchID"]; } } //取消TouchID驗(yàn)證 (用戶點(diǎn)擊了取消) - (void) WJTouchIDAuthorizeErrorUserCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; if (self.touchIDSwitch.on == YES){ self.touchIDSwitch.on = NO; [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"TouchID"]; }else { self.touchIDSwitch.on = YES; [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"TouchID"]; } } //在驗(yàn)證的TouchID的過程中被系統(tǒng)取消 例如突然來電話、按了Home鍵、鎖屏 - (void) WJTouchIDAuthorizeErrorSystemCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; if (self.touchIDSwitch.on == YES){ self.touchIDSwitch.on = NO; [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"TouchID"]; }else { self.touchIDSwitch.on = YES; [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"TouchID"]; } } //多次連續(xù)使用Touch ID失敗,Touch ID被鎖,需要用戶輸入密碼解鎖 - (void) WJTouchIDAuthorizeLAErrorTouchIDLockout { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; [MBProgressHUD showText:@"驗(yàn)證失敗" view:self.view]; } //當(dāng)前軟件被掛起取消了授權(quán)(如突然來了電話,應(yīng)用進(jìn)入前臺(tái)) - (void) WJTouchIDAuthorizeLAErrorAppCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; if (self.touchIDSwitch.on == YES){ self.touchIDSwitch.on = NO; [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"TouchID"]; }else { self.touchIDSwitch.on = YES; [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"TouchID"]; } } //當(dāng)前軟件被掛起取消了授權(quán) (授權(quán)過程中,LAContext對象被釋) - (void) WJTouchIDAuthorizeLAErrorInvalidContext { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; if (self.touchIDSwitch.on == YES){ self.touchIDSwitch.on = NO; [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"TouchID"]; }else { self.touchIDSwitch.on = YES; [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"TouchID"]; } }
以上呢,我是沒有判斷是否支持touchid來寫,是直接按照可以支持的來寫的,大家在實(shí)際操作工程中還是需要加一下判斷條件,因?yàn)楝F(xiàn)在還是有不支持touchid的機(jī)型的。然后就是要說一下下面這個(gè)。
[[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
這個(gè)值我也不知道我是用來干嘛的,好像就是告訴我你設(shè)置了指紋驗(yàn)證了,然后在app喚醒的時(shí)候要根據(jù)一個(gè)值來判斷是否需要調(diào)用指紋驗(yàn)證服務(wù),我后來想了想,好像只要
[[[NSUserDefaults standardUserDefaults]objectForKey:@"TouchID"] isEqualToString:@"1"]
這個(gè)就可以了,但是仔細(xì)想想還是再加上一個(gè)好分辨一點(diǎn),畢竟就把一個(gè)當(dāng)做判斷switch是否打開,一個(gè)判斷喚醒的時(shí)候要不要調(diào)用的吧。在不同的回調(diào)函數(shù)里面需要寫的東西還是有差別的。這樣上面寫完之后,就等于實(shí)現(xiàn)一個(gè)簡單的基礎(chǔ)頁面,當(dāng)然這個(gè)還不是什么大問題,因?yàn)檫@個(gè)很簡單,下面就是要實(shí)現(xiàn)彈出view了。篇幅好像有點(diǎn)長了,我自己看的也有點(diǎn)煩了都。。。。。
第二部分
第一步
創(chuàng)建自定義的view。在.h文件中寫入方法
@interface YLSTouchidView : UIView /** * 快速創(chuàng)建 */ +(instancetype)touchIDView; /** * 彈出 */ -(void)show; -(void)showInView:(UIView *)view; @end
第二步
在.m文件中聲明控件,設(shè)置頁面大小,以及遵守協(xié)議,在頁面出來的同時(shí)就要調(diào)用驗(yàn)證服務(wù)。
@interface YLSTouchidView()<WJTouchIDDelegate> /** 指紋解鎖的button */ @property (nonatomic,strong) UIButton *touchIdBtn; /** 頭像 */ @property (nonatomic,strong) UIImageView *iconView; /** 用戶名 */ @property (nonatomic,strong) UILabel *nameLabel; /** 提示信息 */ @property (nonatomic,strong) UILabel *noticeLabel; /** 手機(jī)號(hào) */ @property (nonatomic,strong) NSString *phoneNumber; /** 退出按鈕 */ @property (nonatomic,strong) UIButton *quitBtn; @property (nonatomic, strong) WJTouchID *touchID; @end -(instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:YLSScreenBounds]; if (self) { self.backgroundColor = [UIColor orangeColor]; } //調(diào)用指紋解鎖 WJTouchID *touchid = [[WJTouchID alloc]init]; [touchid startWJTouchIDWithMessage:WJNotice(@"自定義信息", @"The Custom Message") fallbackTitle:WJNotice(@"", @"Fallback Title") delegate:self]; self.touchID = touchid; return self; }
第三步
設(shè)置控件的位置大小等等屬性。
- (void)layoutSubviews { [super layoutSubviews]; self.iconView = [[UIImageView alloc]init]; [self.iconView setFrame:ZLRect(128/320, 54/568, 65/320, 65/568)]; [self.iconView setImage:[UIImage imageNamed:@"icon_myinformation"]]; [self addSubview:self.iconView]; self.nameLabel = [[UILabel alloc]init]; [self.nameLabel setFrame:ZLRect(0, 125/568, 1, 28/568)]; [self.nameLabel setText:@"151****1234"]; [self.nameLabel setFont:[UIFont systemFontOfSize:ZCFont(15/375)]]; [self.nameLabel setTextColor:[UIColor whiteColor]]; [self.nameLabel setTextAlignment:NSTextAlignmentCenter]; [self addSubview:self.nameLabel]; self.touchIdBtn = [[UIButton alloc]init]; [self.touchIdBtn setFrame:ZLRect(120/320, 250/568, 80/320, 80/568)]; [self.touchIdBtn setImage:[UIImage imageNamed:@"touchImg"] forState:UIControlStateNormal]; [self.touchIdBtn addTarget:self action:@selector(clickToCheckTouchID) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:self.touchIdBtn]; self.noticeLabel = [[UILabel alloc]init]; [self.noticeLabel setFrame:ZLRect(0, 339/568, 1, 22/568)]; [self.noticeLabel setText:@"點(diǎn)擊進(jìn)行指紋解鎖"]; [self.noticeLabel setTextColor:[UIColor whiteColor]]; [self.noticeLabel setTextAlignment:NSTextAlignmentCenter]; [self.noticeLabel setFont:[UIFont systemFontOfSize:ZCFont(16/375)]]; [self addSubview:self.noticeLabel]; self.quitBtn = [[UIButton alloc]init]; [self.quitBtn setFrame:ZLRect(0, 520/568, 1, 30/568)]; [self.quitBtn setTitle:@"退出" forState:UIControlStateNormal]; [self.quitBtn addTarget:self action:@selector(quitContent) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:self.quitBtn]; }
第四步
實(shí)現(xiàn)控件的點(diǎn)擊方法,以及在.h文件中聲明的彈出方法
//快速創(chuàng)建 + (instancetype)touchIDView { return [[self alloc]init]; } /** 彈出 */ - (void)show { [self showInView:[UIApplication sharedApplication].keyWindow]; } - (void)showInView:(UIView *)view { // 浮現(xiàn) [view addSubview:self]; } -(void)clickToCheckTouchID { NSLog(@"點(diǎn)擊了指紋解鎖"); [self.touchID startWJTouchIDWithMessage:WJNotice(@"自定義信息", @"The Custom Message") fallbackTitle:WJNotice(@"", @"Fallback Title") delegate:self]; } -(void)quitContent { NSLog(@"點(diǎn)擊了quit"); [UIView animateWithDuration:3 animations:^{ self.alpha = 0; } completion:^(BOOL finished) { [self removeFromSuperview]; }]; }
上面再退出的時(shí)候我還加了一個(gè)小小的特效,就是顏色漸漸變成無色,這樣有時(shí)候可以遮蓋你app里面的一些小問題。偷個(gè)懶。
第五步
這里也是跟第一部分一樣,實(shí)現(xiàn)驗(yàn)證的回調(diào)函數(shù)。這邊的回調(diào)函數(shù)呢,跟之前的差不多,但是里面的內(nèi)容就不一樣了。而且我這里把不支持touchid的方法加進(jìn)來,按理說這邊是不需要加的,但是我前面沒加進(jìn)來,這里就硬塞進(jìn)來吧。。。大家就湊合著看,自己用的時(shí)候可以直接刪掉,不刪掉也沒事,就是增加點(diǎn)代碼量而已。。。
/** * TouchID驗(yàn)證成功 */ - (void) WJTouchIDAuthorizeSuccess { [MBProgressHUD showText:@"解鎖成功" view:self]; [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; // [self dismissViewControllerAnimated:YES completion:nil]; [self removeFromSuperview]; } /** * TouchID驗(yàn)證失敗 */ - (void) WJTouchIDAuthorizeFailure { [MBProgressHUD showText:@"解鎖失敗" view:self]; [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 取消TouchID驗(yàn)證 (用戶點(diǎn)擊了取消) */ - (void) WJTouchIDAuthorizeErrorUserCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 在驗(yàn)證的TouchID的過程中被系統(tǒng)取消 例如突然來電話、按了Home鍵、鎖屏... */ - (void) WJTouchIDAuthorizeErrorSystemCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 無法啟用TouchID,設(shè)備沒有設(shè)置密碼 */ - (void) WJTouchIDAuthorizeErrorPasscodeNotSet { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 設(shè)備沒有錄入TouchID,無法啟用TouchID */ - (void) WJTouchIDAuthorizeErrorTouchIDNotEnrolled { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 該設(shè)備的TouchID無效 */ - (void) WJTouchIDAuthorizeErrorTouchIDNotAvailable { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 多次連續(xù)使用Touch ID失敗,Touch ID被鎖,需要用戶輸入密碼解鎖 */ - (void) WJTouchIDAuthorizeLAErrorTouchIDLockout { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 當(dāng)前軟件被掛起取消了授權(quán)(如突然來了電話,應(yīng)用進(jìn)入前臺(tái)) */ - (void) WJTouchIDAuthorizeLAErrorAppCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 當(dāng)前軟件被掛起取消了授權(quán) (授權(quán)過程中,LAContext對象被釋) */ - (void) WJTouchIDAuthorizeLAErrorInvalidContext { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 當(dāng)前設(shè)備不支持指紋識(shí)別 */ -(void)WJTouchIDIsNotSupport { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; }
第三部分
這里呢,是最重要的地方,也是最簡單的地方,只要在appdelegate.m文件中加上幾句話就可以實(shí)現(xiàn)了。
在下面這個(gè)方法里面寫,下面這個(gè)方法是呢app被喚醒進(jìn)入活躍狀態(tài)的方法
- (void)applicationDidBecomeActive:(UIApplication *)application
這邊的知識(shí)點(diǎn)其實(shí)還挺多的,就是一個(gè)生命周期的問題,一個(gè)app運(yùn)行完成,即將進(jìn)入活躍狀態(tài),已經(jīng)進(jìn)入活躍狀態(tài),即將進(jìn)入后臺(tái),已經(jīng)進(jìn)入后臺(tái)狀態(tài),這幾種狀態(tài),在之前我還想著聲明一個(gè)變量讓app在后臺(tái)運(yùn)行的時(shí)候,也跟著運(yùn)行,類似于一個(gè)計(jì)時(shí)器,但是我看了網(wǎng)上的一些想要讓app后臺(tái)掛起的時(shí)候還能運(yùn)行一些東西,設(shè)置過程就好幾種,而且很多都說上架的時(shí)候?qū)徍耸遣唤o過得,想著有時(shí)間的話可以好好研究下那些方法,這里我就沒有弄,所以才有了上面的
[[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
這個(gè)值,本來也是設(shè)置成計(jì)時(shí)器的,但是這樣好像更方便點(diǎn),就這么設(shè)置了,因?yàn)闉榱巳侄伎梢匀〉竭@個(gè)值。
在喚醒方法中寫下代碼
- (void)applicationDidBecomeActive:(UIApplication *)application { NSString *touchIDExist = [[NSUserDefaults standardUserDefaults]objectForKey:@"TouchID"]; NSString *touchISOn = [[NSUserDefaults standardUserDefaults]objectForKey:@"touchIDISon"]; if ([touchIDExist isEqualToString:@"1"] && [touchISOn isEqualToString:@"NO"]) { YLSTouchidView *yls = [[YLSTouchidView alloc]init]; [yls show]; } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[NSUserDefaults standardUserDefaults]setObject:@"NO" forKey:@"touchIDISon"]; }); }
以上是“iOS指紋驗(yàn)證TouchID的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。