欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS实现启动引导页与指纹解锁的方法详解

程序员文章站 2023-12-18 23:48:16
前言 应用程序启动时有些会有引导页,目的是用户第一次登录时对应用程序的一些简单了解介绍,一般就是几张轮播图片,当引用程序第一次进入时会跳到引导页,以后不再显示,这时就需要...

前言

应用程序启动时有些会有引导页,目的是用户第一次登录时对应用程序的一些简单了解介绍,一般就是几张轮播图片,当引用程序第一次进入时会跳到引导页,以后不再显示,这时就需要将不是第一次登录的标致flag保存到内存中,推荐用户偏好设置nsuserdefaults,第一直接去取值取这个flag取不到(因为是第一次登录)就跳引导页,然后在引导页进入登录页或者首页时将flag值保存到偏好设置中,以后再进来就可以取到不是第一登录的flag就直接跳过引导页.方式有两种:一种是直接切换uiwindow的根控制器本文是第一种,另一种是模态弹出,根据具体需求决定!

效果图:

iOS实现启动引导页与指纹解锁的方法详解

引导页及指纹识别效果图1

iOS实现启动引导页与指纹解锁的方法详解

引导页及指纹识别效果图2

以下直接上代码:

appdelegate文件中

#import "appdelegate.h"
#import "guidepagesviewcontroller.h"
#import "loginviewcontroller.h"
@interface appdelegate ()
@end
@implementation appdelegate
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
 self.window = [[uiwindow alloc]initwithframe:[uiscreen mainscreen].bounds];
 self.window.backgroundcolor = [uicolor whitecolor];
 nsuserdefaults * userdefault = [nsuserdefaults standarduserdefaults];
 if (![userdefault boolforkey:@"isnotfirst"]) {//如果用户是第一次登录
  self.window.rootviewcontroller = [[guidepagesviewcontroller alloc]init];
 }else{//否则直接进入登录页面
  self.window.rootviewcontroller = [[loginviewcontroller alloc]init];
 }
 [self.window makekeyandvisible];
 return yes;
}

引导页控制器:guidepagesviewcontroller

//
// guidepagesviewcontroller.m
// 登录引导页开发
//
// created by hj on 2018/1/31.
// copyright © 2018年 hj. all rights reserved.
//

#import "guidepagesviewcontroller.h"
#import "loginviewcontroller.h"
#define screenwidth [uiscreen mainscreen].bounds.size.width
#define screenheight [uiscreen mainscreen].bounds.size.height
@interface guidepagesviewcontroller ()<uiscrollviewdelegate>
@property(nonatomic ,strong) uiscrollview * mainscrollv;
@property(nonatomic ,strong) uipagecontrol * pagecontrol;
@property(nonatomic ,strong) nsmutablearray * images;
@end

@implementation guidepagesviewcontroller
- (void)viewdidload {
 [super viewdidload];
 [self.view addsubview:self.mainscrollv];
 [self.view addsubview:self.pagecontrol];
 
}
-(uiscrollview *)mainscrollv{
 if (!_mainscrollv) {
  _mainscrollv = [[uiscrollview alloc]initwithframe:self.view.bounds];
  _mainscrollv.bounces = no;
  _mainscrollv.pagingenabled = yes;
  _mainscrollv.showshorizontalscrollindicator = no;
  _mainscrollv.delegate = self;
  _mainscrollv.contentsize = cgsizemake(self.images.count * screenwidth, screenheight);
  [self addsubimageviews];
 }
 return _mainscrollv;
}

-(nsmutablearray *)images{
 if (!_images) {
  _images = [nsmutablearray array];
  nsarray * imagenames = @[@"u1",@"u2",@"u3",@"u4"];
  for (nsstring * name in imagenames) {
   [self.images addobject:[uiimage imagenamed:name]];
  }
 }
 return _images;
}
- (void)addsubimageviews{
 for (int i = 0; i < self.images.count; i++) {
  uiimageview * imagev = [[uiimageview alloc]initwithframe:cgrectmake(i * screenwidth, 0, screenwidth, screenheight)];
  imagev.image = self.images[i];
  [_mainscrollv addsubview:imagev];
  if (i == self.images.count - 1){//最后一张图片时添加点击进入按钮
   imagev.userinteractionenabled = yes;
   uibutton * btn = [uibutton buttonwithtype:uibuttontypecustom];
   btn.frame = cgrectmake(screenwidth * 0.5 - 80, screenheight * 0.7, 160, 40);
   [btn settitle:@"点击一下,你就知道" forstate:uicontrolstatenormal];
   [btn settitlecolor:[uicolor whitecolor] forstate:uicontrolstatenormal];
   btn.backgroundcolor = [uicolor redcolor];
   btn.layer.cornerradius = 20;
   btn.layer.borderwidth = 1;
   btn.layer.bordercolor = [uicolor redcolor].cgcolor;
   [btn addtarget:self action:@selector(btnclick) forcontrolevents:uicontroleventtouchupinside];
   [imagev addsubview:btn];
  }
 }
}
//点击按钮保存第一次登录的标记到本地并且跳入登录界面
- (void)btnclick{
 //保存标记到本地
 nsuserdefaults * userdef = [nsuserdefaults standarduserdefaults];
 [userdef setbool:yes forkey:@"isnotfirst"];
 [userdef synchronize];
 //切换视图控制器
 [uiapplication sharedapplication].keywindow.rootviewcontroller = [[loginviewcontroller alloc]init];
}

