App端定位权限需用plus.android.requestPermissions(Android)或plus.ios.requestPermission(iOS)原生API,不可用uni.authorize;manifest.json须分平台配置权限,且需检查系统级位置开关。

直接调用 uni.authorize 请求 scope.userLocation 在 App 端大概率失败或静默无反应——Android/iOS 的权限机制和微信小程序完全不同,不能复用同一套逻辑。
App端权限检查必须用 plus.android.requestPermissions(Android)或 plus.ios.requestPermission(iOS)
uni-app 的 uni.getSetting 在 App 端返回的 authSetting 是空对象或不可靠,它只对小程序平台有效。App 端需走 5+ Runtime 原生能力:
- Android 必须先调用
plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'], ...),不能跳过这步直接uni.getLocation - iOS 需调用
plus.ios.requestPermission('location', ...),且首次调用会触发系统级弹窗(含“始终允许”/“仅使用期间”选项) - 两者都需在
manifest.json → app-plus → permissions中正确声明,Android 还要区分ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION,混写会导致定位完全失效 - 注意:
plus.*API 在 HBuilderX 调试时可能不生效,必须真机运行才能触发权限弹窗
uni.getLocation 失败后不能重试 authorize,而应判断错误码并跳转系统设置
当 uni.getLocation 返回失败时,err.code 是关键依据:
-
err.code === 1002:表示用户已拒绝且勾选“不再询问”,此时uni.authorize不会再弹窗,必须引导手动设置 - Android 可用
plus.android.startActivity({action:'android.settings.APPLICATION_DETAILS_SETTINGS',uri:'package:'+plus.runtime.appid})跳转到本应用权限页 - iOS 没有等效跳转,只能弹
uni.showModal提示用户去「设置 → 隐私与安全性 → 定位服务」中开启,并确保你的 App 条目是「始终」或「使用期间」 - 别依赖
err.message做判断,不同厂商 ROM 返回文案差异极大(如小米返回“用户拒绝”,华为可能返回空字符串)
manifest.json 中 Android 和 iOS 权限配置不能共用一套写法
App 端权限不是靠 permission 字段控制的,manifest.json 里必须分平台配置:
- Android 权限写在
distribute.android.permissions下,格式为字符串数组:["<uses-permission android:name='\"android.permission.ACCESS_FINE_LOCATION\"/'>"]</uses-permission>,注意是 XML 字符串,不是对象 - iOS 权限写在
distribute.ios.plist的NSLocationWhenInUseUsageDescription或NSLocationAlwaysAndWhenInUseUsageDescription字段,值是中文提示语(审核必需) - 若把 iOS 的 plist 配置误写进 Android 分支,或把 Android 的 XML 写成 JSON 对象,打包后定位功能会彻底不可用,且无任何报错提示
- HBuilderX 2.9.10+ 支持可视化配置,但建议仍核对源码,避免 UI 编辑器漏掉字段
最常被忽略的一点:App 端的定位精度严重依赖系统级开关。即使代码全对、权限全开,若手机「位置服务」总开关关闭,或「高精度定位」(GPS+Wi-Fi+基站)被禁用,uni.getLocation 返回的坐标误差可能达数百米——这不是代码问题,得提醒用户检查系统设置。











