当用户选择允许访问iOS中的Camera时收到通知

时间:2014-09-19 12:50:19

标签: ios iphone avcapturesession

当应用程序尝试访问iOS中的Camera API时,会显示操作系统级别的警报视图。 此处的用户必须允许访问摄像头或禁用访问。

我的问题是如何才能收到用户选择的通知..?

假设他选择了不允许访问,而不是我可以在我的应用中使用任何通知..?

感谢任何帮助。

2 个答案:

答案 0 :(得分:24)

当相机出现时,您可以检查当前的授权状态,并手动请求授权,而不是让操作系统显示警报视图。这样,当用户接受/拒绝您的请求时,您会收到回调。

在swift:

let status = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
if status == AVAuthorizationStatus.Authorized {
    // Show camera
} else if status == AVAuthorizationStatus.NotDetermined {
    // Request permission
    AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted) -> Void in
        if granted {
            // Show camera
        }
    })
} else {
    // User rejected permission. Ask user to switch it on in the Settings app manually
}

如果用户之前拒绝了该请求,则调用requestAccessForMediaType将不会显示警报并立即执行完成块。在这种情况下,您可以选择显示自定义提醒并将用户链接到设置页面。有关此here的更多信息。

答案 1 :(得分:0)

从Kens的回答中,我创建了这个Swift 3协议来处理权限访问:

import AVFoundation

protocol PermissionHandler {
    func handleCameraPermissions(completion: @escaping ((_ error: Error?) -> Void))
}

extension PermissionHandler {

    func handleCameraPermissions(completion: @escaping ((_ error: Error?) -> Void)) {
        let status = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)

        switch status {
        case .authorized:
            completion(nil)
        case .restricted:
            completion(ClientError.noAccess)
        case .notDetermined:
            AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in
                if granted {
                    completion(nil)
                } else {
                    completion(ClientError.noAccess)
                }
            }
        case .denied:
            completion(ClientError.noAccess)
        }
    }
}

然后您可以遵循此协议并在您的班级中调用它,如下所示:

handleCameraPermissions() { error in
    if let error = error {
        //Denied, handle error here
        return
    }

    //Allowed! As you were