2016-12-23 7 views
5

Каков наиболее эффективный способ побудить пользователя предоставить доступ к Камере (или другой функции), обеспечивая при этом наилучший опыт?Запрос прав доступа к разрешению камеры (основные разрешения) в iOS

При доступе к Камере iOS должна запросить разрешение Клиента разрешить доступ. Как мы все знаем, если Клиент говорит «Нет», но затем меняет свое мнение, нет способа отменить это решение из вашего приложения. Они должны перейти в настройки и выполните ряд шагов для повторного включения доступа, а именно:

Settings -> Privacy -> Camera -> [Your App] -> turn switch on

ответ

11

Разрешения Грунтовки является эффективным способом, чтобы избежать ситуаций, когда ваш клиент может запретить доступ к ключевой функции вашего приложения.

В iOS приложение допускает только разрешить системные разрешения по умолчанию для каждой функции. Перенос прав - это когда приложение «предает» Клиенту предупреждение, которое имитирует системные разрешения.

Выгода для этого заключается в том, что если Клиент откажется (отменит Отмена), приложение все же сможет снова спросить в будущем, пока не скажет «да», - в это время отображается фактическое системное разрешение, а Клиенту статистически менее вероятно, чтобы затем изменить свое мнение и войти в отрицательный рабочий поток.

Кроме того, поскольку cameraSelected() выполняет этот рабочий процесс, если снижение пользователей, но в какой-то момент в будущем делает изменить свои настройки, приложение будет немедленно отражать новые разрешения без дальнейшего ввода (то есть. Пользователь может перейти в раздел Настройки , изменить права доступа, а затем переключиться обратно в приложение).

Вот некоторый Swift 3 кода для реализации этой функции:

[UPDATE: В комплекте входит решение открыть глубоководную ссылку Настройки, где пользователь может включить доступ к камере, если они ранее отрицали это]

[UPDATE 2:. Добавлен образец линии для реализации Аналитика]

func cameraSelected() { 
    // First we check if the device has a camera (otherwise will crash in Simulator - also, some iPod touch models do not have a camera). 
    if let deviceHasCamera = UIImagePickerController.isSourceTypeAvailable(.camera) { 
     let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) 
     switch authStatus { 
      case .authorized: 
       showCameraPicker() 
      case .denied: 
       alertPromptToAllowCameraAccessViaSettings() 
      case .notDetermined: 
       permissionPrimeCameraAccess() 
      default: 
       permissionPrimeCameraAccess() 
     } 
    } else { 
     let alertController = UIAlertController(title: "Error", message: "Device has no camera", preferredStyle: .alert) 
     let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { (alert) in 
      Analytics.track(event: .permissionsPrimeCameraNoCamera) 
     }) 
     alertController.addAction(defaultAction) 
     present(alertController, animated: true, completion: nil) 
    } 
} 


func alertPromptToAllowCameraAccessViaSettings() { 
    let alert = UIAlertController(title: "\"<Your App>\" Would Like To Access the Camera", message: "Please grant permission to use the Camera so that you can <customer benefit>.", preferredStyle: .alert) 
    alert.addAction(UIAlertAction(title: "Open Settings", style: .cancel) { alert in 
     Analytics.track(event: .permissionsPrimeCameraOpenSettings) 
     if let appSettingsURL = NSURL(string: UIApplicationOpenSettingsURLString) { 
      UIApplication.shared.openURL(appSettingsURL) 
     } 
    }) 
    present(alert, animated: true, completion: nil) 
} 


func permissionPrimeCameraAccess() { 
    let alert = UIAlertController(title: "\"<Your App>\" Would Like To Access the Camera", message: "<Your App> would like to access your Camera so that you can <customer benefit>.", preferredStyle: .alert) 
    let allowAction = UIAlertAction(title: "Allow", style: .default, handler: { (alert) -> Void in 
     Analytics.track(event: .permissionsPrimeCameraAccepted) 
     if AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo).count > 0 { 
      AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { [weak self] granted in 
       DispatchQueue.main.async { 
        self?.cameraTabSelected() // try again 
       } 
      }) 
     } 
    }) 
    alert.addAction(allowAction) 
    let declineAction = UIAlertAction(title: "Not Now", style: .cancel) { (alert) in 
     Analytics.track(event: .permissionsPrimeCameraCancelled) 
    } 
    alert.addAction(declineAction) 
    present(alert, animated: true, completion: nil) 
} 


func showCameraPicker() { 
    let picker = UIImagePickerController() 
    picker.delegate = self 
    picker.modalPresentationStyle = UIModalPresentationStyle.currentContext 
    picker.allowsEditing = false 
    picker.sourceType = UIImagePickerControllerSourceType.camera 
    present(picker, animated: true, completion: nil) 
} 
.