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
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)
}