国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS指紋驗證TouchID應(yīng)用學(xué)習(xí)教程2

2019-10-21 18:49:04
字體:
供稿:網(wǎng)友

上一篇文章簡單的寫了對于touchid的簡單了解。因為太懶了,就沒有寫實例,現(xiàn)在就單獨寫一篇應(yīng)用吧,這篇想做的就是一個模仿那個叫啥軟件來著,某某理財類類的軟件的一個指紋驗證解鎖。我們做出來的頁面應(yīng)該如下圖,在app掛起到后臺的時候再點擊到前臺的時候回出現(xiàn)如下頁面:

app喚醒的時候出現(xiàn)的畫面

iOS,指紋驗證,TouchID

點擊取消按鈕出現(xiàn)的頁面

iOS,指紋驗證,TouchID

    這里我先掛上github的鏈接地址,畢竟本文的篇幅較長,也沒什么人有耐心有時間看到最后,頂多看下demo,快速的知道怎么調(diào)用啥的就可以了。(popViewForTouchID)

    因為我之前沒遇到個這種情況,所以我做的都是自己瞎搞搞出來的,也不知道平時大家做的時候是怎么做的,就搞出來這樣的,這里我打算用兩種方法來實現(xiàn),不過這個東西放進app中貌似是需要適配的。還是有些許問題的。可能要調(diào)下。

    在app被喚醒的時候,出現(xiàn)頁面我用了兩種方式,一種是present出來一個單獨的頁面,一種方式是自定義彈出view。

    但是本文呢,主要就介紹一下彈出式view的方式,因為present的方式跟這種方式差別就是在于一個是view一個是Controller,主要的思想還是一樣的。

第一部分

第一步

    引入需要用的文件,以及創(chuàng)建pch文件,因為是小demo,所以一些宏定義直接丟進去就可以了。

iOS,指紋驗證,TouchID

第二步

    創(chuàng)建pch文件,引入一些需要用到的文件以及宏定義,這里要是有問題的話可以參照我之前一篇文章寫的引入pch文件,當(dāng)然也可以老老實實的每個文件里都去引入頭文件啥的,這個很隨意的,畢竟是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

第三步

    實現(xiàn)基礎(chǔ)頁面,如下圖

iOS,指紋驗證,TouchID

