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

前言

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

效果图:

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

引导页及指纹识别效果图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

总结

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

(0)

相关推荐

  • iOS App引导页开发教程

    引导页功能简介 方式一: 判断程序是否首次启动,如果是将GuidePageViewController作为窗口的根视图控制器.GuidePageViewController有三个子控件:一个UIScrollView.一个UIPageControl.一个UIButton(默认隐藏),UIScrollView有多个UIImageView子控件,当滚动到最后一页UIButton展示,点击立即体验然后将窗口的根视图控制器设置为UITabBarController: 方式二: 也可以直接将根视图控制器设置

  • iOS 指纹解锁验证TouchID功能

    1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthentication.h> 2.然后,判断系统是否为iOS8及以上 //iOS8.0后才支持指纹识别接口 if ([UIDevice currentDevice].systemVersion.floatValue < 8.0) { return; } 3.最后,在APP启动时调用以下方法即可完成指纹解锁的全部功能集成 - (voi

  • 简单实现iOS指纹解锁(TouchID)

    本文实例为大家分享了iOS指纹解锁的具体代码,供大家参考,具体内容如下 1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthentication.h> 2.然后,判断系统是否为iOS8及以上 //iOS8.0后才支持指纹识别接口 if ([UIDevice currentDevice].systemVersion.floatValue < 8.0) { return; } 3.最后

  • 简洁易用的iOS引导页制作

    基本上每个app都有引导页,虽然现在这种demo已经比比皆是,但感觉都不全,所以自己整理了一个,只需要传入图片,就可以正常加载出来.由于UIPageControl的小圆点大小和颜色经常与UI设计的不相符,所以后面也会提到重写类方法,进行修改. 先看下效果(图片是在网上随便找的) Untitled.gif 把指导页图片传入guideImages中 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptio

  • 浅析IOS开发TouchID指纹解锁功能

    效果图如下 实现过程 1.首先引入指纹解锁必须的头文件 #import <LocalAuthentication/LocalAuthentication.h> 2.了解下主要的两个方法 这个方法是判断设备是否支持TouchID的. - (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none))); 这个是用来验证TouchI

  • iOS App初次启动时的用户引导页制作实例分享

    应用程序APP一般都有引导页,引导页可以作为操作指南指导用户熟悉使用:也可以展现给用户,让用户了解APP的功能作用.引导页制作简单,一般只需要一组图片,再把图片组展现出来就可以了.展示图片组常用UIScrollView来分页显示,并且由UIPageControl页面控制器控制显示当前页.UIScrollView和UIPageControl搭配会更加完美地展现引导页的功能作用.下面我们来看具体的实例: 我们用NSUserDefaults类来判断程序是不是第一次启动或是否更新,在 AppDelega

  • iOS 引导页的镂空效果实例

    初衷 最近项目新功能更改较大,产品童鞋要求加入新功能引导,于是一口气花了两天的时间做了一个引导页,当然加上后面的修修补补的时间,就不只两天了,不过这事情其实是一劳永逸的事情,值得做.同时为了能够更好的复用,我把它做成了pod库,项目地址在这里:EAFeatureGuideView. EAFeatureGuideView能做什么 EAFeatureGuideView是UIView的一个扩展,用来做新功能引导提示,达到这样的效果: 局部区域高亮(可以设置圆角) 有箭头指向高亮区域 可以设置一段介绍文

  • 使用Swift代码实现iOS手势解锁、指纹解锁实例详解

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法). 1.3.当手指在屏幕上滑动时,调用重写的touchesEnded:withEvent方法. 这两个方法执行的操作是一样的:通过locationInView获取 触摸的坐标,然后用 CGRectContainsPoint 判断手指是否经过UIB

  • iOS基于UIScrollView实现滑动引导页

    上代码前,我们先来看下实现的效果图: WelcomeViewController.h #import <UIKit/UIKit.h> @interface WelcomeViewController : UIViewController @end WelcomeViewController.m #import "WelcomeViewController.h" #define IMAGECOUNT 3 @interface WelcomeViewController ()

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

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

  • iOS Webview自适应实际内容高度的4种方法详解

    //第一种方法 - (void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat webViewHeight=[webView.scrollView contentSize].height; CGRect newFrame = webView.frame; newFrame.size.height = webViewHeight; webView.frame = newFrame; _webTablewView.contentSize = C

  • Android开发实现的ViewPager引导页功能(动态加载指示器)详解

    本文实例讲述了Android开发实现的ViewPager引导页功能(动态加载指示器).分享给大家供大家参考,具体如下: 先看效果图咯~ 现在几乎每个App都会有引导页,是不是感觉很炫很厉害,所以就想做出来一个学习一下~让自己的App看起来更加的美观~ 现在来分析一下: 这个引导页可以分为俩部分~ 1.小红点--来提醒这是第几页了~ 2."开始体验"这个Button--可以进入主界面,但是要控制这个Button只能在最后一页出现 布局的话使用相对布局~ 那现在来看看布局吧: activi

  • IOS获取当前版本号 Bundle ID等信息的方法详解

     IOS获取当前版本号 Bundle ID等信息的方法 1:获取bundle Id信息:[[NSBundle mainBundle]bundleIdentifier]: 2:获取版本号:[[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 3:获取build号:[[[NSBundle mainBundle]infoDictionary] objectForKey:@&quo

  • oracle修改scott密码与解锁的方法详解

    scott用户的密码不对,进入管理员用户,修改scott用户密码即可 或者这样修改密码:在运行栏里面敲:sqlplus(空格)/nolog 回车接着在弹出框里面敲:conn sys/password as sysdba回车提示已连接最后敲:alter user scott identified by tiger;回车alter user scott account unlock;回车(对SCOTT解锁)http://an:1158/em/console/logon/logon;jsessioni

  • iOS中设置网络超时时间+模拟的方法详解

    设置方法如下: 在封装的网络请求类里面如下设置 AFWEBAPI_REQUEST_TIMEOUT 这个参数为超时时间 #define AFWEBAPI_REQUEST_TIMEOUT 20 #pragma mark - 单例 & 构造函数 + (instancetype)sharedTools { static WXNetworkTools *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ i

  • Spring Boot 在启动时进行配置文件加解密的方法详解

    寻找到application.yml的读取的操作. 从spring.factories 中查看到 # Application Listeners org.springframework.context.ApplicationListener=\ org.springframework.boot.context.config.ConfigFileApplicationListener,\ ConfigFileApplicationListener 该对象对application.yml进行读取操作

  • Android使用ViewPager实现启动引导页效果

    本文实例为大家分享了Android实现启动引导页效果的具体代码,供大家参考,具体内容如下 ViewPagerTwoActivity.java package cn.edu.zufe.app001; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widget.PagerAdapter; import androidx.vie

  • iOS开发retina屏幕下的点与像素关系详解

    目录 引言 I iOS中点与像素有什么关系? II 图片使用的相关注意事项 2.1 推荐使用png格式 2.2 关于图像的实例化 2.3 动画结束之后清除帧动画数组 III 设置状态栏字体颜色 3.1 方式一 3.2 方式二 see also 引言 提交app store的时候 需要一张1024*1024的 如果不设置这两种的尺寸启动页的话,在4英寸.3.5英寸的设备上展示不了启动页,app 的高度也默认都是矮的960px.** 注意@3x 提供给开发的px 为12422208 ,但真实的px

  • iOS NSURLProtocol的具体使用方法详解

    本文介绍了iOS NSURLProtocol的具体使用方法详解,分享给大家,具体如下: NSURLProtocol定义 这两天在优化项目,无意间看到了NSURLProtocol,学习一下顺便总结下来. NSURLProtocol也是苹果众多黑魔法中的一种,能够让你去重新定义苹果的URL加载系统 (URL Loading System)的行为,URL Loading System里有许多类用于处理URL请求,比如NSURL,NSURLRequest,NSURLConnection和NSURLSes

随机推荐