Swift requestAccessForMediaType不';Don’不要请求许可

Swift requestAccessForMediaType不';Don’不要请求许可,swift,avfoundation,grand-central-dispatch,Swift,Avfoundation,Grand Central Dispatch,我注意到我的应用程序没有请求使用相机的许可。经过一些实验,我发现用于检查权限的代码需要很长时间才能完成。所以我想让viewdidload的这一部分在串行队列(sync)上运行。强制其余部分在开始下一行之前等待身份验证过程完成。但这并没有真正起作用。这些行按顺序开始,但仍然没有按顺序结束 奇怪的是,如果我只是调用了权限,却什么也不做,没有completionHandler(如下面的代码),那么在我第二次使用completionHandler运行它时,他确实运行了,尽管它仍然没有向用户显示警报。这可

我注意到我的应用程序没有请求使用相机的许可。经过一些实验,我发现用于检查权限的代码需要很长时间才能完成。所以我想让viewdidload的这一部分在串行队列(sync)上运行。强制其余部分在开始下一行之前等待身份验证过程完成。但这并没有真正起作用。这些行按顺序开始,但仍然没有按顺序结束

奇怪的是,如果我只是调用了权限,却什么也不做,没有completionHandler(如下面的代码),那么在我第二次使用completionHandler运行它时,他确实运行了,尽管它仍然没有向用户显示警报。这可能是因为在欧洲录制视频不需要许可吗

如果我想让代码逐行执行,我需要使用屏障吗?或同步串行队列的或

AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { nil }())

更新:

这种方法应该是非常安全的,但事实并非如此。它返回true表示理所当然,但3表示原始值(拒绝)


更新2:在下面的评论中回答。 -重置设备上的隐私设置以获取请求

  • 授权的原始值为3而不是4

如果它需要很长时间才能显示,那么听起来好像您没有在主线程上运行它,而您应该在主线程上运行它。此外,如果之前有过一次提示,则不会再次提示–用户必须进入“设置”并启用摄像头访问。

每次测试时,我都会删除该应用程序,我的位置权限请求会顺利通过。我将请求移动到主线程,没有区别在测试时,您应该尝试重置隐私设置(设置>常规>重置位置和隐私),这将提供更可靠的结果。当我删除一个应用并重新安装它时,它仍然不会请求摄像头的许可。此外,请尝试通过
[AVCaptureDevice authorizationStatusForMediaType:type]
检查
AVAuthorizationStatus
——如果未确定,则请求访问。如果它被限制或拒绝,向用户显示警告,如果它被授权,请继续。因为当我重置隐私设置时,我确实收到了警告(太棒了!)同样的问题发生在我身上,但没有任何效果。重置隐私设置也无济于事。有趣的是,在一些设备上没有发生这样的问题,而且完全是随机的,我不知道为什么。
func checkForAuthorizationStatus() {
        println("auth me")
        AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: {
            granted in
            if granted {
                println("granted: \(granted)")
                self.deviceAuthorized = true
                println("raw value: \(AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo).rawValue)")
            } else {
                self.deviceAuthorized = false
            }

        })
    }