常见权限类型及风险
权限这个事儿,说白了就是 APP 或 SDK 向系统申请"开个后门",拿到你手机上的敏感数据或硬件能力。我最近在帮客户做 SDK 合规审计时,发现很多开发者对权限的理解还停留在"能跑就行"的阶段——这其实挺危险的。你想想看,一个手电筒 APP 要读取通讯录,这正常吗?
今天我们就来系统地捋一捋 Android 和 iOS 两大平台上的权限体系,看看哪些权限容易被滥用,以及滥用之后会捅出什么篓子。
Android 常见权限类别
Android 的权限分成了三个等级,官方文档里写得很清楚,但我用大白话给你翻译一下:
- 普通权限:对用户隐私没啥影响,系统直接帮你授权了,你都不用管。比如网络访问、蓝牙开关这些。
- 危险权限:涉及用户隐私数据,必须弹窗让用户点头同意。比如位置、相机、通讯录。
- 特殊权限:比危险权限更敏感,需要用户去系统设置里手动打开。比如悬浮窗、修改系统设置。
我记得 Android 6.0 刚推出动态权限时,好多 SDK 直接崩溃,就是因为没做运行时权限适配。下面这张表列出了常见的危险权限分组:
| 权限组 | 权限名 | 涉及的数据 |
|---|---|---|
| CALENDAR | READ_CALENDAR / WRITE_CALENDAR | 日历事件 |
| CAMERA | CAMERA | 摄像头画面 |
| CONTACTS | READ_CONTACTS / WRITE_CONTACTS | 通讯录 |
| LOCATION | ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION | 精确或粗略位置 |
| MICROPHONE | RECORD_AUDIO | 麦克风录音 |
| PHONE | READ_PHONE_STATE / CALL_PHONE | 设备标识、拨号 |
| SENSORS | BODY_SENSORS | 健康传感器数据 |
| SMS | READ_SMS / SEND_SMS | 短信内容 |
| STORAGE | READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE | 文件存储 |
小建议:集成第三方 SDK 时,最好去 AndroidManifest.xml 里扫一遍它声明的权限。如果发现它声明了
READ_CONTACTS 但功能上完全不需要,那就得警觉了。
iOS 常见权限类别
iOS 的权限管理比 Android 更"霸道"——所有隐私权限都必须在 Info.plist 里配上使用说明,而且弹窗只能弹一次,用户拒绝后不会再自动弹。我在 iOS 项目中踩过这个坑:某个 SDK 因为没写 NSCameraUsageDescription,一调用相机就直接闪退。
iOS 常见的隐私权限分类如下:
| 权限类型 | Info.plist 中的 Key | 使用场景示例 |
|---|---|---|
| 定位(使用期间) | NSLocationWhenInUseUsageDescription | 导航、附近推荐 |
| 定位(始终) | NSLocationAlwaysUsageDescription | 后台追踪、运动记录 |
| 相机 | NSCameraUsageDescription | 拍照、扫码 |
| 麦克风 | NSMicrophoneUsageDescription | 录音、语音识别 |
| 通讯录 | NSContactsUsageDescription | 邀请好友、同步联系人 |
| 日历 | NSCalendarsUsageDescription | 日程导入 |
| 提醒事项 | NSRemindersUsageDescription | 待办清单同步 |
| 健康数据 | NSHealthUpdateUsageDescription | 步数、心率同步 |
| 媒体库 | NSAppleMusicUsageDescription | 读取本地音乐 |
| 蓝牙 | NSBluetoothAlwaysUsageDescription | 连接外设 |
关键区别:iOS 要求权限描述文案必须清晰说明"为什么用",而不是笼统地写"用于App功能"。我见过不少被拒审的案例,就是因为描述写得太模糊。