评论

开发微信运动轨迹小程序后台位置信息遇到的问题与梳理

开发微信运动轨迹小程序后台位置信息遇到的问题与梳理

监听实时地理位置变化事件,需结合 wx.startLocationUpdateBackground、wx.startLocationUpdate使用。wx.onLocationChange 监听前后台位置信息变化设置及在息屏状态下不记录。

注意事项:

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 时必须配置地理位置用途说明。


实现代码:

wx.startLocationUpdateBackground({
    success(res) {
        // 成功开启后 去调用位置监听 wx.onLocationChange(_locationChangeFn)
        that.addMarker()
    },
    fail(res) {
        // 如果没有选择使用时和离开后 可以通过 wx.openSetting 打开设置手动授权
        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) // 关闭监听位置变化
}


真机调试:

在手机屏幕点亮期间一直正常;

当手机息屏后onLocationChange没有被触发;

在锁屏状态下点亮屏幕后又开始触发,再次息屏后又不触发了

但是! 你每次地理位置变化的经纬度都被记录了,在屏幕点亮的时候,onLocationChange会触发多次将息屏时的位置信息都返回给你!如果有需要时间间隔记录经纬度的需求,只能通过对经纬度距离、速度判断,然后进行划分。


对于其他对经纬度有特殊需求的:

根据时间记录:在onLocationChange出发后判断时间间隔决定是否记录即可;

根据距离记录:判断当前点与上一个点的经纬度是否相同或者是否达到一定距离进行记录,不同在往后执行;

speed 速断判断:当前点速度与上一点速度差是否合理 / 或者当前点速度为 0 不记录;

等距离判断:当前点与上一点之间的距离是否合理,是否存在拉直线状况,可自行根据实际情况与需求判断;

返回值精度:accuracy 暂无精度范围,官方暂无明确说明,可自行测试找符合自己需求的范围值(反正我是暂时是没有用精度判断)Android 无法获取垂直精度(verticalAccuracy),返回 0;

对于从高楼定位的问题,如十几层或二十几层甚至更高层楼坐电梯下来前后定位坐标偏差大,可参考以上四点;


原因梳理:

亮屏正常,但息屏不记录,可能原因:

小程序未开启选择使用时和离开后 ,所以只在亮屏时才记录;

手机设置中 微信 =》应用权限 =》位置信息 =》需要设置为 始终允许;

手机通话过程中不记录 需查看是否开通或支持VoLTE ==》部分手机 (如华为等一些老版型号的手机,现在大部分新型号手机都是支持的);

部分手机 型号 虽然以上都设置了但仍然没有记录 ,可能手机出于安全信息考虑不允许微信在后台获取位置信息 =》此暂无解决方法;

已记录,无效、重复或有偏差,偏差很大等;


判断当前点与上一个点的经纬度是否相同,不同在往后执行;

speed 速断判断 =》当前点速度与上一点速度差是否合理 / 或者当前点速度为 0 不记录等;

距离判断 =》当前点与上一点之间的距离是否合理,是否存在拉直线状况,可自行根据实际情况与需求判断;

返回值精度 accuracy 暂无精度范围,官方暂无明确说明,可自行测试找符合自己需求的范围值(反正我是暂时是没有用精度判断)Android 无法获取垂直精度(verticalAccuracy),返回 0;

对于从高楼定位的问题,如十几层或二十几层甚至更高层楼坐电梯下来前后定位坐标偏差大,可参考以上四点;



使用wx.startLocationUpdateBackground锁屏,采集会中断?

问题描述:

1、不锁屏的情况,采集频率都是6s左右;

2、锁屏后,采集频率会开始无规律, 有时相差7分钟,有时20多秒, 但是还是会采集;

3、当重新激活手机,采集频率马上又回复6s的采集频率;

4、锁屏后出现的采集问题是否能优化, 或者有什么其他方法代替;

5、采集频率是否可以修改,自己设置;

这个与手机性能系统都有关了,熄屏的话情况太多了,杀死都有可能。

锁屏继续采集经纬度的,还是其他方案吗?

没有,一般这种需求都让它不锁屏,可以设置屏幕常亮。

最后一次编辑于  03-07  
点赞 2
收藏
评论

4 个评论

  • 曾记
    曾记
    09-13

    这个接口是否一定要认证后才能使用

    09-13
    赞同
    回复 1
  • a
    a
    05-22

    楼主您好,为什么我使用WX.GetSetting这个函数时,在判断if (result.authSetting.ContainsKey("scope.userInfo") || result.authSetting["scope.userInfo"]) 这里 微信开发者工具就会报这个错:KeyNotFoundException: The given key 'scope.userInfo' was not present in the dictionary. 

    05-22
    赞同
    回复 1
    • 姑苏洛言
      姑苏洛言
      05-23
      你打印看看
      05-23
      回复
  • Arvin
    Arvin
    03-19

    reportRealtimeAction:fail not support 我这个昨天还好好的,今天就爆了这个错误

    03-19
    赞同
    回复 6
    • 姑苏洛言
      姑苏洛言
      03-19
      (⊙﹏⊙)
      03-19
      回复
    • Arvin
      Arvin
      03-19回复姑苏洛言
      可能是用的 uni.getLocation方法获取位置上传,因为后台说只要开启轨迹不管用户动不动 都要上传
      03-19
      回复
    • Arvin
      Arvin
      03-19回复姑苏洛言
      必须用这个wx.onLocationChange(function listener) 结合 startLocationUpdateBackground啊,不然方法不走
      03-19
      回复
    • 姑苏洛言
      姑苏洛言
      03-21回复Arvin
      肯定的
      03-21
      回复
    • Arvin
      Arvin
      03-21回复姑苏洛言
      如果用户关闭小程序或者无意间断开了定位,你们怎么检测重新开启啊
      03-21
      回复
    查看更多(1)
  • Arvin
    Arvin
    03-12

    你们用的跑腿 申请的 对应接口权限吗

    03-12
    赞同
    回复 3
    • 姑苏洛言
      姑苏洛言
      03-12
      是的
      03-12
      回复
    • Arvin
      Arvin
      03-28回复姑苏洛言
      你这个scope.userLocationBackground 接口 怎么在隐私协议写啊?我写的 收集您的位置信息 用于提供轨迹服务
      03-28
      回复
    • 姑苏洛言
      姑苏洛言
      03-28回复Arvin
      也是差不多
      03-28
      回复
登录 后发表内容