Я пытаюсь понять, как загрузить представление SwiftUI из кода функции Swift. В данном случае, в частности, я хочу загрузить представление при возврате из фонового состояния для покрытия конфиденциальных данных. Я создал вход в систему biometri c, и он отлично работает - чистые представления SwiftUI для приложения. Когда я помещаю приложение в фоновый режим и возвращаюсь, FaceID работает как положено, но основной экран виден. Это также обобщенный вопрос - как вы можете загрузить любое представление SwiftUI из любой функции Swift.
func sceneDidBecomeActive(_ scene: UIScene) {
if userDefaultsManager.wentToBackground {
if userDefaultsManager.enableBiometrics {
BiometricsLogin(userDefaultsManager: userDefaultsManager).authenticate()
//what I want is something like:
//BiometricsLogin(userDefaultsManager: userDefaultsManager)
//kinda like you would do in a TabView
//that would run the authentication just like starting the app
userDefaultsManager.wentToBackground = false
}
}
}
И код входа в систему довольно обобщенный c:
struct BiometricsLogin: View {
@ObservedObject var userDefaultsManager: UserDefaultsManager
var body: some View {
NavigationView {
VStack {
Image("CoifMeCrop180")
.onAppear {
self.authenticate()
}
}//vstack
}//nav
}
func authenticate() {
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
let reason = "The app uses Biometrics to unlock you data"
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { (success, authenticationError)
in
DispatchQueue.main.async {
if success {
self.userDefaultsManager.isAuthenticated = true
self.userDefaultsManager.selectedTab = 1
} else {
if self.userDefaultsManager.enableBiometrics {
self.userDefaultsManager.isAuthenticated = false
self.userDefaultsManager.selectedTab = 3
} else {
self.userDefaultsManager.isAuthenticated = false
self.userDefaultsManager.selectedTab = 1
}
}
}
}
} else {
//no biometrics - deal with this elsewhere
//consider an alert here
}
}//authenticate
}
Я также попытался использовать контроллер хостинга, как это, но он также не работал. Та же проблема, аутентификация работала, но данные были видны.
//this does not work
let controller = UIHostingController(rootView: BiometricsLogin(userDefaultsManager: userDefaultsManager))
self.window!.addSubview(controller.view)
self.window?.makeKeyAndVisible()
Любое руководство будет оценено. Xcode 11.3.1 (11C504)