| 分类 ios  | 标签 iOS  权限 

title

引言

iOS 对用户隐私有严格保护,各类敏感权限(定位、相机、相册、麦克风、通讯录等)必须在 Info.plist 中声明用途描述,否则应用会崩溃或审核被拒。权限请求的时机、文案和引导方式直接影响用户授权率和应用体验。Apple 的审核指南要求权限说明清晰、请求时机合理,不得在启动时一次性请求所有权限。本文将介绍常见权限的 Info.plist 配置、请求时机策略、权限状态处理以及 App Store 审核要点。

权限与 Info.plist

每个敏感权限对应一个 Usage Description 键,系统在首次请求时会展示给用户。若缺少对应键,访问相关 API 可能导致崩溃。描述应具体说明用途,如”用于扫描二维码完成支付”而非泛泛的”需要相机”。审核会检查描述是否与功能匹配,含糊或误导性描述可能被拒。

常见权限 Key

<key>NSLocationWhenInUseUsageDescription</key>
<string>用于展示附近服务</string>
<key>NSCameraUsageDescription</key>
<string>用于拍摄和扫描</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>用于选择头像和分享图片</string>
<key>NSMicrophoneUsageDescription</key>
<string>用于录制语音消息</string>
<key>NSUserTrackingUsageDescription</key>
<string>用于提供个性化推荐</string>

其他常见键包括:NSBluetoothAlwaysUsageDescriptionNSContactsUsageDescriptionNSCalendarsUsageDescriptionNSRemindersUsageDescription 等。iOS 14.5+ 的 ATT(App Tracking Transparency)要求在使用 IDFA 前通过 AppTrackingTransparency 框架请求授权,并配置 NSUserTrackingUsageDescription

请求时机

最佳实践是”按需请求”:在用户即将使用需要权限的功能时再请求,而非应用启动时批量请求。例如,用户点击”拍照”按钮时再请求相机权限,这样用户能理解为何需要权限,授权率更高。请求前可先检查 authorizationStatus:若已授权则直接执行;若未决定则调用 requestAccess 并处理回调;若已拒绝,可引导用户前往设置页开启,但不应反复弹窗打扰。

// 在用户需要功能时再请求,而非启动时
func takePhoto() {
    switch AVCaptureDevice.authorizationStatus(for: .video) {
    case .authorized:
        presentCamera()
    case .notDetermined:
        AVCaptureDevice.requestAccess(for: .video) { granted in
            DispatchQueue.main.async {
                if granted { self.presentCamera() }
            }
        }
    case .denied:
        showSettingsAlert()
    default:
        break
    }
}

showSettingsAlert 可提示用户前往”设置 - 隐私”开启权限,并通过 UIApplication.openSettingsURLString 跳转。注意:用户可能多次拒绝,应尊重选择,避免频繁引导。

审核要点

  1. 不强制权限:若权限被拒,应用应仍能使用核心功能(以降级方式),不得因未授权而无法使用。
  2. 描述准确:Usage Description 必须与实际用途一致,不得欺骗或误导。
  3. 时机合理:避免启动即请求多个权限,应在相关功能触发时请求。
  4. ATT 合规:若使用 IDFA 或第三方追踪 SDK,需正确集成 ATT 并说明用途。

总结

遵循最小权限原则,提供清晰的权限说明,在合适的场景请求权限。合理处理授权、拒绝和引导,能够提升用户信任和授权率,同时满足 App Store 审核要求。


上一篇     下一篇