当应用程序尝试访问iOS中的Camera API时,会显示操作系统级别的警报视图。 此处的用户必须允许访问摄像头或禁用访问。
我的问题是如何才能收到用户选择的通知..?
假设他选择了不允许访问,而不是我可以在我的应用中使用任何通知..?
感谢任何帮助。
答案 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