精选文章

22. 权限隐私

2019-09-05 · 权限

22. 权限隐私

权限管理必须做到“在需要时请求、结果可处理、拒绝可降级”。流程清晰,体验才稳定。

一、Info.plist 必备描述

常见描述键:

  • NSCameraUsageDescription
  • NSMicrophoneUsageDescription
  • NSPhotoLibraryUsageDescription
  • NSLocationWhenInUseUsageDescription

没有描述会直接崩溃。

二、相机权限

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

不要反复弹系统授权框,拒绝后给出清晰说明和入口。

六、隐私原则

  • 只在需要时请求权限
  • 不在启动时批量请求
  • 不把权限请求当功能入口

权限流程清晰,用户信任度更高,功能转化也更稳定。

JJ

作者简介

专注于内容创作、产品策略与设计实践。欢迎交流合作。

上一篇 下一篇