微信小程序需在manifest.json中配置requiredprivateinfos并申请对应权限,否则onlocationchange等api报错;后台定位需适配多厂商限制,服务端中转位置数据并统一坐标系。

微信小程序平台必须声明 requiredPrivateInfos
不加这行配置,onLocationChange 和 startLocationUpdateBackground 会直接报错,连调用都触发不了。错误信息通常是:wx.onLocationChange need to be declared in the requiredPrivateInfos field。
在 manifest.json 的 mp-weixin 节点下,必须显式列出所有要用的隐私接口:
{
"mp-weixin": {
"requiredPrivateInfos": [
"getLocation",
"onLocationChange",
"startLocationUpdateBackground",
"chooseLocation"
],
"permission": {
"scope.userLocation": {
"desc": "用于实时共享您的位置,便于队友/司机/骑手快速定位"
},
"scope.userLocationBackground": {
"desc": "当小程序退到后台时,仍需持续更新您的位置以保障共享时效性"
}
}
}
}
-
chooseLocation虽然不是实时共享必需,但若页面含“选择目的地”功能,漏掉它会导致该按钮点击无响应 -
scope.userLocationBackground的 desc 文案不能复用前台权限的描述,必须单独写清“后台”场景,否则微信审核大概率驳回 - Android 端部分厂商(如华为、小米)会把
scope.userLocationBackground权限藏在「电池优化白名单」里,仅靠前端申请无法弹窗,得引导用户手动设置
uni.startLocationUpdateBackground 启动失败的常见原因
这个 API 不是“一调就跑”,它依赖前置条件全部满足:用户已授予权限 + 微信基础库版本 ≥ 2.25.0 + 小程序处于可运行状态(非被系统强杀)。
- 调用前必须先用
uni.authorize({scope: 'scope.userLocationBackground'})主动申请,不能只靠uni.getSetting检查状态后就跳过申请步骤 - iOS 上,即使用户点了“始终允许”,首次调用
startLocationUpdateBackground仍可能返回fail:system permission denied——这是系统级延迟,需加 1~2 秒重试逻辑 - 微信开发者工具模拟器不支持后台定位,真机调试时务必关掉「调试基础库版本」的自动降级选项,否则可能卡在 2.23.0 导致 API 不存在
- 启动成功后,
uni.onLocationChange才会真正触发;但首次回调可能延迟 5~15 秒,别把它当成实时毫秒级推送
位置共享必须走服务端中转,不能直连 WebSocket
小程序端无法直接用 uni.connectSocket 对接自建 ws 服务做位置广播,因为微信要求所有 socket 连接必须走 HTTPS/WSS 协议,且域名需提前备案并配置在小程序后台的「业务域名」列表中。
- 客户端每次拿到新位置,应通过
uni.requestPOST 到你自己的 HTTPS 接口(例如/api/v1/location/update),带上openid和经纬度 - 服务端收到后,用 WebSocket 或长连接主动推送给其他在线用户;不要让小程序自己维护连接池或广播逻辑
- 避免在
onLocationChange回调里直接发请求——高频触发(如每 3 秒一次)容易触发微信频率限制,建议加节流(throttle)或合并发送(比如 10 秒内只发最后一次) - 坐标系必须统一:微信默认返回
gcj02,地图组件渲染、服务端存储、其他客户端解析都得保持一致,混用wgs84会导致轨迹偏移 300 米以上
后台定位在 Android 上的实际续航表现
所谓“后台持续定位”,在 Android 上本质是系统级保活+位置服务唤醒,不同厂商策略差异极大,没有银弹方案。
- 小米、OPPO、vivo 默认开启「省电策略」,
startLocationUpdateBackground可能 2~3 分钟后就被系统暂停;必须引导用户去「设置 > 电池与性能 > 自启动管理」手动开启 - 华为 EMUI 12+ 要求额外申请
android.permission.ACCESS_BACKGROUND_LOCATION,且 manifest.json 中需补充android.permission.FOREGROUND_SERVICE,否则后台服务无法注册 - 测试时别只看「是否收得到数据」,更要关注「断连恢复时间」:App 被杀后重新拉起,
onLocationChange是否能自动续上?很多机型需要手动再调一次startLocationUpdateBackground - 真实场景中,后台定位功耗约为前台的 3~5 倍,连续运行 1 小时,中端机型电量下降约 8%~12%,这点必须在用户协议里明确告知











