AVCaptureDevice.requestAccess представляет непредвиденное поведение с UINavigationController

Работа с Xcode 10.1 и Swift 4.2

У меня есть сложное приложение, которое использует UINavigationController реализовано в AppDelegate,

RootViewController для navigationController является DashboardController() класс (подкласс UIViewController)

DashboardController реализует левый блок меню, используя несколько контроллеров ViewController (с self.addChild(viewController))

Все работает нормально, за исключением случаев, когда мне нужно нажать viewController, чтобы представить BarCodeScannerView().

Barebone barCodeScannerView можно нажать и вытолкнуть, как ожидалось.

Проблемы возникают, когда я запрашиваю доступ к камере (только в первый раз).

  1. Как только я представлю Device.requestAccess(for:) следующим образом: viewController выталкивается, и отображается предыдущее представление (rootViewController). (Еще с "App хотел бы получить доступ к камере" AlertView)

    func requestCameraAccess () {AVCaptureDevice.requestAccess (для: AVMediaType.video) {предоставляется в случае предоставления { self.launchScanner() } else { self.goBack() } } }

  2. Если я нажму "ОК", система зарегистрирует, что доступ был предоставлен, но applicationDidBecomeActiveAppDelegate) вызывается после aprox 1 секунды. У меня есть несколько инициализаторов в applicationDidBecomeActive и все они снова исполняются. И после быстрой задержки все работает нормально.

КСТАТИ: applicationWillResignActive, applicationDidEnterBackground а также applicationWillEnterForeground НЕ называются. Итак, ясно, что это не часть жизненного цикла приложения.

Есть идеи, что я мог бы здесь делать? Что может сделать системный вызов applicationDidBecomeActive в приложении? и до сих пор все работает?

Спасибо заранее...

ОБНОВЛЕНИЕ После прочтения комментариев я смог выделить проблему № 2 следующим образом:

Простой /barebones проект с UINavigationController с dashboardViewController в качестве rootViewController, DashboardViewController выдвигает CameraViewController() в viewDidLoad(), CameraViewController запрашивает доступ к камере. При нажатии ОК вызов applicationDidBecomeActive срабатывает.

Полный проект прилагается. (кроме ключа "Конфиденциальность - описание использования камеры" в.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")
            }
        }
    }   
}

1 ответ

Я бы сказал, что проблема только в вашей процедуре тестирования. Когда я запускаю ваш код с print заявление в applicationWillResignActiveвот что я вижу:

applicationDidBecomeActive
applicationWillResignActive
Access granted
applicationDidBecomeActive

Это кажется полностью в порядке и нормально. Было бы странно получить поддельные didBecomeActiveно это не то, что происходит; мы подаем в отставку, а затем снова становимся активными, и это нормально. Вы должны ожидать, что в любое время ваше приложение может отказаться от активности и снова стать активным. Многие вещи в нормальном жизненном цикле могут вызвать это, и представление диалогового окна вне процесса, такого как диалог авторизации, может быть разумно одним из них. Вы должны написать свой код таким образом, чтобы справиться с этой возможностью.

Другие вопросы по тегам