uni-app启动时权限弹窗由manifest.json或androidPrivacy.json中权限配置触发,非代码调用决定;需删permissions数组、改用细粒度控制,并确保androidPrivacy.json存在且mode为"afterAuth",真机验证隐私协议与系统弹窗不叠加。

uni-app启动时权限弹窗是怎么被触发的
不是你写了uni.getLocation就一定会弹,而是 manifest.json 里声明了权限、又没做延迟控制,系统在首次启动时就会自动拉起系统级弹窗。尤其当配置了"permissions"数组(比如含ACCESS_FINE_LOCATION或CAMERA),部分安卓厂商(vivo、小米)会直接在冷启动阶段集中触发——这和你代码里有没有调用无关,是安装时注册权限后的默认行为。
manifest.json里必须改掉的两个关键配置
删掉或注释掉所有直接写在"permissions"数组里的敏感权限声明;改用细粒度控制节点:
-
"permissionExternalStorage": { "request": "none" }—— 关闭存储权限自动申请 -
"permissionPhoneState": { "request": "none" }—— 防止READ_PHONE_STATE被提前拉起 - 如果用了
uni-push,确保"push": { "type": "unipush" }下没开启autoInit,否则它会在onLaunch里偷偷触发通知权限
androidPrivacy.json比manifest.json更优先
很多开发者改了manifest.json却没生效,是因为项目根目录存在androidPrivacy.json,它会完全覆盖前者。这个文件必须存在且结构正确:
{
"version": "1",
"privacy": {
"prompt": "template",
"mode": "afterAuth"
},
"permission": {
"request": "none"
}
}
注意:version字段不能缺;mode: "afterAuth"才是让权限申请滞后于隐私协议的关键开关;文件路径必须是项目根目录,不是static或unpackage下。
真机测试前最容易漏掉的三件事
模拟器通常不触发这套逻辑,以下三点必须在真机上验证:
- 首次安装后打开App,只看到隐私协议弹窗,**没有第二个系统弹窗叠在上面**(常见冲突:隐私弹窗还没点完,
uni.getLocation已在后台触发) - 用户拒绝隐私协议后,调用
plus.runtime.quit()—— 不是跳转页面,也不是uni.navigateBack - 进入具体功能页(如拍照上传)再点按钮,才第一次见到系统相机权限弹窗;此前
uni.getSystemInfoSync()这类非敏感API仍可正常执行
权限不是越晚申请越好,而是要卡在用户明确意图的那一刻。冷启动阶段连主界面都还没渲染完,就弹定位或通讯录权限,审核不过只是时间问题。


















