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

2020-01-09 00:10:31王冬梅

前言

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

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

swift,指纹识别,人脸识别,应用

原理图

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

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

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

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

一、基础配置工作

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

导入LocalAuthentication Framework

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


import LocalAuthentication

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

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

swift,指纹识别,人脸识别,应用

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

swift,指纹识别,人脸识别,应用

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

利用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()
   })
  }

 }