2016-12-23 15 views
5

Jaki jest najbardziej skuteczny sposób na monitowanie użytkownika o umożliwienie dostępu do kamery (lub innej funkcji) przy jednoczesnym zapewnieniu najlepszej jakości?Żądanie aktywacji okna dialogowego Uprawnienia kamery (uprawnienia pierwsze) w systemie iOS

Podczas uzyskiwania dostępu do kamery system iOS musi poprosić klienta o zezwolenie na dostęp. Jak wszyscy wiemy, jeśli klient mówi "Nie", ale potem zmienia zdanie, nie ma możliwości cofnięcia tej decyzji w aplikacji. Muszą przejść do menu Ustawienia, a następnie szereg kroków, aby ponownie włączyć dostęp, a mianowicie:

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

Odpowiedz

11

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