同一权限在不同平台覆盖的能力范围并不完全一致
别名: 权限范围差异 · scoped photos · while using location
概念解释
对话框里都写「定位」「相册」「蓝牙」,并不表示各系统打开的是同一组硬件与数据。同名权限的能力范围是平台定义的:一系统的定位曾经连带扫描附近 Wi-Fi 与蓝牙设备,另一系统把定位、蓝牙、附近设备拆成三道门;一系统的相册是整个图库,另一系统可以只许「添加照片」或只许挑中的那几张。把名称对齐就当能力对齐,会在某一端多要,在另一端默默做不到。这条只谈覆盖范围的错位,不谈申请发生在安装时还是使用时,不谈拒了还能不能再问,也不谈跨平台框架如何把状态枚举成同一个值。
机制
权限是操作系统的访问控制表,表项按系统版本演进,不按产品经理的功能清单演进。相册在一个系统上是读全部媒体,在另一个系统上拆成读图、读视频、有限选择、仅追加;「允许」在两端点下去,一端能做智能分类,一端只能写入新拍的那张。定位的「使用期间」与「始终」、「精确」与「模糊」也不是每个系统都有同一套档位:缺档位的那一端,应用要么升级到更宽的权限,要么功能降级。蓝牙更典型:为了扫附近配件,一端要蓝牙权限,一端历史上走定位。从后者移植到前者的产品继续要定位,人看到的是「手电筒应用要我的位置」,拒绝之后配件功能坏了,双方都觉得对方不合理。范围错位发生在授权表,不发生在文案润色。
边界
同一系统的连续大版本之间范围也会改(图库从全量改为选择器),不能把「Android 对 iOS」当成唯一的错位轴,还要按已声明支持的最低版本画表。仅在一端存在的能力(某系统的跟踪透明度、某系统的文件树访问)没有可对齐的同名项,应对齐的是用户任务,不是权限名字。WebView 或小程序里再套一层宿主权限,覆盖范围是宿主的,不是内嵌页自己的清单。桌面把文件系统当默认可用时,不存在「相册权限」这种表项,移动端的范围表不能直接贴过去。
怎么落地
- 为每个用户任务列一张平台能力表:完成「扫附近配件」「从相册选一张图」在各系统分别要哪些权限、各权限实际打开哪些 API,禁止只写一个权限名。
- 某一端范围更窄时,把功能降到该端实际打开的能力(用系统选择器而不是遍历图库),不要用名称相同的宽权限去补。
- 验证:在两个系统上授予同名的「相册」或「定位」后,列出产品实际调用的 API。若一端在遍历全库而另一端只拿到选择器返回的单项,范围已经分叉——界面说明和失败提示必须按端分开写。