22. 权限隐私
权限管理必须做到“在需要时请求、结果可处理、拒绝可降级”。流程清晰,体验才稳定。
一、Info.plist 必备描述
常见描述键:
NSCameraUsageDescriptionNSMicrophoneUsageDescriptionNSPhotoLibraryUsageDescriptionNSLocationWhenInUseUsageDescription
没有描述会直接崩溃。
二、相机权限
import AVFoundation
func requestCamera() {
let status = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .authorized:
openCamera()
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { granted in
DispatchQueue.main.async { granted ? self.openCamera() : self.showDenied() }
}
default:
showDenied()
}
}
三、相册权限
import Photos
func requestPhotoLibrary() {
let status = PHPhotoLibrary.authorizationStatus()
switch status {
case .authorized, .limited:
openPhotoPicker()
case .notDetermined:
PHPhotoLibrary.requestAuthorization { _ in
DispatchQueue.main.async { self.requestPhotoLibrary() }
}
default:
showDenied()
}
}
四、定位权限
import CoreLocation
final class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
}
func request() {
manager.requestWhenInUseAuthorization()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .authorizedWhenInUse, .authorizedAlways:
manager.startUpdatingLocation()
default:
break
}
}
}
五、拒绝后的处理
func openSettings() {
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url)
}
不要反复弹系统授权框,拒绝后给出清晰说明和入口。
六、隐私原则
- 只在需要时请求权限
- 不在启动时批量请求
- 不把权限请求当功能入口
权限流程清晰,用户信任度更高,功能转化也更稳定。