android权限必须用全限定名字符串数组声明,如android.permission.camera;ios需在plist中配置nslocationwheninuseusagedescription等字段;各平台权限文案来源不同,混用将导致审核失败或用户困惑。

manifest.json里Android权限必须用全限定名数组
不配对就真机静默失败,不是报错而是“调了等于没调”。permissions 字段只认字符串数组,不能是对象、不能简写、不能漏前缀。
-
android.permission.CAMERA✅ 正确;CAMERA、camera、"CAMERA"❌ 全部无效 -
android.permission.ACCESS_FINE_LOCATION✅;ACCESS_FINE_LOCATION或location❌ - Android 10+ 还要额外注意:
READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE必须同时声明,否则文件读写在部分机型直接返回空数组或拒绝访问 - 可视化勾选只是生成数组的快捷方式,改完必须重新「发行」或「云打包」,热更新不生效
App端权限说明不能靠uni.authorize的desc字段
App 端(Android/iOS)的权限弹窗文案不由 scope.userLocation.desc 控制,那个字段只对微信小程序生效。App 端真正起作用的是 manifest.json 里平台专属配置。
- Android:权限说明藏在
app-plus.distribute.android.permissions的 XML 字符串里,但实际不显示——系统弹窗文案由系统 ROM 决定,你只能通过plus.android.requestPermissions调用时传入中文提示语(仅部分厂商支持) - iOS:必须在
app-plus.distribute.ios.plist中填写NSLocationWhenInUseUsageDescription或NSLocationAlwaysAndWhenInUseUsageDescription,值为中文,且会被系统直接用于弹窗 - 别在
mp-weixin.permission.scope.userLocation.desc里写 iOS/Android 的说明,它对 App 端完全无影响
用户看到的权限文案其实在三个地方分别控制
同一个“定位”功能,在不同平台、不同触发时机,文案来源完全不同,混用就会导致审核被拒或用户困惑。
- 微信小程序弹窗文案 → 来自
mp-weixin.permission.scope.userLocation.desc,必须具体、不可模板化,如“用于匹配附近3公里内的快递柜” - iOS 首次定位弹窗 → 来自
app-plus.distribute.ios.plist.NSLocationWhenInUseUsageDescription,必须和实际功能一致,否则苹果审核不通过 - Android 启动后首次 requestPermissions 弹窗 → 文案由系统决定,你无法干预;但可在调用前用自定义弹窗说明用途(合规必需),例如:“开启定位后,才能为您推荐附近门店”
- 华为/小米等厂商应用市场审核时,会比对 manifest 中
permissionLocation.prompt字段(如有)与实际业务是否一致,这个字段不是标准,但建议填
别把权限说明当摆设,它直接影响过审和用户点击率
很多团队只填了权限,却没认真写说明,结果被 vivo、OPPO 卡在初审——不是功能不行,是文案太模糊。
- “用于提升用户体验” ❌ 审核必拒
- “获取位置信息以便展示附近服务” ✅ 可过,但最好再加一句:“您可随时在系统设置中关闭”
- 涉及通讯录、相册、录音等高危权限,必须在自定义引导页明确说明用途,并提供隐私政策链接
- Android 端若在
app-plus.distribute.android下写了permissionLocation: { prompt: "用于附近服务推荐" },部分厂商市场会提取该字段做合规校验
最易被忽略的一点:iOS 的 NSLocationAlwaysAndWhenInUseUsageDescription 和 NSLocationWhenInUseUsageDescription 是互斥的,用了后者就不能在后台持续定位;如果业务真需要后台定位,必须申请苹果特殊权限,不能只改 manifest。











