微信小程序后台持续获取位置信息

3,264 阅读3分钟

前言

最近使用uniapp开发小程序开发中遇到一个需求,需要小程序持续定位,然后向后台发送实时位置,并且保证微信切换到后台也要持续上传,经过一番文档查询找到解决办法。

一、申请开通相关接口

  • 进入小程序后台管理页面找到开发-开发管理-接口设置,进行申请

  • 一般小程序都会申请开通 wx.getLocation 这个接口,然后我们会在第一次进入小程序时弹出让我们授权位置信息获取。

  • 但是为了实现微信出在后台时我们还需要额外申请其他几个接口,

  1. wx.onLocationChange 用来监听实时地理位置变化事件

  2. wx.startLocationUpdate 开启小程序进入前台时接受位置信息(如果开通前后台的话,一般会用的前后台的,建议开通,服务其他页面需求)

  3. wx.startLocationUpdateBackground 开启小程序进入前后台时均接受位置信息

接口相关-官方文档:位置信息 可以具体查看各接口的使用方法和应用场景

1-1.png

二、代码实现

开发前还需要进行相关配置 打开你的项目找到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"
    },

相关配置配置完成后,打开小程序当你获取位置信息时进入设置页面会有三个选择

  1. 不允许
  2. 使用小程序时允许
  3. 使用小程序时和离开后

1-2.jpg

如果没有第三个选项,需排查是否申请接口,配置文件中是否配置正确

  // 获取微信授权弹框
  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();
  },

三、注意事项

  1. 小程序位置信息的使用如果有特殊的应用场景或需求,必须申请相关接口否则代码中无法使用相关接口
  2. 申请接口后需要在相关的配置文件中配置(HBuilderX是manifest.json文件中找到关于小程序的配置项)
  3. 配置完成,相关代码实现完毕,进入小程序后选择引导用户选择第三个选项(即允许小程序在使用时和离开后都可以获取位置)