-(uipagecontrol *)pagecontrol{
 if (!_pagecontrol) {
  _pagecontrol = [[uipagecontrol alloc]initwithframe:cgrectmake(screenwidth/self.images.count, screenheight * 15/16.0, screenwidth/2, screenheight/16.0)];
  //设置总页数
  _pagecontrol.numberofpages = self.images.count;
  //设置分页指示器颜色
  _pagecontrol.pageindicatortintcolor = [uicolor bluecolor];
  //设置当前指示器颜色
  _pagecontrol.currentpageindicatortintcolor = [uicolor redcolor];
  _pagecontrol.enabled = no;
 }
 return _pagecontrol;
}

#pragma mark uiscrollviewdelegate
-(void)scrollviewdidscroll:(uiscrollview *)scrollview{
 self.pagecontrol.currentpage = (nsinteger)self.mainscrollv.contentoffset.x/screenwidth;
}
@end

指纹解锁很简单,导入头文件#import "localauthentication/localauthentication.h",验证手机系统是否支持指纹解锁 ios 8以后才行,验证本手机是否开启了指纹识别,是否录入了指纹等

指纹登录验证:loginviewcontroller

//
// loginviewcontroller.m
// 指纹验证
//
// created by hj on 2018/1/31.
// copyright © 2018年 hj. all rights reserved.
//
#import "loginviewcontroller.h"
#import "localauthentication/localauthentication.h"
@interface loginviewcontroller ()
@end
@implementation loginviewcontroller
- (void)viewdidload {
 [super viewdidload];
 if ([uidevice currentdevice].systemversion.floatvalue < 8.0) {//8.0以后才支持指纹
  return;
 } 
 uibutton * btn = [uibutton buttonwithtype:uibuttontypecustom];
 btn.frame = cgrectmake(0, 0, 160, 50);
 btn.center = self.view.center;
 [btn settitle:@"点击一下,指纹登录" forstate:0];
 [btn settitlecolor:[uicolor redcolor] forstate:0];
 btn.backgroundcolor = [uicolor yellowcolor];
 btn.layer.bordercolor = [uicolor orangecolor].cgcolor;
 btn.layer.borderwidth = 2;
 btn.layer.cornerradius = 20;
 [btn addtarget:self action:@selector(btnclick) forcontrolevents:uicontroleventtouchupinside];
 [self.view addsubview:btn];
}
- (void)btnclick{
 [self fingerprintverification];
}
- (void)fingerprintverification
{
 //创建lacontext
 lacontext* context = [[lacontext alloc] init];
 nserror* error = nil;
 if ([context canevaluatepolicy:lapolicydeviceownerauthenticationwithbiometrics error:&error]) {
  //支持指纹验证
  [context evaluatepolicy:lapolicydeviceownerauthenticationwithbiometrics localizedreason:@"请验证已有指纹" reply:^(bool success, nserror *error) {
   if (success) {
    //验证成功,主线程处理ui
    nslog(@"成功啦");
    
    //用户选择输入密码,切换主线程处理
    dispatch_async(dispatch_get_main_queue(), ^{
     [self showmessage:@"指纹登录成功!"];
    });
   }
   else
   {
    nslog(@"%@",error.localizeddescription);
    switch (error.code) {
     case laerrorsystemcancel:
     {
       [self showmessage:@"系统取消授权,如其他app切入"];
      //系统取消授权,如其他app切入
      break;
     }
     case laerrorusercancel:
     {
      //用户取消验证touch id
      [self showmessage:@"用户取消验证touch id"];
      break;
     }
     case laerrorauthenticationfailed:
     {
      //授权失败
      [self showmessage:@"授权失败"];
      break;
     }
     case laerrorpasscodenotset:
     {
      //系统未设置密码
      [self showmessage:@"系统未设置密码"];
      break;
     }
     case laerrorbiometrynotavailable:
     {
      //设备touch id不可用,例如未打开
      [self showmessage:@"设备touch id不可用,例如未打开"];
      break;
     }
     case laerrorbiometrynotenrolled:
     {
      //设备touch id不可用,用户未录入
      [self showmessage:@"设备touch id不可用,用户未录入"];
      break;
     }
     case laerroruserfallback:
     {
      [[nsoperationqueue mainqueue] addoperationwithblock:^{
       //用户选择输入密码,切换主线程处理
       [self showmessage:@"用户选择输入密码,切换主线程处理"];
       
      }];
      break;
     }
     default:
     {
      [[nsoperationqueue mainqueue] addoperationwithblock:^{
       //其他情况,切换主线程处理
       [self showmessage:@"其他情况,切换主线程处理"];
      }];
      break;
     }
    }
   }
  }];
 }
 else
 {
  //不支持指纹识别,log出错误详情
  nslog(@"不支持指纹识别");
  switch (error.code) {
   case laerrorbiometrynotenrolled:
   {
    nslog(@"touchid is not enrolled");
    [self showmessage:@"touchid is not enrolled"];
    break;
   }
   case laerrorpasscodenotset:
   {
    nslog(@"a passcode has not been set");
    [self showmessage:@"a passcode has not been set"];
    break;
   }
   default:
   {
    nslog(@"touchid not available");
    [self showmessage:@"touchid not available"];
    break;
   }
  }
  
  nslog(@"error : %@",error.localizeddescription);
 }
}
-(void)showmessage:(nsstring *)msg{
 uialertview * alert = [[uialertview alloc]initwithtitle:@"提示" message:msg delegate:nil cancelbuttontitle:@"取消" otherbuttontitles:@"确定", nil];
 [alert show];
}
@end

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

上一篇:

下一篇: