Swift利用指纹识别或面部识别为应用添加私密保护功能

前言

从最初做应用开始,我就密切关注用户的反馈和评论。有时他们的要求确实并不合理,但当大多数人提到一项功能时,就该我们做产品的人反思了。 私密保护功能是用户在评论中提到的,恰好像OneDay这样比较私密的内容确实可以增加这项功能。

指纹识别和面部识别虽然是两个很不相同的交互,但从开发的角度他们却只需要一套代码就可以搞定。在做之前我先解释下整个实现过程的重要环节:

原理图

1.我们需要一个数据来保存开关数据,在设置中心,用户根据喜好选择是否开启保护

2.一旦用户打开应用,通过判断是否保护来加载遮挡页面

3.在遮挡页面自动实现解锁过程,同时用户也可以点击后解锁

4.根据机型的不同,在设置中心需要显示不同的解锁名称

一、基础配置工作

实现指纹识别与面部识别,都是通过添加LocalAuthentication Framework来实现的。

导入LocalAuthentication Framework

之后在需要用到认证的页面,导入LocalAuthentication即可:

import LocalAuthentication

二、遮盖页创建与设置中心开关创建

在设置中心增加一栏开关,暂且叫做Touch ID,最后会进行标题文字的修复。 创建一个单独的遮盖页,只需要放置一句话及按钮即可,按钮将调用认证过程,文件为LockViewContrller.swift。

为了方便调用,给遮盖页设置了StoryBoard ID为LockController。

四、设置中心实现数据的修改

利用CoreData将开关的数据存储在ifProtect中,0表示开,1表示关。 设置数据的过程不会像其他数据那样直接改变,必须判断是否为用户本人进行开关。所以在SettingViewController.swift中,需要添加认证的相关函数。

1.先导入LocalAuthentication:

import LocalAuthentication

2.操作函数:

func touchID(){
  let context = LAContext()
  var error: NSError?
  if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
   // 开始进入识别状态,以闭包形式返回结果。闭包的 success 是布尔值,代表识别成功与否。error 为错误信息。
   context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "请用指纹解锁", reply: {success, error in
    if success {
     // 成功之后的逻辑, 通常使用多线程来实现跳转逻辑。
     print("解锁成功 success,允许设置")

     if self.appDelegate.mysetting.ifProtect == Int64(1){
      self.appDelegate.mysetting.ifProtect = Int64(0)
     }else{
      self.appDelegate.mysetting.ifProtect = Int64(1)
     }

     self.appDelegate.saveContext()
    }else {

     if let error = error as? NSError {
      // 获取错误信息
      let message = self.errorMessageForLAErrorCode(errorCode: error.code)
      print(message)
     }
     //失败之后
     print("失败了")
    }

    self.SettingTableView.reloadData()
   })
  }

 }

当是用户本人且认证成功时,开关数据被改变;当不是用户本人或认证不成功,开关数据不会改变。 为了保持页面与数据统一,函数执行后我们需要刷新页面self.SettingTableView.reloadData()

3.获取错误情况:

func errorMessageForLAErrorCode(errorCode: Int) -> String {
  var message = ""

  switch errorCode {
  case LAError.appCancel.rawValue:
   message = "Authentication was cancelled by application"

  case LAError.authenticationFailed.rawValue:
   message = "The user failed to provide valid credentials"

  case LAError.invalidContext.rawValue:
   message = "The context is invalid"

  case LAError.passcodeNotSet.rawValue:
   message = "Passcode is not set on the device"

  case LAError.systemCancel.rawValue:
   message = "Authentication was cancelled by the system"

  case LAError.touchIDLockout.rawValue:
   message = "Too many failed attempts."

  case LAError.touchIDNotAvailable.rawValue:
   message = "TouchID is not available on the device"
   //   showPassWordInput()

  case LAError.userCancel.rawValue:
   message = "The user did cancel"

  case LAError.userFallback.rawValue:
   message = "The user chose to use the fallback"

  default:
   message = "Did not find error code on LAError object"
  }
  return message
 }

五、首页加载遮盖页

来到首页HomeViewController,在viewDidLoad中加入下面代码,来判断每一次打开应用是否需要认证解锁。 如果不需要,首页可以正常显示; 如果需要,将直接跳转到LockController。

if self.appDelegate.mysetting.ifProtect == Int64(1){
 print(self.appDelegate.mysetting.ifProtect)
 print("需要解锁")
  if let lockVC = storyboard?.instantiateViewController(withIdentifier: "LockController") as? LockViewController {
   self.present(lockVC,animated: false,completion: nil)
  }else{

  }
 }else{
 print("不需要解锁")
}

六、在遮盖页中实现认证

遮盖页LockController的背景通过虚化处理,可以到达遮盖的目的。同时拥有认证函数,当认证成功后页面自动消失返回首页。 因为需要认证过程,因此也需要三个核心步骤。

1.导入LocalAuthentication:

import LocalAuthentication

2.操作函数:

func touchID(){
 let context = LAContext()
 var error: NSError?
 if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
  // 开始进入识别状态,以闭包形式返回结果。闭包的 success 是布尔值,代表识别成功与否。error 为错误信息。
  context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "请用指纹解锁", reply: {success, error in

   if success {
    // 成功之后的逻辑, 通常使用多线程来实现跳转逻辑。
    print("解锁成功 success")

    self.dismiss(animated: true, completion: nil)
   }else {

    if let error = error as? NSError {
     // 获取错误信息
     let message = self.errorMessageForLAErrorCode(errorCode: error.code)
     print(message)
    }
    //失败之后
    print("失败了")
   }
  })
 }
}

认证过程成功后,页面会自动消失:self.dismiss(animated: true, completion: nil)

3.当用户进入页面时自动调取认证过程:

override func viewWillAppear(_ animated: Bool) {
  touchID()
}

4.或者通过手动点击开始认证:

@IBAction func AuthenAction(_ sender: Any) {
  touchID()
}

5.捕获错误跟设置页面一样。

七、根据屏幕尺寸修改开关标题

最后,我们来修复设置中心按钮的标题文字。当判断手机为iPhone X时,文字显示为“面部识别”或“Touch ID”;当不是iPhone X时,显示为“指纹识别”或“Touch ID”。这里我们用到了UIDevice来获取了屏幕的高度:

if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {
 cell.SwitchTitle.text = "Face ID"
 cell.SwitchImage.image = UIImage(named: "btn_setting_faceid")?.withRenderingMode(.alwaysTemplate)
}else{
 cell.SwitchTitle.text = "Touch ID"
 cell.SwitchImage.image = UIImage(named: "btn_setting_touchid")?.withRenderingMode(.alwaysTemplate)
}

以上的过程便可实现私密保护,不过不会像系统解锁那样可以通过密码解锁。要实现密码解锁,还需要单独开发该功能。

总结

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

(0)

