SwiftUI: 使用 Touch ID 和 Face I

时间:2022-07-23
本文章向大家介绍SwiftUI: 使用 Touch ID 和 Face I,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

苹果绝大多数设备都以生物识别身份验证为标准,这意味着它们使用指纹和面部识别来解锁。我们也可以使用此功能,这意味着我们可以确保仅当有效用户解锁后才能读取敏感数据。

这是另一个Objective-C API,但与SwiftUI一起使用时有仅仅有一小点不愉快,这比到目前为止我们看过的其他框架要好。

在编写任何代码之前,您需要向Info.plist文件中添加一个新 key,向用户说明为什么要访问 Face ID。由于只有Apple知道的原因,我们在代码中传递了Touch ID请求原因,而在Info.plist中也要传递 Face ID 请求的原因。

立即打开Info.plist,右键单击空白,然后选择“Add Row”。滚动键列表,直到找到“Privacy - Face ID Usage Description”,并为其赋予值“我们需要解锁您的数据”。

现在回到ContentView.swift,并在文件顶部附近添加以下导入:

import LocalAuthentication

好的,我们已经准备好使用生物识别了。我之前提到过,这“一点点令人不快”,这就是原因:Swift开发人员使用 Error 协议表示运行时发生的错误,但是 Objective-C 使用一个称为NSError的特殊类。因为这是一个Objective-C API,所以我们需要使用NSError来处理问题,并像常规inout参数一样使用传递它。

我们将编写一个authenticate()方法,将所有生物特征功能隔离在一个地方。为此,需要四个步骤:

  1. 创建LAContext实例,这使我们可以查询生物识别状态并执行身份验证检查。
  2. 询问上下文是否能够执行生物特征认证——这很重要,因为iPod touch 既没有 Touch ID 也没有 Face ID。
  3. 如果可以进行生物识别,那么我们将启动实际的身份验证请求,并传递一个闭包以在身份验证完成时运行。
  4. 当用户通过身份验证或未通过身份验证时,我们的完成关闭将被调用并告诉我们它是否有效,如果不是,那么错误是什么。该闭包将从主线程中调用,因此我们需要将所有与UI相关的工作推回主线程。

请继续并将此方法添加到ContentView

func authenticate() {
    let context = LAContext()
    var error: NSError?

    // 检查生物特征认证是否可用
    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
        // 可用,所以继续使用它
        let reason = "我们需要解锁您的数据"

        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, authenticationError in
            // 身份验证现已完成
            DispatchQueue.main.async {
                if success {
                    // 认证成功
                } else {
                    // 发生的异常
                }
            }
        }
    } else {
        // 没有生物识别
    }
}

该方法本身不会执行任何操作,因为它根本没有连接到SwiftUI。为了解决这个问题,我们需要添加一些状态,我们可以在身份验证成功时进行调整,还可以使用onAppear()修饰符来触发身份验证。

因此,首先将此属性添加到ContentView

@State private var isUnlocked = false

这个简单的布尔值将存储应用程序是否显示其受保护的数据,因此当身份验证成功时,我们会将其设置为true。用其替换注释 // 认证成功

self.isUnlocked = true

最后,我们可以显示当前身份验证状态并在 body 属性内开始身份验证过程,如下所示:

VStack {
    if self.isUnlocked {
        Text("Unlocked")
    } else {
        Text("Locked")
    }
}
.onAppear(perform: authenticate)

如果您运行该应用,则很有可能会看到“Locked”,而没有其他显示。这是因为默认情况下,模拟器未启用生物识别功能,并且我们未提供任何错误消息,因此它会自动失败。

要将Face ID用于测试驱动器,请转到“ Hardware/Features”菜单,然后选择 Face ID > Enrolled,然后再次启动该应用程序。这次您应该看到出现Face ID提示,并且可以通过返回到“硬件”菜单并选择“ Face ID”>“匹配的面部”或“不匹配的面部”来触发成功或失败的身份验证。

一切都很好,您应该会看到Face ID提示消失了,下面是“Unlocked”文本视图——我们的应用程序已检测到身份验证,并且可以使用。