聲明變量,遵守指紋驗證控件的協(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"]   

這個我是將是否設(shè)置了指紋驗證存到了本地,因為當(dāng)你進入設(shè)置頁面的時候,必須知道你本機是否已經(jīng)設(shè)置了指紋驗證,這里存在著設(shè)置與未設(shè)置的一個頁面UI差別,我這邊就是用switch的開關(guān)來打開關(guān)閉指紋驗證,也是用開關(guān)狀態(tài)來表示指紋驗證是否打開。

第四步

    在viewdidload方法中調(diào)用設(shè)置子控件的方法,并且實現(xiàn)開關(guān)切換的方法。

- (void)viewDidLoad { [super viewDidLoad]; [self setSubViews];}

切換方法里呢,就是需要調(diào)用者會問驗證,一般軟件設(shè)置指紋驗證的時候都會要求你先驗證一下子,我在這里設(shè)置成只要你開或關(guā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)用指紋驗證成功后,必須得實現(xiàn)它的回調(diào)函數(shù),在成功或者失敗的方法中寫上你需要執(zhí)行的代碼。

 

//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:@"指紋解鎖關(guān)閉成功" 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:@"指紋解鎖關(guān)閉失敗" 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的過程中被系統(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:@"驗證失敗" view:self.view];}//當(dāng)前軟件被掛起取消了授權(quán)(如突然來了電話,應(yīng)用進入前臺)- (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來寫,是直接按照可以支持的來寫的,大家在實際操作工程中還是需要加一下判斷條件,因為現(xiàn)在還是有不支持touchid的機型的。然后就是要說一下下面這個。

[[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];

    這個值我也不知道我是用來干嘛的,好像就是告訴我你設(shè)置了指紋驗證了,然后在app喚醒的時候要根據(jù)一個值來判斷是否需要調(diào)用指紋驗證服務(wù),我后來想了想,好像只要

[[[NSUserDefaults standardUserDefaults]objectForKey:@"TouchID"] isEqualToString:@"1"]

    這個就可以了,但是仔細(xì)想想還是再加上一個好分辨一點,畢竟就把一個當(dāng)做判斷switch是否打開,一個判斷喚醒的時候要不要調(diào)用的吧。在不同的回調(diào)函數(shù)里面需要寫的東西還是有差別的。這樣上面寫完之后,就等于實現(xiàn)一個簡單的基礎(chǔ)頁面,當(dāng)然這個還不是什么大問題,因為這個很簡單,下面就是要實現(xiàn)彈出view了。篇幅好像有點長了,我自己看的也有點煩了都。。。。。

第二部分

第一步

 創(chuàng)建自定義的view。在.h文件中寫入方法

@interface YLSTouchidView : UIView/** * 快速創(chuàng)建*/+(instancetype)touchIDView;/*** 彈出*/-(void)show;-(void)showInView:(UIView *)view;@end

第二步

    在.m文件中聲明控件,設(shè)置頁面大小,以及遵守協(xié)議,在頁面出來的同時就要調(diào)用驗證服務(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;/** 手機號 */@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:@"點擊進行指紋解鎖"]; [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];}

第四步

實現(xià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(@"點擊了指紋解鎖"); [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里面的一些小問題。偷個懶。

第五步

    這里也是跟第一部分一樣,實現(xiàn)驗證的回調(diào)函數(shù)。這邊的回調(diào)函數(shù)呢,跟之前的差不多,但是里面的內(nèi)容就不一樣了。而且我這里把不支持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的過程中被系統(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)用進入前臺)*/- (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è)備不支持指紋識別*/-(void)WJTouchIDIsNotSupport { [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];}

第三部分

    這里呢,是最重要的地方,也是最簡單的地方,只要在appdelegate.m文件中加上幾句話就可以實現(xiàn)了。
在下面這個方法里面寫,下面這個方法是呢app被喚醒進入活躍狀態(tài)的方法

- (void)applicationDidBecomeActive:(UIApplication *)application

    這邊的知識點其實還挺多的,就是一個生命周期的問題,一個app運行完成,即將進入活躍狀態(tài),已經(jīng)進入活躍狀態(tài),即將進入后臺,已經(jīng)進入后臺狀態(tài),這幾種狀態(tài),在之前我還想著聲明一個變量讓app在后臺運行的時候,也跟著運行,類似于一個計時器,但是我看了網(wǎng)上的一些想要讓app后臺掛起的時候還能運行一些東西,設(shè)置過程就好幾種,而且很多都說上架的時候?qū)徍耸遣唤o過得,想著有時間的話可以好好研究下那些方法,這里我就沒有弄,所以才有了上面的

[[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];

    這個值,本來也是設(shè)置成計時器的,但是這樣好像更方便點,就這么設(shè)置了,因為為了全局都可以取到這個值。
    在喚醒方法中寫下代碼

- (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"]; });}

下面那個呢就是為了防止重復(fù)調(diào)用,因為好像當(dāng)頁面出現(xiàn)指紋驗證的彈出框的時候,app似乎就是被掛起到后臺了,然后喚醒的時候又要被調(diào)用,所以這里出現(xiàn)了一個重復(fù)調(diào)用的問題,然后我就找個不是辦法的辦法來解決這個問題。就是用上面這段代碼來處理,具體道理我也不知道咋說,就這么迷迷糊糊的實現(xiàn)了功能。這樣子就是完成了一個指紋驗證以及app喚醒的時候指紋解鎖的一個小demo。present出來一個單獨的頁面的方式其實跟這個差不多,但是這篇文章的篇幅好像有點太長了,估計也沒什么人看到最后,所以我就不寫了,啥時候想補的話再補上來吧。

#### 還有就是,本人作為新手,上面代碼有啥問題的話,或者有啥可以優(yōu)化的地方,希望大家可以指正,大家一起共同進步共同學(xué)習(xí)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 济源市| 海丰县| 天津市| 永丰县| 馆陶县| 寿阳县| 安图县| 五家渠市| 汾阳市| 迭部县| 和平县| 高碑店市| 丹棱县| 盘锦市| 揭东县| 锦屏县| 上饶市| 新郑市| 岳阳县| 兴国县| 枝江市| 旬阳县| 西昌市| 麟游县| 名山县| 三亚市| 巨野县| 会宁县| 灵寿县| 元江| 平果县| 扶余县| 潼南县| 本溪市| 宜都市| 南汇区| SHOW| 榕江县| 星子县| 门源| 三门峡市|