Есть два возможных подхода. Одним из них является проверка, прежде чем вы даже попытаетесь, например,
if AVCaptureDevice.authorizationStatus(for: .video) == .denied {
offerToOpenSettings()
return
}
Другой подход заключается в catch
несанкционированной ошибке:
let input: AVCaptureDeviceInput
do {
input = try AVCaptureDeviceInput(device: camera)
} catch AVError.applicationIsNotAuthorizedToUseDevice {
offerToOpenSettings()
return
} catch {
print("some other error", error)
return
}
Обратите внимание, что ловит AVError.applicationIsNotAuthorizedToUseDevice
, а не AVError.Code.applicationIsNotAuthorizedToUseDevice
.
Если, например, это было приложение iOS, вы могли бы предложить функцию перенаправления пользователя в приложение настроек:
func offerToOpenSettings() {
guard
let settings = URL(string: UIApplication.openSettingsURLString),
UIApplication.shared.canOpenURL(settings)
else { return }
let alert = UIAlertController(title: nil, message: "Would you like to open Settings to enable permission to use the camera?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Settings", style: .default) { _ in
UIApplication.shared.open(settings)
})
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
present(alert, animated: true)
}
Примечание, поскольку это потенциально представляет предупреждение, вы не хотите запускать его в viewDidLoad
(что слишком рано в процессе), а скорее viewDidAppear
.
Или, в macOS, что-то вроде:
func offerToOpenSettings() {
let preferences = URL(string: "x-apple.systempreferences:com.apple.preference.security?Privacy_Camera")!
let alert = NSAlert()
alert.messageText = #"The camera is disabled. Please go to the “Camera” section in Security System Preferences, and enable this app."#
alert.addButton(withTitle: "System Preferences")
alert.addButton(withTitle: "Cancel")
if alert.runModal() == .alertFirstButtonReturn {
NSWorkspace.shared.open(preferences)
}
}