Pozwolenie Gruntowanie jest skutecznym sposobem, aby uniknąć sytuacji, w której klient może odmówić dostępu do kluczowych funkcji Twojej aplikacji.
W systemie iOS aplikacja może wyzwalać domyślne uprawnienia systemowe tylko raz dla każdej funkcji. Aktywacja praw autorskich polega na tym, że aplikacja "wysyła" klientowi alert, który naśladuje pozwolenie systemowe.
Korzyścią jest to, że jeśli Klient zrezygnuje (wyłączy Anuluj), aplikacja będzie mogła ponownie zapytać w przyszłości, dopóki nie odpowie "tak" - w tym czasie wyświetlone zostanie aktualne uprawnienie systemowe i Klient jest statystycznie mniej prawdopodobne, aby następnie zmienić zdanie i wejść w negatywny przepływ pracy.
Ponadto, ponieważ cameraSelected()
wykonuje tę workflow, jeśli spadki użytkownika, ale w pewnym momencie w przyszłości dokłada zmienić ich ustawienia, aplikacja zostanie natychmiast odzwierciedlać nowe uprawnienia bez dalszego wejścia (tzn. Użytkownik mógłby przejść do Ustawienia , zmień uprawnienia, a następnie przełącz się z powrotem do aplikacji).
Oto Swift 3 kod do wdrożenia tej funkcji:
[UPDATE: W zestawie znajduje się rozwiązanie, aby otworzyć głęboko link do ustawień, gdzie użytkownik może umożliwić dostęp do aparatu, jeśli zostały one wcześniej odmówiono it]
[Aktualizacja 2:. Dodano linie przykładowych realizacji 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?.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)
}
.