0

アプリがバックグラウンドに移行したときにアプリをロックしようとしていますが、ユーザーはアプリがフォアグラウンドにあるときに生体認証 (FaceID/TouchID) 認証を使用してアプリのロックを解除できます。

私のコードの簡単で再現可能な例を次に示します。

import LocalAuthentication
import SwiftUI

struct ContentView: View {
    @State var isUnlocked = false
    
    var body: some View {
        if isUnlocked { 

            // if the app is unlocked, app shows the text "Unlocked"
            Text("Unlocked")
                .font(.title)

                // app gets locked when the app goes to background
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
                    self.isUnlocked = false
                    print("locked the app")
                }

        } else { 

            // if the app is locked, app shows the text "Locked" and app should show prompt FaceID/TouchID prompt
            Text("LOCKED")
                .font(.title)

                // FaceID prompt shows when the app opens (from Non-running state)
                .onAppear(perform: authenticate)

                // FaceID prompt shows when the app coming from background to foreground
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
                    authenticate()
                    print("back inside the app")
                }
        }
        
    }
    
    // I use this to prompt the biometric authentication
    func authenticate() {
        let context = LAContext()
        var error: NSError?
        
        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
            let reason = "We need to unlock your data"
            
            context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, authenticationError in
                DispatchQueue.main.async {
                    if success {
                        // app gets unlocked if biometrix authentication succeeded
                        self.isUnlocked = true
                    } else {
                        // authentication failed
                    }
                }
            }
        } else {
            // no biometrics
        }
    }

}

ユーザーが (非実行状態から) アプリを開くと、FaceID プロンプトが遅延なく即座に表示されます。ただし、アプリがバックグラウンドからフォアグラウンドに移行すると、FaceID プロンプトが表示されるまでに約 5 秒かかります。同じ関数を使用しauthenticate()て生体認証を促し、"back inside the app"アプリがバックグラウンドからフォアグラウンドに移行すると、Xcode コンソールが即座に印刷されます。
では、その FaceID の遅延の原因は何ですか?

私を助けてください。ありがとう。

4

0 に答える 0