AVCaptureDevice.requestAccess présente un comportement inattendu avec un UINavigationController

voix
0

Travailler avec Xcode 10.1 et Swift 4.2

J'ai une application complexe qui utilise une UINavigationControllermise en œuvre dans le AppDelegate.

Le RootViewController du NavigationController est une DashboardController()classe (sous - classe de UIViewController)

Les DashboardControlleroutils d' un tiroir de menu à gauche en utilisant plusieurs ViewControllers (avec self.addChild(viewController))

Tout fonctionne très bien, sauf quand je dois pousser un viewController pour présenter une BarCodeScannerView().

Le barCodeScannerView barebone peut être poussé et a sauté comme prévu.

Les problèmes se pose quand je demande l'accès à la caméra (uniquement la première fois).

  1. Dès que je vous présente la Device.requestAccess(for:)façon suivante: le viewController est sauté et est présenté la vue précédente (RootViewController). (Toujours avec le « App souhaite accéder à la caméra » AlertView)

    func requestCameraAccess () {AVCaptureDevice.requestAccess (pour: AVMediaType.video) {accordées si elle est accordée {self.launchScanner ()} else {self.goBack ()}}}

  2. Si je clique sur « OK » Le système enregistrera que l'accès a été accordé, mais le applicationDidBecomeActive(la AppDelegate) est appelée après aprox 1 seconde. J'ai quelques initializers dans applicationDidBecomeActive, et ils sont tous d' exécuter à nouveau. Et après un délai rapide, tout fonctionne bien.

BTW: applicationWillResignActive, applicationDidEnterBackgroundet applicationWillEnterForegroundne sont pas appelés. Il est donc clair que ce ne fait pas partie d'une application LifeCycle.

Toute idée de ce qui pourrait me passe ici? Que peut faire l'appel système applicationDidBecomeActivedans l'application? et toujours garder tout fonctionne?

Thx à l'avance ...

MISE À JOUR Après avoir lu les commentaires, j'ai pu isoler la question n ° 2 comme suit:

Un projet simple / barebone avec UINavigationControllerun dashboardViewController comme rootViewController. Le dashboardViewController pousse un CameraViewController()dans viewDidLoad(). Les demandes de cameraViewController accès à la caméra. Lorsque vous cliquez sur OK, l'appel applicationDidBecomeActiveest déclenché.

Le projet complet est attaché. (Sauf la touche « - confidentialité Utilisation Caméra Description » dans le .plist.

import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow? = UIWindow()
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let dashboardViewController = DashboardViewController()
        window?.rootViewController = UINavigationController(rootViewController: dashboardViewController)
        window?.makeKeyAndVisible()
        return true
    }
    func applicationDidBecomeActive(_ application: UIApplication) {
        print(applicationDidBecomeActive)
    }
    func applicationWillResignActive(_ application: UIApplication) {}
    func applicationDidEnterBackground(_ application: UIApplication) {}
    func applicationWillEnterForeground(_ application: UIApplication) {}
    func applicationWillTerminate(_ application: UIApplication) {}
}
class DashboardViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        let cameraVC = CameraViewController()
        self.navigationController?.pushViewController(cameraVC, animated: true)
    }
}
import AVFoundation
class CameraViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        AVCaptureDevice.requestAccess(for: AVMediaType.video) { granted in
            if granted {
                print(Access granted)
            }
        }
    }   
}
Créé 07/11/2018 à 20:13
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Je dirais que le problème est avec votre procédure de test. Quand je lance votre code avec une printdéclaration applicationWillResignActive, voici ce que je vois:

applicationDidBecomeActive
applicationWillResignActive
Access granted
applicationDidBecomeActive

Cela semble tout à fait dans l' ordre et normal. Il aurait été bizarre d'obtenir un faux didBecomeActive, mais ce n'est pas ce qui se passe; nous résignons actif, puis devenir à nouveau actif, ce qui est bien. Vous devez vous attendre à tout moment que votre application peut démissionner active et devenir à nouveau actif. Beaucoup de choses dans le cycle de vie normal peuvent causer que, et la présentation d'un dialogue hors processus comme la boîte de dialogue d'autorisation peut raisonnablement être l' un d'entre eux. Vous devez écrire votre code de telle manière à faire face à cette possibilité.

Créé 07/11/2018 à 22:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more