前言
监听实时地理位置变化事件,需结合 wx.startLocationUpdateBackground、wx.startLocationUpdate使用。
1. app.json设置权限信息
{
"requiredBackgroundModes": ["location"],
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
},
}
2. 位置授权 wx.authorize:
官方推荐:在真正需要使用授权接口时,才向用户发起授权申请,并在授权申请中说明清楚要使用该功能的理由。
- 开发者可以使用 [wx.authorize](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/authorize/wx.authorize.html) 在调用需授权 API 之前,提前向用户发起授权请求。
- 开发者可以调用 [wx.openSetting](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/wx.openSetting.html) 打开设置界面,引导用户开启授权。
注意事项
1). wx.authorize({scope: "scope.userInfo"})
,不会弹出授权窗口,请使用 :
- 安卓
8.0.0
,iOS 8.0.0
起,若开发者未通过wx.authorize({scope: 'scope.userLocation'})
请求过位置权限,支持通过wx.authorize({scope: 'scope.userLocationBackground'})
唤起后台使用地理位置授权窗口。 - 低于以上版本,
scope.userLocationBackground
不会弹窗提醒用户。需要用户在设置页中,主动将“位置信息”选项设置为“使用小程序期间和离开小程序后”。开发者可以通过调用wx.openSetting,打开设置页。
2). 需要授权 scope.userLocation
、scope.userLocationBackground
时必须配置地理位置用途说明。
3. SHOW ME CODE:
getAuth(){
const that = this;
wx.getSetting({
success(res) {
// 如果没有拿到scope.userLocationBackground授权,提示
if (!res.authSetting['scope.userLocationBackground']) {
wx.authorize({
scope: 'scope.userLocationBackground',
success() {
// 用户已经同意,调用wx.startLocationUpdateBackground
wx.startLocationUpdateBackground({
success(res) {
// 成功开启后台定位, 调用实时位置变更
that.openLocaionListener()
},
fail(res) {
wx.showToast({
title: '开启后台定位失败',
})
}
})
}
})
} else {
// 已经拿到scope.userLocationBackground授权调用
wx.startLocationUpdateBackground({
success(res) {
// 成功开启后台定位,
that.addMarker()
},
fail(res) {
wx.showToast({
title: '开启后台定位失败',
})
}
})
}
}
})
},
_locationChangeFn: function(res){
console.log("location change", (new Date()).toString(), time++, res)
// 在这里可以根据自己的需求,视情况进行位置信息操作
},
openLocaionListener: function(){
wx.onLocationChange(_locationChangeFn) // 开始监听位置变化
},
closeLocaionListener: function(){
wx.offLocationChange(_locationChangeFn) // 关闭监听位置变化
}
参数说明:
wx.onLocationChange(function callback)
基础库 2.8.1 开始支持,低版本需做兼容处理。
参数:
属性 类型 说明 最低版本 latitude number 纬度,范围为 -90~90,负数表示南纬 longitude number 经度,范围为 -180~180,负数表示西经 speed number 速度,单位 m/s accuracy number 位置的精确度 altitude number 高度,单位 m 1.2.0 verticalAccuracy number 垂直精度,单位 m(Android 无法获取,返回 0) 1.2.0 horizontalAccuracy number 水平精度,单位 m 1.2.0
问题说明
- 对于 百度到的ios息屏
wx.onLocationChange
不记录的问题:
-
软硬件:
- 手机:
iPhone12
- 系统:
14.8.1
- 手机:
-
真机调试:
- 在手机屏幕点亮期间一直正常;
- 当手机息屏后
onLocationChange
没有被触发; - 在锁屏状态下点亮屏幕后又开始触发,再次息屏后又不触发了
但是!!! 你每次地理位置变化的经纬度都被记录了,在屏幕点亮的时候,
onLocationChange
会触发多次将息屏时的位置信息都返回给你!!!如果有需要时间间隔记录经纬度的需求,只能通过对经纬度距离、速度判断,然后进行划分。
- 对于其他对经纬度有特殊需求的:
- 根据时间记录:在onLocationChange出发后判断时间间隔决定是否记录即可;
- 根据距离记录:判断当前点与上一个点的经纬度是否相同或者是否达到一定距离进行记录,不同在往后执行
- speed 速断判断:当前点速度与上一点速度差是否合理 / 或者当前点速度为 0 不记录
- 等距离判断:当前点与上一点之间的距离是否合理,是否存在拉直线状况,可自行根据实际情况与需求判断
- 返回值精度: accuracy 暂无精度范围,官方暂无明确说明,可自行测试找符合自己需求的范围值(反正我是暂时是没有用精度判断)Android 无法获取垂直精度(verticalAccuracy),返回 0
- 对于从高楼定位的问题,如十几层或二十几层甚至更高层楼坐电梯下来前后定位坐标偏差大,可参考以上四点