web-dev-qa-db-fra.com

Demander l'amorçage de la boîte de dialogue d'autorisation de la caméra (autorisations principales) dans iOS

Quel est le moyen le plus efficace pour inviter un utilisateur à fournir un accès à la caméra (ou à une autre fonctionnalité), tout en garantissant la meilleure expérience?

Lors de l'accès à la caméra, iOS doit demander au client l'autorisation d'autoriser l'accès. Comme nous le savons tous, si le client dit "non" mais change d'avis, il n'y a aucun moyen d'annuler cette décision à partir de votre application. Ils doivent aller dans Paramètres et suivre un certain nombre d'étapes pour réactiver l'accès, à savoir:

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

12
cleverbit

Permission Priming est un moyen efficace d'éviter une situation où votre client pourrait refuser l'accès à une fonctionnalité clé de votre application.

Sur iOS, une application n'est autorisée à déclencher l'autorisation système par défaut qu'une seule fois par fonctionnalité. L'amorçage d'autorisation est lorsqu'une application "amorce" le client avec une alerte qui imite une autorisation système.

L'avantage de faire cela est que si le client se retire (sélectionne Annuler), l'application est toujours en mesure de demander à nouveau à l'avenir, jusqu'à ce qu'ils disent oui - à quel moment l'autorisation réelle du système est affichée et le client est statistiquement moins susceptibles de changer d'avis et d'entrer dans le flux de travail négatif.

De plus, puisque cameraSelected() exécute ce flux de travail, si l'utilisateur refuse, mais qu'à un certain moment , modifie ses paramètres, l'application reflétera immédiatement les nouvelles autorisations sans autre saisie (c.-à-d. que l'utilisateur pourrait basculer vers Paramètres, modifier les autorisations, puis revenir à l'application).

Voici du code Swift pour implémenter cette fonctionnalité:

[MISE À JOUR: Inclus est une solution pour ouvrir un lien profond vers les paramètres où l'utilisateur peut activer l'accès à la caméra, s'il l'a déjà refusé.]

[MISE À JOUR 2: lignes d'échantillons ajoutées pour l'implémentation d'Analytics.]

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?.cameraSelected() // 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)
}
22
cleverbit