其实我使用这个挨批之前用的是wx.getLocation
可是很无奈,产品的需求是要从首页点进去的时候获取一次用户坐标,可是如果用户频繁点击在真机上就会出现获取不到的情况,会报以下的错误,如下图所示
//这个函数是一开始点击事件触发的:
async authorization() {
let self = this
try {
await this.getWxLocation()//等待
} catch (error) {
Model({
title: '温馨提示',
tip: '获取权限失败,需要获取您的地理位置才能为您提供更好的服务!是否授权获取地理位置?',
showCancel: true,
confirmText: '前往设置',
cancelText: '取消',
sureCall() {
self.toSetting()
},
cancelCall() {}
})
return
}
},
getWxLocation() {
wx.showLoading({
title: '定位中...',
mask: true,
})
return new Promise((resolve, reject) => {
let _locationChangeFn = (res) => {
console.log('location change', res)
Storage.set('userLocation', res)
this.getList();
wx.hideLoading()
wx.offLocationChange(_locationChangeFn)
}
wx.startLocationUpdate({
success: (res) => {
console.log(res);
wx.onLocationChange(_locationChangeFn)
resolve()
},
fail: (err) => {
console.log('获取当前位置失败', err)
wx.hideLoading()
reject()
}
})
})
},
toSetting() {
let self = this
wx.openSetting({
success(res) {
console.log(res)
if (res.authSetting["scope.userLocation"]) {
// res.authSetting["scope.userLocation"]为trueb表示用户已同意获得定位信息,此时调用getlocation可以拿到信息
self.authorization()
}
}
})
},
思路主要是这样的:首先事件触发authorization函数,等待getWxLocation函数里面的结果处理,看文档知道在调用onLocationChange前先调用startLocationUpdate
成功之后,在回调里面就可以调用onLocationChange去监听实时地理位置变化(注意:目前只有真机开启调试模式打印才能看到返回的坐标等参数,电脑调试暂时不行)
获取之后要记得关闭实时监听wx.offLocationChange(_locationChangeFn),不然就会一直去获取坐标,可能会导致手机耗电严重。
如果是startLocationUpdate是失败回调的话:就去调用wx.openSetting申请用户的定位权限(scope.userLocation):参考文档
开启成功后就去再调一次authorization获取实时定位就好了!