Essayer d’écrire ceci:
if usergavepermissiontousercamera opencamera else showmycustompermissionview
Impossible de trouver un moyen courant de faire cette tâche simple.
Note: Devrait également fonctionner iOS7 même si cela nécessite une méthode différente
Vous pouvez utiliser le code suivant pour faire la même chose:
if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) == AVAuthorizationStatus.Authorized { // Already Authorized } else { AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in if granted == true { // User granted } else { // User rejected } }) }
REMARQUE:
AVFoundation
dans la section Link Binary des phases de construction import AVFoundation
sur votre classe pour importer AVFoundation
SWIFT 3
if AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) == AVAuthorizationStatus.authorized { // Already Authorized } else { AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in if granted == true { // User granted } else { // User Rejected } }) }
if AVCaptureDevice.authorizationStatus(for: .video) == .authorized { //already authorized } else { AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in if granted { //access allowed } else { //access denied } }) }
Swift 3.0 Solution mise à jour
func callCamera(){ let myPickerController = UIImagePickerController() myPickerController.delegate = self; myPickerController.sourceType = UIImagePickerControllerSourceType.camera self.present(myPickerController, animated: true, completion: nil) NSLog("Camera"); } func checkCamera() { let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) switch authStatus { case .authorized: callCamera() // Do your stuff here ie callCameraMethod() case .denied: alertPromptToAllowCameraAccessViaSetting() case .notDetermined: alertToEncourageCameraAccessInitially() default: alertToEncourageCameraAccessInitially() } } func alertToEncourageCameraAccessInitially() { let alert = UIAlertController( title: "IMPORTANT", message: "Camera access required for capturing photos!", preferredStyle: UIAlertControllerStyle.alert ) alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil)) alert.addAction(UIAlertAction(title: "Allow Camera", style: .cancel, handler: { (alert) -> Void in UIApplication.shared.openURL(URL(ssortingng: UIApplicationOpenSettingsURLSsortingng)!) })) present(alert, animated: true, completion: nil) } func alertPromptToAllowCameraAccessViaSetting() { let alert = UIAlertController( title: "IMPORTANT", message: "Camera access required for capturing photos!", preferredStyle: UIAlertControllerStyle.alert ) alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel) { alert in if AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo).count > 0 { AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in DispatchQueue.main.async() { self.checkCamera() } } } } ) present(alert, animated: true, completion: nil) }
Ce qui suit est une réponse nettoyée mise à jour pour Swift 4.x:
À partir d’iOS 10, vous devez également demander l’autorisation dans le fichier info.plist pour éviter un plantage:
Confidentialité – Utilisation de l’appareil photo Description
Vous devez fournir une chaîne qui est présentée à l’utilisateur avec cette clé. Si vous ne le faites pas, cela entraînera un blocage lors de la tentative d’access à la caméra.
import AVFoundation func checkCameraAccess() { switch AVCaptureDevice.authorizationStatus(for: .video) { case .denied: print("Denied, request permission from settings") presentCameraSettings() case .ressortingcted: print("Ressortingcted, 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(ssortingng: UIApplicationOpenSettingsURLSsortingng) { UIApplication.shared.open(url, options: [:], completionHandler: { _ in // Handle }) } }) present(alertController, animated: true) }
Cela testera les quatre réponses possibles, puis demandera l’autorisation si elle n’est pas notDetermined
, ou dirige l’utilisateur vers les parameters pour l’activer si elle est denied
. S’il est ressortingcted
, l’utilisateur actuel peut ne pas être en mesure de l’activer, mais vous devez lui fournir des conseils.
J’ai modifié la réponse ci-dessus et supprimé l’invite initiale, car lorsque nous souhaitons utiliser la caméra de l’appareil, le système demande les permissions lui-même:
func checkPermissions() { let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) switch authStatus { case .authorized: setupCamera() case .denied: alertPromptToAllowCameraAccessViaSetting() default: // Not determined fill fall here - after first use, when is't neither authorized, nor denied // we try to use camera, because system will ask itself for camera permissions setupCamera() } } func alertPromptToAllowCameraAccessViaSetting() { let alert = UIAlertController(title: "Error", message: "Camera access required to...", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Cancel", style: .default)) alert.addAction(UIAlertAction(title: "Settings", style: .cancel) { (alert) -> Void in UIApplication.shared.openURL(URL(ssortingng: UIApplicationOpenSettingsURLSsortingng)!) }) present(alert, animated: true) }