gpt4 book ai didi

ios - AVCaptureDevice.requestAccess 使用 UINavigationController 呈现意外行为

转载 作者:行者123 更新时间:2023-11-28 14:04:11 29 4
gpt4 key购买 nike

使用 Xcode 10.1 和 Swift 4.2

我有一个复杂的应用程序,它使用在 AppDelegate 中实现的 UINavigationController

navigationController 的 rootViewController 是一个 DashboardController() 类(UIViewController 的子类)

DashboardController 使用多个 ViewController(使用 self.addChild(viewController))实现左侧菜单抽屉

一切正常,除非我需要推送一个 viewController 来呈现一个 BarCodeScannerView()。

准系统 barCodeScannerView 可以按预期推送弹出

问题出现在我请求访问相机时(只是第一次)。

  1. 只要我按如下所示显示 Device.requestAccess(for:):viewController 就会弹出,并且会显示前一个 View (rootViewController)。 (仍然带有“App would like to access the camera”AlertView)

    func requestCameraAccess() { AVCaptureDevice.requestAccess(for: AVMediaType.video) { granted in 如果授予{ self.launchScanner() } 别的 { self.goBack() } }

  2. 如果我单击“确定”,系统将注册访问已被授予,但是applicationDidBecomeActive(在 AppDelegate 中)在大约 1 秒后被调用。我在 applicationDidBecomeActive 中有一些初始化器,它们都被再次执行。在短暂的延迟之后,一切正常。

顺便说一句:未调用 applicationWillResignActiveapplicationDidEnterBackgroundapplicationWillEnterForeground。所以很明显这不是 App LifeCycle 的一部分。

知道我会在这里做什么吗?什么可以使应用程序内的系统调用applicationDidBecomeActive?仍然保持一切正常运行?

提前致谢...

更新 阅读评论后,我能够将问题 #2 隔离如下:

一个带有 UINavigationController 和 dashboardViewController 作为 rootViewController 的简单/准系统项目。 dashboardViewController 在 viewDidLoad() 中推送一个 CameraViewController()。 cameraViewController 请求访问相机。单击确定时,将触发对 applicationDidBecomeActive 的调用。

附上完整的项目。 (.plist 中的“Privacy - Camera Usage Description”键除外。

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")
}
}
}
}

最佳答案

我会说问题出在您的测试程序上。当我在 applicationWillResignActive 中使用 print 语句运行您的代码时,这是我看到的:

applicationDidBecomeActive
applicationWillResignActive
Access granted
applicationDidBecomeActive

这看起来完全正常。得到一个虚假的 didBecomeActive 会很奇怪,但事实并非如此;我们退出活跃状态,然后再次活跃起来,这很好。您应该期望您的应用程序可以随时退出事件状态并再次变为事件状态。正常生命周期中的许多事情都可能导致这种情况,像授权对话框这样的进程外对话框的呈现可以合理地成为其中之一。您应该以应对这种可能性的方式编写代码。

关于ios - AVCaptureDevice.requestAccess 使用 UINavigationController 呈现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197130/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com