苹果绝大多数设备都以生物识别身份验证为标准,这意味着它们使用指纹和面部识别来解锁。我们也可以使用此功能,这意味着我们可以确保仅当有效用户解锁后才能读取敏感数据。
这是另一个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()
方法,将所有生物特征功能隔离在一个地方。为此,需要四个步骤:
- 创建
LAContext
实例,这使我们可以查询生物识别状态并执行身份验证检查。 - 询问上下文是否能够执行生物特征认证——这很重要,因为iPod touch 既没有 Touch ID 也没有 Face ID。
- 如果可以进行生物识别,那么我们将启动实际的身份验证请求,并传递一个闭包以在身份验证完成时运行。
- 当用户通过身份验证或未通过身份验证时,我们的完成关闭将被调用并告诉我们它是否有效,如果不是,那么错误是什么。该闭包将从主线程中调用,因此我们需要将所有与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”文本视图——我们的应用程序已检测到身份验证,并且可以使用。
网友评论