Poniżej znajduje się uporządkowana odpowiedź zaktualizowana dla Swift 4.x:
Począwszy od iOS 10, musisz również poprosić o pozwolenie w pliku info.plist, aby uniknąć awarii:

Prywatność - opis korzystania z aparatu
Musisz podać ciąg, który jest przedstawiany użytkownikowi za pomocą tego klucza. Niespełnienie tego warunku spowoduje awarię podczas próby uzyskania dostępu do aparatu.
import AVFoundation
func checkCameraAccess() {
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .denied:
print("Denied, request permission from settings")
presentCameraSettings()
case .restricted:
print("Restricted, device owner must approve")
case .authorized:
print("Authorized, proceed")
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { success in
if success {
print("Permission granted, proceed")
} else {
print("Permission denied")
}
}
}
}
func presentCameraSettings() {
let alertController = UIAlertController(title: "Error",
message: "Camera access is denied",
preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Cancel", style: .default))
alertController.addAction(UIAlertAction(title: "Settings", style: .cancel) { _ in
if let url = URL(string: UIApplicationOpenSettingsURLString) {
UIApplication.shared.open(url, options: [:], completionHandler: { _ in
})
}
})
present(alertController, animated: true)
}
Spowoduje to sprawdzenie czterech możliwych odpowiedzi, a następnie albo zażąda pozwolenia, jeśli tak notDetermined, albo skieruje użytkownika do ustawień, aby je włączyć, jeśli tak denied. Jeśli tak restricted, aktualny użytkownik może nie być w stanie go włączyć, ale należy zapewnić mu pewne wskazówki.