AVCaptureDevice.requestAccess представляет непредвиденное поведение с UINavigationController - PullRequest
0 голосов
/ 07 ноября 2018

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

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

rootViewController для navigationController - это класс DashboardController() (подкласс UIViewController)

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

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

Базовый код barCodeScannerView может быть нажатым и выдвинутым , как и ожидалось.

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

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

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

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

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

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

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

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

Простой / базовый проект с UINavigationController с приборной панелью ViewController в виде rootViewController. DashboardViewController помещает CameraViewController() в viewDidLoad(). CameraViewController запрашивает доступ к камере. При нажатии кнопки OK вызов 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 Ответ

0 голосов
/ 08 ноября 2018

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

applicationDidBecomeActive
applicationWillResignActive
Access granted
applicationDidBecomeActive

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...