【微信小程序】后台位置信息wx.onLocationChange使用&&应用&&ios息屏问题

前言

监听实时地理位置变化事件,需结合 wx.startLocationUpdateBackgroundwx.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,打开设置页。
    background-location

2). 需要授权 scope.userLocationscope.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 开始支持,低版本需做兼容处理。

参数:

属性类型说明最低版本
latitudenumber纬度,范围为 -90~90,负数表示南纬
longitudenumber经度,范围为 -180~180,负数表示西经
speednumber速度,单位 m/s
accuracynumber位置的精确度
altitudenumber高度,单位 m1.2.0
verticalAccuracynumber垂直精度,单位 m(Android 无法获取,返回 0)1.2.0
horizontalAccuracynumber水平精度,单位 m1.2.0

问题说明

  1. 对于 百度到的ios息屏wx.onLocationChange不记录的问题:
  • 软硬件:

    • 手机:iPhone12
    • 系统:14.8.1
  • 真机调试:

    • 在手机屏幕点亮期间一直正常;
    • 当手机息屏后onLocationChange没有被触发;
    • 在锁屏状态下点亮屏幕后又开始触发,再次息屏后又不触发了

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

  1. 对于其他对经纬度有特殊需求的:
  • 根据时间记录:在onLocationChange出发后判断时间间隔决定是否记录即可;
  • 根据距离记录:判断当前点与上一个点的经纬度是否相同或者是否达到一定距离进行记录,不同在往后执行
  • speed 速断判断:当前点速度与上一点速度差是否合理 / 或者当前点速度为 0 不记录
  • 等距离判断:当前点与上一点之间的距离是否合理,是否存在拉直线状况,可自行根据实际情况与需求判断
  • 返回值精度: accuracy 暂无精度范围,官方暂无明确说明,可自行测试找符合自己需求的范围值(反正我是暂时是没有用精度判断)Android 无法获取垂直精度(verticalAccuracy),返回 0
  • 对于从高楼定位的问题,如十几层或二十几层甚至更高层楼坐电梯下来前后定位坐标偏差大,可参考以上四点
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值