在我的 iOS 应用程序上,我使用从后台返回后进行生物识别身份验证的典型方法:
@main
struct MyApp: App {
@Environment(\.scenePhase) var phase
var body: some Scene {
WindowGroup {
MainView()
.onChange(of: phase) { (newPhase) in
switch newPhase {
case .active:
biometricsAuthentication()
case .inactive: print("App is inactive")
case .background: print("App is on background")
appBlocked = true
default: print("default")
}
}
}
}
这样做一切正常,但在身份验证方法触发之前,MainView 有一段时间可见,我猜想是因为应用程序从 .background 返回后处于 .inactive 状态的时间很短。
在 MacOS 应用程序版本上,我在 AppDelegate 上将此身份验证方法称为“applicationDidFinishLaunching”方法,并且在身份验证完成之前不会显示任何内容。因此,我尝试使用专用的 AppDelegate 在 iOS 上模拟这一点,并尝试了一些方法,但没有成功。
这是正确的做法吗?有办法实现吗?
发生这种情况是因为 MainView 是在阶段的状态值更改之前绘制的。您需要将两个视图分开,以便在逻辑上检查身份验证检查之前不会显示 Main 和 Auth。但是,您需要一些东西来展示它的异步性质。如果强制显示身份验证视图,当用户已经登录时,身份验证视图也会短暂显示。我所做的就是添加一个“正在加载”视图或一个“启动”视图,这是起始视图,并根据返回的 auth 或 main 的检查值更改为其他视图。这是一个潜在的解决方案。当您真正希望显示 MainView 时,您需要进行处理。
事实上,有很多不同的方法来处理这个问题,但我确实认为这可能是最常见的处理方法。