Próbuję to napisać:
if usergavepermissiontousercamera
opencamera
else
showmycustompermissionview
Nie udało się znaleźć aktualnego sposobu wykonania tego prostego zadania.
Uwaga: Powinien również działać iOS7, nawet jeśli wymaga innej metody
Odpowiedzi:
Możesz użyć następującego kodu, aby zrobić to samo:
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 } }) }
UWAGA:
AVFoundation
Framework w sekcji Link Binary faz kompilacjiimport AVFoundation
na swojej klasie do importowaniaAVFoundation
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 } }) }
Szybki 4
if AVCaptureDevice.authorizationStatus(for: .video) == .authorized { //already authorized } else { AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in if granted { //access allowed } else { //access denied } }) }
źródło
Zaktualizowane rozwiązanie Swift 3.0
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 i.e. 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(string: UIApplicationOpenSettingsURLString)!) })) 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) }
źródło
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 // Handle }) } }) 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 takdenied
. Jeśli takrestricted
, aktualny użytkownik może nie być w stanie go włączyć, ale należy zapewnić mu pewne wskazówki.źródło
Spowoduje to otwarcie kamery, gdy użytkownik nada pozwolenie. W przeciwnym razie pokaż ostrzeżenie o zapytaniu o pozwolenie.
func openCamera(){ let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) switch (authStatus){ case .notDetermined, .restricted, .denied: showAlert(title: "Unable to access the Camera", message: "To enable access, go to Settings > Privacy > Camera and turn on Camera access for this app.") case .authorized: alert.dismiss(animated: true, completion: nil) if(UIImagePickerController .isSourceTypeAvailable(.camera)){ picker.sourceType = .camera picker.showsCameraControls=true picker.allowsEditing=true self.viewController!.present(picker, animated: true, completion: nil) } } }
po tym wywołaj tę funkcję, aby pokazać alert
func showAlert(title:String, message:String) { let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert) let okAction = UIAlertAction(title: "OK", style: .cancel, handler: nil) alert.addAction(okAction) let settingsAction = UIAlertAction(title: "Settings", style: .default, handler: { _ in // Take the user to Settings app to possibly change permission. guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return } if UIApplication.shared.canOpenURL(settingsUrl) { if #available(iOS 10.0, *) { UIApplication.shared.open(settingsUrl, completionHandler: { (success) in // Finished opening URL }) } else { // Fallback on earlier versions UIApplication.shared.openURL(settingsUrl) } } }) alert.addAction(settingsAction) self.viewController!.present(alert, animated: true, completion: nil) }
źródło
Zmodyfikowałem powyższą odpowiedź i usunąłem początkowy monit, ponieważ gdy chcemy użyć aparatu urządzenia, system sam pyta o uprawnienia:
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(string: UIApplicationOpenSettingsURLString)!) }) present(alert, animated: true) }
źródło
Możesz zaimportować strukturę AVFoundation i użyć metody AuthorizationStatus (for :) przedstawionej poniżej oraz obsłużyć odpowiednie przypadki.
switch AVCaptureDevice.authorizationStatus(for: .video) { case .authorized: // The user has previously granted access to the camera. self.setupCaptureSession() case .notDetermined: // The user has not yet been asked for camera access. AVCaptureDevice.requestAccess(for: .video) { granted in if granted { self.setupCaptureSession() } } case .denied: // The user has previously denied access. return case .restricted: // The user can't grant access due to restrictions. return }
źródło