服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS实现启动引导页与指纹解锁的方法详解

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

2021-04-20 19:54Lovely_Juanjuan IOS

这篇文章主要给大家介绍了关于iOS实现启动引导页与指纹解锁的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

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

效果图:

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

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

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

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

以下直接上代码:

appdelegate文件中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//
// 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//
// 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

总结

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

原文链接:https://www.jianshu.com/p/b28fc638c92f

延伸 · 阅读

精彩推荐
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04