iOS學(xué)習(xí)筆記15 指紋驗(yàn)證TouchID簡單應(yīng)用2

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

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)去就可以了埋市。


指紋驗(yà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ǔ)頁面污茵,如下圖


基礎(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對(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"];
    }
}

????以上呢,我是沒有判斷是否支持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對(duì)象被釋)
 */
- (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"];
    });
}

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

還有就是草讶,本人作為新手,上面代碼有啥問題的話炉菲,或者有啥可以優(yōu)化的地方堕战,希望大家可以指正,可以了留言跟我討論颁督,或者是私信啥的践啄,都可以,大家一起共同進(jìn)步共同學(xué)習(xí)沉御。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昭灵,隨后出現(xiàn)的幾起案子吠裆,更是在濱河造成了極大的恐慌伐谈,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试疙,死亡現(xiàn)場離奇詭異诵棵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祝旷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門履澳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀跛,你說我怎么就攤上這事距贷。” “怎么了禾怠?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵喜德,是天一觀的道長膛堤。 經(jīng)常有香客問我,道長阁最,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任骇两,我火速辦了婚禮速种,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘低千。我一直安慰自己哟旗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布栋操。 她就那樣靜靜地躺著闸餐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矾芙。 梳的紋絲不亂的頭發(fā)上舍沙,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音剔宪,去河邊找鬼拂铡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛葱绒,可吹牛的內(nèi)容都是我干的感帅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼地淀,長吁一口氣:“原來是場噩夢啊……” “哼失球!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤实苞,失蹤者是張志新(化名)和其女友劉穎豺撑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黔牵,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聪轿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猾浦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陆错。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖金赦,靈堂內(nèi)的尸體忽然破棺而出音瓷,到底是詐尸還是另有隱情,我是刑警寧澤素邪,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布外莲,位于F島的核電站,受9級(jí)特大地震影響兔朦,放射性物質(zhì)發(fā)生泄漏偷线。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一沽甥、第九天 我趴在偏房一處隱蔽的房頂上張望声邦。 院中可真熱鬧,春花似錦摆舟、人聲如沸亥曹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媳瞪。三九已至,卻和暖如春照宝,著一層夾襖步出監(jiān)牢的瞬間蛇受,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來泰國打工厕鹃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兢仰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓剂碴,卻偏偏與公主長得像把将,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忆矛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 指紋驗(yàn)證這個(gè)功能現(xiàn)在在一些app中經(jīng)常常見察蹲,常常與數(shù)字解鎖,手勢解鎖聯(lián)合起來使用。前幾天接到說實(shí)現(xiàn)一個(gè)指紋驗(yàn)證的功...
    點(diǎn)柈閱讀 1,543評(píng)論 9 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,825評(píng)論 25 707
  • 這是一些學(xué)習(xí)資源,里面有Android的,iOS的,PHP的,大數(shù)據(jù)的,Java的,web前端的,C++,Pyth...
    青青青青閱讀 3,324評(píng)論 2 24
  • “小時(shí)候要不到的糖递览,長大了也就不想要了叼屠⊥纾”這是我從我小表妹身上感悟到的绞铃。放假的時(shí)候我?guī)П砻萌ス涑校瑔査允裁醋?..
    學(xué)習(xí)者_(dá)閱讀 200評(píng)論 0 2
  • a標(biāo)簽的狀態(tài) :link 默認(rèn)狀態(tài), 從未被訪問過,存在兼容問題, 使用:-webkit-any-link解決 :...
    LiYajie閱讀 650評(píng)論 0 0