manifest.json中Android权限必须使用全限定XML字符串,如"android.permission.ACCESS_FINE_LOCATION",配置在app-plus→distribute→android→permissions下,为带引号的字符串数组;iOS权限则需在plist中配置键值对,如NSLocationWhenInUseUsageDescription;各平台权限独立,不可混用。

manifest.json里Android权限必须写全限定XML字符串
Android权限不是填个简写就能用的,android.permission.ACCESS_FINE_LOCATION这种完整字符串必须作为XML标签写进manifest.json,漏掉android.permission.前缀或写成CAMERA、location都会导致真机静默失败。
正确位置在:app-plus → distribute → android → permissions,值是字符串数组,每个元素都是带引号的XML声明:
["<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>"]
- 不能写对象,不能写布尔值,不能省略引号和转义
-
ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION要分开声明,混写会导致定位完全不可用 - Android 10+若需兼容旧存储模型,得额外配
requestLegacyExternalStorage: true,但上架建议直接迁移到Scoped Storage
iOS权限配置必须走plist字段而非permissions数组
iOS不认permissions数组里的Android式写法,它只看app-plus → distribute → ios → plist下的键值对。比如定位权限,得明确写两个字段之一:
-
NSLocationWhenInUseUsageDescription:对应“使用期间允许”,值填中文说明,如"用于查找附近门店" -
NSLocationAlwaysAndWhenInUseUsageDescription:对应“始终允许”,仅限必要场景(如车载类App),否则审核大概率被拒
相机、相册等权限也类似,格式统一为{"camera": {"description": "用于扫码支付"}},键名小写,不能写Camera或PHOTOLIBRARY。
别把AndroidManifest.xml和manifest.json搞混
HBuilderX 3.6+支持手动建AndroidManifest.xml,但绝大多数权限无需这么干——manifest.json已足够覆盖95%场景。强行新建反而容易冲突:
-
AndroidManifest.xml里写的权限,如果manifest.json没同步声明,云端打包时可能被忽略 - 两个文件都写了同一权限,打包日志会报merge conflict,必须删掉一个
- 包名
package属性必须和云端打包配置一致,否则安装失败
除非你要配tools:replace或自定义meta-data,否则老老实实只动manifest.json就行。
微信小程序权限声明和App端完全不通用
同一个manifest.json文件里,requiredPrivateInfos只对微信小程序生效,且必须精准匹配接口名:
- 只调
uni.getLocation,就只能写"getLocation",不能写"get_location"或"uniGetLocation" -
permission.scope.userLocation.desc字段必须存在且非空,华为/小米商店会校验这个文案,空值直接拒审 - App端根本不用
requiredPrivateInfos,写了也没用;反过来,iOS的plist字段在小程序里也无效
最常被忽略的是:不同平台的权限开关是独立的。你在iOS上开了定位,Android设备上照样要重新申请,不能靠一套配置打天下。


















