AVCaptureDevice.requestAccess представляет непредвиденное поведение с UINavigationController
Работа с Xcode 10.1 и Swift 4.2
У меня есть сложное приложение, которое использует UINavigationController
реализовано в AppDelegate
,
RootViewController для navigationController является DashboardController()
класс (подкласс UIViewController
)
DashboardController
реализует левый блок меню, используя несколько контроллеров ViewController (с self.addChild(viewController)
)
Все работает нормально, за исключением случаев, когда мне нужно нажать viewController, чтобы представить BarCodeScannerView().
Barebone barCodeScannerView можно нажать и вытолкнуть, как ожидалось.
Проблемы возникают, когда я запрашиваю доступ к камере (только в первый раз).
Как только я представлю
Device.requestAccess(for:)
следующим образом: viewController выталкивается, и отображается предыдущее представление (rootViewController). (Еще с "App хотел бы получить доступ к камере" AlertView)func requestCameraAccess () {AVCaptureDevice.requestAccess (для: AVMediaType.video) {предоставляется в случае предоставления { self.launchScanner() } else { self.goBack() } } }
Если я нажму "ОК", система зарегистрирует, что доступ был предоставлен, но
applicationDidBecomeActive
(вAppDelegate
) вызывается после 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
но это не то, что происходит; мы подаем в отставку, а затем снова становимся активными, и это нормально. Вы должны ожидать, что в любое время ваше приложение может отказаться от активности и снова стать активным. Многие вещи в нормальном жизненном цикле могут вызвать это, и представление диалогового окна вне процесса, такого как диалог авторизации, может быть разумно одним из них. Вы должны написать свой код таким образом, чтобы справиться с этой возможностью.