No meu aplicativo iOS, eu uso a forma típica de autenticação biométrica depois de voltar do segundo plano:
@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")
}
}
}
}
Fazendo dessa forma tudo funciona bem, mas há um pequeno momento em que o MainView fica visível ANTES dos acionadores do método de autenticação, suponho que devido à fração de tempo que o aplicativo fica .inativo, após voltar de .background.
Na versão do aplicativo MacOS, eu chamo esse método de autenticação no método AppDelegate "applicationDidFinishLaunching" e nada é apresentado até que a autenticação seja concluída. Então, tentei emular isso no iOS, com um AppDelegate dedicado, e tentei alguns métodos, sem sucesso.
Esta é a maneira correta de fazer isso? Existe uma maneira de conseguir isso?
Isso está acontecendo porque o MainView é desenhado antes que o valor do estado mude para sua fase. Você precisa separar as duas visualizações de forma que Main e Auth não sejam apresentadas até que a verificação de autenticação seja verificada logicamente. No entanto, você precisará de algo para mostrar a natureza assíncrona disso. Se você forçar a exibição da visualização Auth, quando o usuário já estiver logado, a visualização Auth também aparecerá brevemente. O que faço é adicionar uma visualização "Carregando" ou uma visualização "Splash", que é a visualização inicial e é alterada para as outras dependendo do valor de verificação retornado para autenticação ou principal. Aqui está uma solução potencial. Você vai querer saber quando realmente deseja que o MainView seja mostrado.
Na verdade, existem várias maneiras diferentes de lidar com isso, mas acho que essa é provavelmente a maneira mais comum de lidar com isso.