相关推荐

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

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

  • iOS中Swift指触即开集成Touch ID指纹识别功能的方法

    1.前言 随着移动支付时代的到来,Touch ID 指纹验证迅速被支付宝,微信钱包普及,相信各位朋友使用后也大呼方便.今天写一篇关于指纹解锁的文章. 关于3D Touch 感兴趣的朋友可以看我前篇blog *    iOS- 指压即达,如何集成iOS9里的3D Touch http://www.jb51.net/article/108922.htm 2.指纹验证Touch ID的介绍 相比3D Touch来说,指纹验证Touch ID 的使用比较简单 主要分成两步 1.第一步当然是检测你的手机是

  • iOS开发中Swift 指纹验证功能模块实例代码

    iOS调用TouchID代码: override func viewDidLoad() { super.viewDidLoad() let context = LAContext() var error: NSError? = nil let canEvaluatePolicy = context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) as Bool if error

  • swift3.0指纹解锁的实现方法

    最近学习swift3.0, 不忙的时候开始用 Swift 重写现有的项目,有些地方的写法变得让人不知道怎么写了,今天就分享一下我在重写 指纹解锁工具类的时候遇到的一些问题吧. 先展示一下成果 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() TouchIdManager.touchIdWithHand(fallBackTitle: "", succeed:

  • Swift利用指纹识别或面部识别为应用添加私密保护功能

    前言 从最初做应用开始,我就密切关注用户的反馈和评论.有时他们的要求确实并不合理,但当大多数人提到一项功能时,就该我们做产品的人反思了. 私密保护功能是用户在评论中提到的,恰好像OneDay这样比较私密的内容确实可以增加这项功能. 指纹识别和面部识别虽然是两个很不相同的交互,但从开发的角度他们却只需要一套代码就可以搞定.在做之前我先解释下整个实现过程的重要环节: 原理图 1.我们需要一个数据来保存开关数据,在设置中心,用户根据喜好选择是否开启保护 2.一旦用户打开应用,通过判断是否保护来加载遮挡

  • Android指纹识别API讲解,一种更快更好的用户体验

    我发现了一个比较怪的现象.在iPhone上使用十分普遍的指纹认证功能,在Android手机上却鲜有APP使用,我简单观察了一下,发现Android手机上基本上只有支付宝.微信和极少APP支持指纹认证功能,就连银行和金融类的应用都基本不支持,甚至很多开发者都不知道Android系统是有指纹认证的官方API的. 事实上,Android从6.0系统开始就支持指纹认证功能了,但是指纹功能还需要有硬件支持才行,而Android手机的硬件都是由各厂商生产的,手机档次也参差不齐,因此不能像iPhone那样保证

  • Android指纹识别功能

    指纹识别作为最新兴起的用户身份验证机制,已经被越来越多的应用程序所采用,相比传统的密码九宫格等验证方法,指纹识别更加安全,如今越来越多的安卓手机配备了指纹识别模块,我们就来尝试一下这一项新兴的技术 首先创建一个安卓项目,指纹识别作为最近几年才兴起的技术,对安卓api level要求较高(api 23以上即jdk6.0以上) 创建一个button用于触发指纹识别,并在MainActivity里对其监听,代码如下 Button button=(Button)findViewById(R.id.che

  • Android 6.0指纹识别App开发案例

    在android 6.0中google终于给android系统加上了指纹识别的支持,这个功能在iPhone上早就已经实现了,并且在很多厂商的定制的ROM中也都自己内部实现这个功能了,这个功能来的有点晚啊.在google全新发布的nexus设备:nexus 5x和nexus 6p中都携带了一颗指纹识别芯片在设备的背面,如下图(图片来自网络): 笔者手中的设备就是图上的那台黑色的nexus 5x,话说这台机器很是好看呢!手感超棒! 废话不多说,下面我出一个指纹识别的demo app,并且详细说明怎么

  • iOS开发中指纹识别简单介绍

    ios开发中指纹识别简单介绍,在iphone系列中,是从5S以后开始有了指纹识别的功能,在ios8的时候开放的指纹验证的接口. 所以我们在进行指纹识别应用的时候要去判断机型以及系统的版本. 代码如下,下面需要特别注意的其实就是LAPolicyDeviceOwnerAuthentication和LAPolicyDeviceOwnerAuthenticationWithBiometrics的区别,以及检测系统的版本通过[UIDevice currentDevice].systemVersion.fl

  • matlab GUI指纹识别门禁系统介绍及源码实现

    目录 引言 一.指纹识别简介 1 指纹识别系统的构成 2 指纹识别系统的实现 2.1 指纹图像的采集 2.2 指纹图像的预处理 2.3 指纹图像特征提取 2.4 指纹图像匹配 二.部分源代码 三.运行结果 四.matlab版本及参考文献 引言 随着社会的发展,钥匙.证件.银行卡以及用户名密码等这些鉴定身份的标志性物品和标识的安全性越来越弱,很容易被伪造.被盗用.不小心丢失等,给人们带来了极大的困扰,如何才能更好的保护个人信息成为当今时代一个很重要问题.随着网络和计算机应用技术的发展,人们逐渐将目

  • 详解Swift 利用Opration和OprationQueue来下载网络图片

    详解Swift 利用Opration和OprationQueue来下载网络图片 1. 基于Opration封装的获取网络数据组件 import Foundation import UIKit public typealias OpreationClosure = ((_ data:Data? , _ error: Error?) -> Void) class LJOpreationManager: Operation { /** * 下载用的url */ public var imageUrl

  • iOS中指纹识别常见问题汇总

    最近公司的 app 要使用指纹支付了;总体来说还是蛮顺利的;但是中间有遇到一些坑;下面就对坑进行汇总; 一.基本知识 点开这个LocalAuthentication.framework,发现里面主要有这么几个东西 LocalAuthentication.framework - LAContext.h - LAError.h - LAPublicDefines.h - LocalAuthentication.h LocalAuthentication.h 这个没什么可讲的吧,代码就两行,一行导入L

  • IOS 指纹识别两种方式详解及实例

    IOS 指纹识别两种方式详解及实例 首先引入类名: #import <LocalAuthentication/LocalAuthentication.h> 然后在实现指纹识别的地方放入如下代码: 方式一: LAContext *lacontext = [[LAContext alloc]init]; // 判断设备是否支持指纹识别 BOOL isSupport = [lacontext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWit

随机推荐