前言
最近使用uniapp开发小程序开发中遇到一个需求,需要小程序持续定位,然后向后台发送实时位置,并且保证微信切换到后台也要持续上传,经过一番文档查询找到解决办法。
一、申请开通相关接口
进入小程序后台管理页面找到开发-开发管理-接口设置,进行申请
一般小程序都会申请开通 wx.getLocation 这个接口,然后我们会在第一次进入小程序时弹出让我们授权位置信息获取。
但是为了实现微信出在后台时我们还需要额外申请其他几个接口,
wx.onLocationChange 用来监听实时地理位置变化事件
wx.startLocationUpdate 开启小程序进入前台时接受位置信息(如果开通前后台的话,一般会用的前后台的,建议开通,服务其他页面需求)
wx.startLocationUpdateBackground 开启小程序进入前后台时均接受位置信息
接口相关-官方文档:位置信息 可以具体查看各接口的使用方法和应用场景
二、代码实现
开发前还需要进行相关配置 打开你的项目找到manifest.json文件,选择源码试图(如果你的编辑器是HBuilderX的情况)找到与小程序相关的配置项
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "wx5c29450db720a284",
"setting" : {
"urlCheck" : false,
"minified" : true,
"es6" : false,
"postcss" : true
},
"usingComponents" : true,
"plugins" : {},
"permission" : { //小程序接口权限相关设置
"scope.userLocation" : { //获取用户位置信息的权限,需要配置
"desc" : "获取用户位置,用于司机签到"
}
},
"requiredBackgroundModes" : [ "location" ], //申明需要后台运行的能力,类型为数组,目前支持audio后台音乐播放,location 后台定位
"requiredPrivateInfos" : [
"getLocation",
"startLocationUpdate",
"onLocationChange",
"startLocationUpdateBackground"
], //在代码中使用申请的地理位置接口 需要在此配置,未申请接口需先申请开通
"lazyCodeLoading" : "requiredComponents"
},
相关配置配置完成后,打开小程序当你获取位置信息时进入设置页面会有三个选择
- 不允许
- 使用小程序时允许
- 使用小程序时和离开后
如果没有第三个选项,需排查是否申请接口,配置文件中是否配置正确
// 获取微信授权弹框
getWxLocation() {
return new Promise((resolve, reject) => {
console.log("定位中...");
// 开启定位追踪
// uni.startLocationUpdateBackground 后台获取位置接口
uni.startLocationUpdateBackground({
success: (res) => {
console.log("开启定位追踪", res);
// 监听位置变化
uni.onLocationChange((data) => {
console.log(data, '位置变化上传');
//获取当前时间
var currentTime = new Date().getTime();
//获取上次执行的时间
var oldTime = uni.getStorageSync("oldTime");
//判断并且间隔时间
// 五分钟执行一次
if (currentTime - oldTime > 1000 * 60 * 5) {
//缓存当前执行的时间
uni.setStorageSync("oldTime", currentTime);
// uni.showToast({title:'上传位置信息',icon:'none'})
//将位置信息上传后台的自己的代码
this.uploadLocation(data);
}
});
resolve();
},
fail: (err) => {
console.log("获取当前位置失败", err);
reject();
},
});
});
},
// 上传位置信息
uploadLocation(data) {
console.log("地址", data);
locationUtils
.getLocationRegeo(`${data.longitude},${data.latitude}`)
.then((addressInfo) => {
const addressComponent = addressInfo.addressComponent;//经纬度转码后信息
let requestData = {} //参数需要上传后台的参数具体根据自己的业务写
methodName(requestData).then((res) => {}); //上传接口
});
},
// 停止获取位置信息
stopUploadLocation() {
uni.stopLocationUpdate({ success: (res) => { }, fail: (error) => { } });
uni.offLocationChange();
},
三、注意事项
- 小程序位置信息的使用如果有特殊的应用场景或需求,必须申请相关接口否则代码中无法使用相关接口
- 申请接口后需要在相关的配置文件中配置(HBuilderX是manifest.json文件中找到关于小程序的配置项)
- 配置完成,相关代码实现完毕,进入小程序后选择引导用户选择第三个选项(即允许小程序在使用时和离开后都可以获取位置)