持续定位必须用 uni.startLocationUpdate + uni.onLocationChange,轮询 uni.getLocation 无效;uni.getLocation 不返回地址,需调用逆地理编码;type 必须为 'gcj02';微信小程序需配置 manifest 权限并正确引导授权;App 后台定位需原生插件支持。

直接调用 uni.getLocation 只能拿一次坐标,持续定位必须用 uni.startLocationUpdate + uni.onLocationChange,否则 iOS 会限频、Android 会被系统挂起,轮询 uni.getLocation 是无效方案。
uni.getLocation 拿不到地址?别硬拼字符串
调用 uni.getLocation 后,res.address 一定是 undefined——这个字段只在 uni.chooseLocation 或部分 App 端配置三方 SDK(如高德/百度)后才可能返回。不要在 success 回调里写 "北京市朝阳区" + res.latitude 这类硬编码逻辑。
-
type参数必须设为'gcj02'(国内地图标准),若传'wgs84'再直接喂给高德 API,坐标会偏移几百米 - 需要真实地址,得自己调高德或腾讯的逆地理编码接口,传入
res.latitude和res.longitude - H5 平台不支持
geocode: true,App 和小程序平台也需额外配置 SDK 才能启用该参数
微信小程序持续定位必须配 manifest.json 权限
没配 requiredPrivateInfos 和 permission,uni.startLocationUpdate 会静默失败,控制台无报错,但 uni.onLocationChange 根本不触发。
- 在
manifest.json的mp-weixin节点下补全以下三项: "requiredPrivateInfos": ["getLocation", "onLocationChange", "startLocationUpdateBackground"]-
"scope.userLocation"和"scope.userLocationBackground"的desc字段不能空或模糊,例如「用于实时记录配送员轨迹」比「位置服务」更容易过审 - 必须先成功调用
uni.startLocationUpdate,再注册uni.onLocationChange,顺序反了监听器收不到任何数据
用户拒绝授权后,uni.authorize 不会再弹窗
第一次点击“拒绝”,uni.authorize({ scope: 'scope.userLocation' }) 后续调用直接走 fail,且不会再次唤起授权弹窗——这是微信强制机制,不是 bug。
- 检测权限要用
uni.getSetting,检查res.authSetting['scope.userLocation']是否为true - 若为
false或undefined,应立即uni.showModal提示,并在 confirm 后调uni.openSetting -
uni.openSetting的 success 回调里,必须再次调uni.getSetting确认状态,因为用户可能点了「取消」而非「允许」
后台定位在息屏/切后台后失效?原生插件是唯一稳定解
微信小程序不支持真正的后台持续定位(startLocationUpdateBackground 仅限 App 端),而 App 端仅靠 JS 定时器轮询 uni.getLocation,在 Android 息屏后大概率被系统终止,在 iOS 上则根本无法通过审核。
- App 端必须用原生插件,如
Ba-LocationAMap或uni-plugin-location,它们封装了 ForegroundService(Android)和 UIBackgroundModes(iOS)底层能力 - Android 需在
manifest.json中声明ACCESS_BACKGROUND_LOCATION和WAKE_LOCK权限 - iOS 需配置
UIBackgroundModes: ["location"],且描述文案要具体,更新频率建议 ≥5 分钟,否则审核易被拒
真正难的不是写几行代码,而是权限链路上每一步都得对:manifest 配置、用户授权引导、后台保活机制、坐标系转换、逆地理编码调用——漏掉任意一环,定位就会在某个机型、某种场景下彻底失灵。











