权限底漆是为了避免一种情况,你的客户可能会拒绝一个关键功能接入的有效途径的应用程序。
在iOS上,只允许每个功能触发默认系统权限一次。权限启动是指应用程序通过模仿系统权限的警报“启动”客户。
这样做的好处是,如果客户选择退出(选择取消),该应用程序仍然可以在将来再次询问,直到他们说是 - 在此时显示实际的系统权限以及客户在统计上不太可能改变主意并进入负面的工作流程。
此外,由于cameraSelected()执行该流程,如果用户拒绝,但后来在未来的某个时刻确实更改它们的设置,应用程序将立即反映没有进一步输入新的权限(即用户可以切换到设置,更改权限,然后切换回应用程序)。
下面是一些斯威夫特3代码来实现此功能:
[更新:包括是打开一个深层链接设置,用户可以启用摄像头的访问,如果他们之前都否认的解决方案它]
[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: "\"\" Would Like To Access the Camera", message: "Please grant permission to use the Camera so that you can .", 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: "\"\" Would Like To Access the Camera", message: " would like to access your Camera so that you can .", 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)
} 。