欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年01月12日 15:43:47   作者:點(diǎn)柈  
這篇文章主要為大家詳細(xì)iOS指紋驗(yàn)證TouchID應(yīng)用學(xué)習(xí)教程的第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

上一篇文章簡(jiǎn)單的寫(xiě)了對(duì)于touchid的簡(jiǎn)單了解。因?yàn)樘珣辛?,就沒(méi)有寫(xiě)實(shí)例,現(xiàn)在就單獨(dú)寫(xiě)一篇應(yīng)用吧,這篇想做的就是一個(gè)模仿那個(gè)叫啥軟件來(lái)著,某某理財(cái)類(lèi)類(lèi)的軟件的一個(gè)指紋驗(yàn)證解鎖。我們做出來(lái)的頁(yè)面應(yīng)該如下圖,在app掛起到后臺(tái)的時(shí)候再點(diǎn)擊到前臺(tái)的時(shí)候回出現(xiàn)如下頁(yè)面:

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

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

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

    因?yàn)槲抑皼](méi)遇到個(gè)這種情況,所以我做的都是自己瞎搞搞出來(lái)的,也不知道平時(shí)大家做的時(shí)候是怎么做的,就搞出來(lái)這樣的,這里我打算用兩種方法來(lái)實(shí)現(xiàn),不過(guò)這個(gè)東西放進(jìn)app中貌似是需要適配的。還是有些許問(wèn)題的。可能要調(diào)下。

    在app被喚醒的時(shí)候,出現(xiàn)頁(yè)面我用了兩種方式,一種是present出來(lái)一個(gè)單獨(dú)的頁(yè)面,一種方式是自定義彈出view。

    但是本文呢,主要就介紹一下彈出式view的方式,因?yàn)閜resent的方式跟這種方式差別就是在于一個(gè)是view一個(gè)是Controller,主要的思想還是一樣的。

第一部分

第一步

    引入需要用的文件,以及創(chuàng)建pch文件,因?yàn)槭切emo,所以一些宏定義直接丟進(jìn)去就可以了。

第二步

    創(chuàng)建pch文件,引入一些需要用到的文件以及宏定義,這里要是有問(wèn)題的話可以參照我之前一篇文章寫(xiě)的引入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è)面,如下圖

聲明變量,遵守指紋驗(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];

}

    這里要說(shuō)一下

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

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

第四步

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

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

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

