上一篇文章復雜的寫了關於touchid的復雜理解。由於太懶了,就沒有寫實例,如今就獨自寫一篇使用吧,這篇想做的就是一個模擬那個叫啥軟件來著,某某理財類類的軟件的一個指紋驗證解鎖。我們做出來的頁面應該如下圖,在app掛起到後台的時分再點擊到前台的時分回呈現如下頁面:
app喚醒的時分呈現的畫面
點擊取消按鈕呈現的頁面
這裡我先掛上github的鏈接地址,畢竟本文的篇幅較長,也沒什麼人有耐煩有時間看到最後,頂多看下demo,疾速的知道怎樣調用啥的就可以了。(popViewForTouchID)
由於我之前沒遇到個這種狀況,所以我做的都是自己瞎搞搞出來的,也不知道平常大家做的時分是怎樣做的,就搞出來這樣的,這裡我計劃用兩種辦法來完成,不過這個東西放進app中貌似是需求適配的。還是有些許問題的。能夠要調下。
在app被喚醒的時分,呈現頁面我用了兩種方式,一種是present出來一個獨自的頁面,一種方式是自定義彈出view。
但是本文呢,次要就引見一下彈出式view的方式,由於present的方式跟這種方式差異就是在於一個是view一個是Controller,次要的思想還是一樣的。
第一局部
第一步
引入需求用的文件,以及創立pch文件,由於是小demo,所以一些宏定義直接丟出來就可以了。
第二步
創立pch文件,引入一些需求用到的文件以及宏定義,這裡要是有問題的話可以參照我之前一篇文章寫的引入pch文件,當然也可以老老實實的每個文件裡都去引入頭文件啥的,這個很隨意的,畢竟是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
第三步
完成根底頁面,如下圖
聲明變量,恪守指紋驗證控件的協議
@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"]
這個我是將能否設置了指紋驗證存到了本地,由於當你進入設置頁面的時分,必需知道你本機能否曾經設置了指紋驗證,這裡存在著設置與未設置的一個頁面UI差異,我這邊就是用switch的開關來翻開封閉指紋驗證,也是用開關形態來表示指紋驗證能否翻開。
第四步
在viewdidload辦法中調用設置子控件的辦法,並且完成開關切換的辦法。
- (void)viewDidLoad { [super viewDidLoad]; [self setSubViews]; }
切換辦法裡呢,就是需求調用者會問驗證,普通軟件設置指紋驗證的時分都會要求你先驗證一下子,我在這裡設置成只需你開或封閉都需求驗證一下。
-(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; }
第五步
在上述調用指紋驗證成功後,必需得完成它的回調函數,在成功或許失敗的辦法中寫上你需求執行的代碼。
//TouchID驗證成功 - (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:@"指紋解鎖封閉成功" view:self.view]; [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"TouchID"]; } } //TouchID驗證失敗 - (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:@"指紋解鎖封閉失敗" view:self.view]; [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"TouchID"]; } } //取消TouchID驗證 (用戶點擊了取消) - (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"]; } } //在驗證的TouchID的進程中被零碎取消 例如忽然來電話、按了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"]; } } //屢次延續運用Touch ID失敗,Touch ID被鎖,需求用戶輸出密碼解鎖 - (void) WJTouchIDAuthorizeLAErrorTouchIDLockout { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; [MBProgressHUD showText:@"驗證失敗" view:self.view]; } //以後軟件被掛起取消了受權(如忽然來了電話,使用進入前台) - (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"]; } } //以後軟件被掛起取消了受權 (受權進程中,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來寫,是直接依照可以支持的來寫的,大家在實踐操作工程中還是需求加一下判別條件,由於如今還是有不支持touchid的機型的。然後就是要說一下上面這個。
[[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
這個值我也不知道我是用來干嘛的,仿佛就是通知我你設置了指紋驗證了,然後在app喚醒的時分要依據一個值來判別能否需求調用指紋驗證服務,我後來想了想,仿佛只需
[[[NSUserDefaults standardUserDefaults]objectForKey:@"TouchID"] isEqualToString:@"1"]
這個就可以了,但是細心想想還是再加上一個好分辨一點,畢竟就把一個當做判別switch能否翻開,一個判別喚醒的時分要不要調用的吧。在不同的回調函數外面需求寫的東西還是有差異的。這樣下面寫完之後,就等於完成一個復雜的根底頁面,當然這個還不是什麼大問題,由於這個很復雜,上面就是要完成彈出view了。篇幅仿佛有點長了,我自己看的也有點煩了都。。。。。
第二局部
第一步
創立自定義的view。在.h文件中寫入辦法
@interface YLSTouchidView : UIView /** * 疾速創立 */ +(instancetype)touchIDView; /** * 彈出 */ -(void)show; -(void)shoWinView:(UIView *)view; @end
第二步
在.m文件中聲明控件,設置頁面大小,以及恪守協議,在頁面出來的同時就要調用驗證服務。
@interface YLSTouchidView()<WJTouchIDDelegate> /** 指紋解鎖的button */ @property (nonatomic,strong) UIButton *touchIdBtn; /** 頭像 */ @property (nonatomic,strong) UIImageView *iconView; /** 用戶名 */ @property (nonatomic,strong) UILabel *nameLabel; /** 提示信息 */ @property (nonatomic,strong) UILabel *noticeLabel; /** 手機號 */ @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]; } //調用指紋解鎖 WJTouchID *touchid = [[WJTouchID alloc]init]; [touchid startWJTouchIDWithMessage:WJNotice(@"自定義信息", @"The Custom Message") fallbackTitle:WJNotice(@"", @"Fallback Title") delegate:self]; self.touchID = touchid; return self; }
第三步
設置控件的地位大小等等屬性。
- (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:@"點擊停止指紋解鎖"]; [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]; }
第四步
完成控件的點擊辦法,以及在.h文件中聲明的彈出辦法
//疾速創立 + (instancetype)touchIDView { return [[self alloc]init]; } /** 彈出 */ - (void)show { [self shoWinView:[UIApplication sharedApplication].keyWindow]; } - (void)showInView:(UIView *)view { // 顯現 [view addSubview:self]; } -(void)clickToCheckTouchID { NSLog(@"點擊了指紋解鎖"); [self.touchID startWJTouchIDWithMessage:WJNotice(@"自定義信息", @"The Custom Message") fallbackTitle:WJNotice(@"", @"Fallback Title") delegate:self]; } -(void)quitContent { NSLog(@"點擊了quit"); [UIView animateWithDuration:3 animations:^{ self.alpha = 0; } completion:^(BOOL finished) { [self removeFromSuperview]; }]; }
下面再加入的時分我還加了一個小小的特效,就是顏色漸突變成無色,這樣有時分可以遮蓋你app外面的一些小問題。偷個懶。
第五步
這裡也是跟第一局部一樣,完成驗證的回調函數。這邊的回調函數呢,跟之前的差不多,但是外面的內容就不一樣了。而且我這裡把不支持touchid的辦法加出去,按理說這邊是不需求加的,但是我後面沒加出去,這裡就硬塞出去吧。。。大家就對付著看,自己用的時分可以直接刪掉,不刪掉也沒事,就是添加點代碼量而已。。。
/** * TouchID驗證成功 */ - (void) WJTouchIDAuthorizeSuccess { [MBProgressHUD showText:@"解鎖成功" view:self]; [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; // [self dismissViewControllerAnimated:YES completion:nil]; [self removeFromSuperview]; } /** * TouchID驗證失敗 */ - (void) WJTouchIDAuthorizeFailure { [MBProgressHUD showText:@"解鎖失敗" view:self]; [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 取消TouchID驗證 (用戶點擊了取消) */ - (void) WJTouchIDAuthorizeErrorUserCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 在驗證的TouchID的進程中被零碎取消 例如忽然來電話、按了Home鍵、鎖屏... */ - (void) WJTouchIDAuthorizeErrorSystemCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 無法啟用TouchID,設備沒有設置密碼 */ - (void) WJTouchIDAuthorizeErrorPasscodeNotSet { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 設備沒有錄入TouchID,無法啟用TouchID */ - (void) WJTouchIDAuthorizeErrorTouchIDNotEnrolled { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 該設備的TouchID有效 */ - (void) WJTouchIDAuthorizeErrorTouchIDNotAvailable { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 屢次延續運用Touch ID失敗,Touch ID被鎖,需求用戶輸出密碼解鎖 */ - (void) WJTouchIDAuthorizeLAErrorTouchIDLockout { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 以後軟件被掛起取消了受權(如忽然來了電話,使用進入前台) */ - (void) WJTouchIDAuthorizeLAErrorAppCancel { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 以後軟件被掛起取消了受權 (受權進程中,LAContext對象被釋) */ - (void) WJTouchIDAuthorizeLAErrorInvalidContext { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; } /** * 以後設備不支持指紋辨認 */ -(void)WJTouchIDIsNotSupport { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"]; }
第三局部
這裡呢,是最重要的中央,也是最復雜的中央,只需在appdelegate.m文件中加上幾句話就可以完成了。
在上面這個辦法外面寫,上面這個辦法是呢app被喚醒進入活潑形態的辦法
- (void)applicationDidBecomeActive:(UIApplication *)application
這邊的知識點其實還挺多的,就是一個生命周期的問題,一個app運轉完成,行將進入活潑形態,曾經進入活潑形態,行將進入後台,曾經進入後台形態,這幾種形態,在之前我還想著聲明一個變量讓app在後台運轉的時分,也跟著運轉,相似於一個計時器,但是我看了網上的一些想要讓app後台掛起的時分還能運轉一些東西,設置進程就好幾種,而且很多都說上架的時分審核是不給過得,想著有時間的話可以好好研討下那些辦法,這裡我就沒有弄,所以才有了下面的
[[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
這個值,原本也是設置成計時器的,但是這樣仿佛更方便點,就這麼設置了,由於為了全局都可以取到這個值。
在喚醒辦法中寫下代碼
- (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"]; }); }
上面那個呢就是為了避免反復調用,由於仿佛當頁面呈現指紋驗證的彈出框的時分,app似乎就是被掛起到後台了,然後喚醒的時分又要被調用,所以這裡呈現了一個反復調用的問題,然後我就找個不是方法的方法來處理這個問題。就是用下面這段代碼來處置,詳細道理我也不知道咋說,就這麼恍恍惚惚的完成了功用。這樣子就是完成了一個指紋驗證以及app喚醒的時分指紋解鎖的一個小demo。present出來一個獨自的頁面的方式其實跟這個差不多,但是這篇文章的篇幅仿佛有點太長了,估量也沒什麼人看到最後,所以我就不寫了,啥時分想補的話再補下去吧。
#### 還有就是,自己作為老手,下面代碼有啥問題的話,或許有啥可以優化的中央,希望大家可以指正,大家一同共同提高共同窗習。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持本站。
【iOS指紋驗證TouchID使用學習教程2】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!