//TouchID驗(yàn)證成功
- (void) WJTouchIDAuthorizeSuccess {
 [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
 if (self.touchIDSwitch.on == YES)
 {
 [MBProgressHUD showText:@"成功開(kāi)啟指紋解鎖" 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:@"指紋解鎖開(kāi)啟失敗" 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的過(guò)程中被系統(tǒng)取消 例如突然來(lái)電話、按了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)(如突然來(lái)了電話,應(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)過(guò)程中,LAContext對(duì)象被釋)
- (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"];
 }
}

    以上呢,我是沒(méi)有判斷是否支持touchid來(lái)寫(xiě),是直接按照可以支持的來(lái)寫(xiě)的,大家在實(shí)際操作工程中還是需要加一下判斷條件,因?yàn)楝F(xiàn)在還是有不支持touchid的機(jī)型的。然后就是要說(shuō)一下下面這個(gè)。

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

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

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

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

第二部分

第一步

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

@interface YLSTouchidView : UIView

/**
 * 快速創(chuàng)建
*/
+(instancetype)touchIDView;

/**
* 彈出
*/
-(void)show;
-(void)showInView:(UIView *)view;

@end

第二步

    在.m文件中聲明控件,設(shè)置頁(yè)面大小,以及遵守協(xié)議,在頁(yè)面出來(lái)的同時(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è)小小的特效,就是顏色漸漸變成無(wú)色,這樣有時(shí)候可以遮蓋你app里面的一些小問(wèn)題。偷個(gè)懶。

第五步

    這里也是跟第一部分一樣,實(shí)現(xiàn)驗(yàn)證的回調(diào)函數(shù)。這邊的回調(diào)函數(shù)呢,跟之前的差不多,但是里面的內(nèi)容就不一樣了。而且我這里把不支持touchid的方法加進(jìn)來(lái),按理說(shuō)這邊是不需要加的,但是我前面沒(méi)加進(jìn)來(lái),這里就硬塞進(jìn)來(lái)吧。。。大家就湊合著看,自己用的時(shí)候可以直接刪掉,不刪掉也沒(méi)事,就是增加點(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的過(guò)程中被系統(tǒng)取消 例如突然來(lái)電話、按了Home鍵、鎖屏...
*/
- (void) WJTouchIDAuthorizeErrorSystemCancel {
 [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
}

/**
* 無(wú)法啟用TouchID,設(shè)備沒(méi)有設(shè)置密碼
*/
- (void) WJTouchIDAuthorizeErrorPasscodeNotSet {
 [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
}

/**
* 設(shè)備沒(méi)有錄入TouchID,無(wú)法啟用TouchID
*/
- (void) WJTouchIDAuthorizeErrorTouchIDNotEnrolled {
 [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
}

/**
* 該設(shè)備的TouchID無(wú)效
*/
- (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)(如突然來(lái)了電話,應(yīng)用進(jìn)入前臺(tái))
*/
- (void) WJTouchIDAuthorizeLAErrorAppCancel {
 [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
}

/**
* 當(dāng)前軟件被掛起取消了授權(quán) (授權(quán)過(guò)程中,LAContext對(duì)象被釋)
*/
- (void) WJTouchIDAuthorizeLAErrorInvalidContext {
 [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
}
/**
* 當(dāng)前設(shè)備不支持指紋識(shí)別
*/
-(void)WJTouchIDIsNotSupport {
 [[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"touchIDISon"];
}

第三部分

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

- (void)applicationDidBecomeActive:(UIApplication *)application

    這邊的知識(shí)點(diǎn)其實(shí)還挺多的,就是一個(gè)生命周期的問(wèn)題,一個(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)行,類(lèi)似于一個(gè)計(jì)時(shí)器,但是我看了網(wǎng)上的一些想要讓app后臺(tái)掛起的時(shí)候還能運(yùn)行一些東西,設(shè)置過(guò)程就好幾種,而且很多都說(shuō)上架的時(shí)候?qū)徍耸遣唤o過(guò)得,想著有時(shí)間的話可以好好研究下那些方法,這里我就沒(méi)有弄,所以才有了上面的

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

    這個(gè)值,本來(lái)也是設(shè)置成計(jì)時(shí)器的,但是這樣好像更方便點(diǎn),就這么設(shè)置了,因?yàn)闉榱巳侄伎梢匀〉竭@個(gè)值。
    在喚醒方法中寫(xiě)下代碼

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


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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解 IOS下int long longlong的取值范圍

    詳解 IOS下int long longlong的取值范圍

    這篇文章主要介紹了詳解 IOS下int long longlong的取值范圍的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 推薦一個(gè)非常棒的Titanium MVC框架

    推薦一個(gè)非常棒的Titanium MVC框架

    ChariTi是一個(gè)非常不錯(cuò)的Titanium MVC框架。此框架的特點(diǎn)是很多東西可直接通過(guò)配置文件實(shí)現(xiàn),如APP的主題顏色,每個(gè)tab的內(nèi)容,是否使用滑動(dòng)菜單布局,是否支持tablet布局等,而且其對(duì)iOS 和 android也有很好的支持,同時(shí)也支持橫屏和豎屏的轉(zhuǎn)換然后使用不同的布局。
    2014-07-07
  • iOS中wkwebView內(nèi)存泄漏與循環(huán)引用問(wèn)題詳解

    iOS中wkwebView內(nèi)存泄漏與循環(huán)引用問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于iOS中wkwebView內(nèi)存泄漏與循環(huán)引用問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • IOS開(kāi)發(fā)Swift?與?OC相互調(diào)用詳解

    IOS開(kāi)發(fā)Swift?與?OC相互調(diào)用詳解

    這篇文章主要為大家介紹了IOS開(kāi)發(fā)Swift?與?OC相互調(diào)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • iOS模仿微信長(zhǎng)按識(shí)別二維碼的多種方式

    iOS模仿微信長(zhǎng)按識(shí)別二維碼的多種方式

    這篇文章主要介紹了iOS模仿微信長(zhǎng)按識(shí)別二維碼的兩種方式,文章第二種方式是識(shí)別網(wǎng)頁(yè)中的二維碼,具體思路詳解大家參考下本文
    2017-07-07
  • iOS 如何高效的使用多線程

    iOS 如何高效的使用多線程

    這篇文章主要介紹了iOS 如何高效使用的多線程,幫助大家提高ios 開(kāi)發(fā)的效率,感興趣的朋友可以了解下
    2020-09-09
  • IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法

    IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法

    這篇文章主要介紹了IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法的相關(guān)資料,這里主要介紹了IOS 10如何通過(guò)設(shè)置來(lái)實(shí)現(xiàn)禁止縮放及實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • Flutter CustomPaint繪制widget使用示例

    Flutter CustomPaint繪制widget使用示例

    這篇文章主要為大家介紹了Flutter CustomPaint繪制widget使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • IOS身份證識(shí)別(OCR源碼)詳解及實(shí)例代碼

    IOS身份證識(shí)別(OCR源碼)詳解及實(shí)例代碼

    這篇文章主要介紹了IOS身份證識(shí)別(OCR源碼)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • IOS中的webView加載HTML

    IOS中的webView加載HTML

    在日常開(kāi)發(fā)中,我們?yōu)榱诵蕰?huì)用到很多很多的WebView,比如在做某個(gè)明細(xì)頁(yè)面的時(shí)候我們返回給你的可能是一個(gè)html字符串,我們就需要將當(dāng)前字符串展示到webView上面,所以我們對(duì)HTML標(biāo)簽需要有一定的認(rèn)識(shí),下面我們來(lái)一起用html標(biāo)簽和JS寫(xiě)一個(gè)打地鼠游戲
    2016-02-02

最新評(píng)論