收藏
回答

wx.getLocation 一直fail?,频繁调用会增加电量损耗...

errMsg: "getLocation:fail 频繁调用会增加电量损耗,可考虑使用 wx.onLocationChange 监听地理位置变化",

今日开始一直报这个问题正式环境没有,只有测试环境有这样的问题。有人遇到这样的问题吗?怎样解决?

最后一次编辑于  2021-03-09
回答关注问题邀请回答
收藏

13 个回答

  • 理想
    理想
    2021-08-05

    我遇到的问题是:wx.onLocationChange(function callback)

    以 Promise 风格 调用:不支持

    由于直接调用,用时可能还没有返回经纬度,所以记录了一个时间戳,然后判断小于30秒,则从 Storage 里返回,大于执行 wx.getLocation,30 秒是因为 wx.getLocation 报错就是 30 秒

    我的解决办法:

    //utils 文件夹下创建 location.js 文件 代码如下:
    //思路:
    //1. 在utils文件价下创建一个函数,其它要调用位置的地方就引入这个文件,然后执行导出的函数名。
    //2. 在函数开始时,打开wx.startLocationUpdate,打开成功后,执行wx.onLocationChange 将实时位置写到 Storage 里,并记录时间戳
    //3. 每次调用位置函数判断时间戳与当前时间是否小于 30 秒,如果小于,直接从Storage 里返回,大于 30 秒则执行 wx.getLocation
    
    // 1.获得位置信息
    async function getLocation() {
      let that = this;
    
      // 1.开启实时位置获取
      // 判断 wx.onLocationChange 是否在实时获取位置,如果没有则去 wx.getLocation 获取位置
      // wx.startLocationUpdate 开启小程序进入前台时接收位置消息
      let startGetLocation = await wx.startLocationUpdate({})
        .then(res => {
          return true;
        })
        .catch(err => {
          console.log('获取位置信息错误:', err);
          return false;
        });
    
    
      // 2. 如果开启可以实时获取位置,则开始获取实时位置
      if (startGetLocation == true) {
        const _locationChangeFn = function (res{
          // // 展示本地存储能力,写
          // wx.setStorageSync('globalLatitude', res.latitude)
          try {
            wx.setStorageSync('globalLatitude', res.latitude)
          } catch (e) {}
          try {
            wx.setStorageSync('globalLongitude', res.longitude)
          } catch (e) {}
          try {
            wx.setStorageSync('changeLocationTime'Date.now())
          } catch (e) {}
        }
        // 监听实时地理位置变化事件
        wx.onLocationChange(_locationChangeFn) //要传入函数
        //  wx.offLocationChange(_locationChangeFn) 本函数放到 page 的onHide 函数里
      };
    
    
      // 如果位置信息 30 秒内有更新过则不执行wx.getLocation,直接 return,因为坐标已经比较真实了。
      let changeLocationTime = wx.getStorageSync('changeLocationTime')
      // 时间戳是毫秒,1000毫秒等于1秒,所以要除以1000再减
      if (changeLocationTime && Date.now()/1000 - changeLocationTime/1000<30) {
        return;
      };
    
    
      //3. 执行 wx.getLocation 获取经纬度
      await wx.getLocation({
          type'gcj02 ',
        })
        .then(res => {
          try {
            wx.setStorageSync('globalLatitude', res.latitude)
          } catch (e) {}
          try {
            wx.setStorageSync('globalLongitude', res.longitude)
          } catch (e) {}
          return;
        })
        .catch(err => {
          console.log('获取位置坐标失败:', err)
          if (err.errMsg === 'getLocation:fail auth deny') {
            wx.showModal({
              cancelColor'cancelColor',
              cancelText'取消',
              confirmColor'confirmColor',
              confirmText'去授权',
              content'位置授权已被拒绝!',
              showCanceltrue,
              title'提醒',
              success(res) => {
                if (res.confirm === true) {
                  // that.bindOpenSetting();
                };
              },
              fail(res) => {},
              complete(res) => {},
            });
          };
        })
    };
    
    
    
    
    //将自定义函数暴露出来
    //形式为    对外使用的函数名:本函数里定义的函数名
    module.exports = {
      getLocation2: getLocation,
    };
    
    


    // 需要调用的页面,比如 index.js
    
    // 代码结构
    //import {
    //  getLocation2
    //} from '../../utils/location';
    //let globalLatitude;
    //let globalLongitude;
    //page({
    //函数 getLocation
    //getLocation:async function(){
    //}
    //})
    
    // 1.import
    //在 page({ })上面一行写 import
    import {
      getLocation2
    } from '../../utils/location';
    
    //2.申明页面的全局变量,在 page({ })上面一行写 
    let globalLatitude;
    let globalLongitude;
    
    page({
    // 3.执行函数,在wxml 用 bindtap="getLocation" 调用函数
    // 由于小程序审核时,如果用户才登录就要授权位置,会不通过,所以,建议这个函数放在用户需要触发的时候再触发,不能放在onLoad(),onShow,onReady等函数里,比如我的,写了一个按钮叫:计算距离
    // <view bindtap="getLocation">计算距离</view>
    
    getLocation:async function(){
      await getLocation2();
      // 4. 展示本地存储能力,读,获取经纬度
            try {
              globalLatitude = wx.getStorageSync('globalLatitude')
              globalLongitude = wx.getStorageSync('globalLongitude')
              if (!globalLatitude && !globalLongitude) {
                wx.showToast({
                  title: '获取位置失败',
                  icon: 'none',
                  image: '',
                  duration: 3000,
                  mask: false,
                });
              };
            } catch (e) {
              // Do something when catch error
              wx.showToast({
                title: '获取位置失败',
                icon: 'none',
                image: '',
                duration: 3000,
                mask: false,
              });//showToast 结束
            };//catch 结束
      }//getLocation结束
     })//page({})结束  
    
    2021-08-05
    有用 1
    回复
  • Schnuffel
    Schnuffel
    2021-05-24

    wx.onLocationChange 开发工具不会触发,增加了开发难度

    2021-05-24
    有用 1
    回复
  • 梦无忧思
    梦无忧思
    2021-03-09

    帮忙看一下呀,本地测试 15 s内重复调用获取地理位置就会报错,考虑一下引用三方库导致的重复调用嘛,尽快处理一下吧

    2021-03-09
    有用 1
    回复
  • 皇胜
    皇胜
    2022-02-25

    我在调用高德逆地址转换api,系统报错,wx.getLocation 一直fail?,频繁调用会增加电量损耗...

    我查看逆地址转换中 高德、百度、腾讯云,都是使用wx.getLocation获取经纬度的。这种情况怎么办?




    2022-02-25
    有用
    回复
  • 闸蟹
    闸蟹
    2021-04-29

    同问,体验版出现这个情况,正式版的不会

    2021-04-29
    有用
    回复 4
  • 休言
    休言
    2021-04-29

    体验版也出现这种情况了

    2021-04-29
    有用
    回复 3
    • 社区技术运营专员-Jahozheng
      社区技术运营专员-Jahozheng
      2021-04-29
      当前小程序频繁调用wx.getLocation接口会导致用户手机电量消耗较快,请开发者改为使用持续定位接口wx.onLocationChange,该接口会固定频率回调,使用效果与跟频繁调用getLocation一致。
      从基础库2.17.0版本起(预计发布时间2021.4.9),将对getLocation接口增加频率限制,包括:
      在开发版或体验版中,30秒内调用getLocation,仅第一次有效,剩余返回fail。
      正式版中,为保证小程序正常运行同时不过度消耗用户电量,一定时间内(根据设备情况判断)调用getLocation,仅第一次会返回实时定位信息,剩余返回与第一次定位相同的信息。
      未做好兼容调整可能会影响用户体验,请开发者尽快适配。
      具体请参考社区公告https://developers.weixin.qq.com/community/develop/doc/000aee91a98d206bc6dbe722b51801
      2021-04-29
      回复
    • 休言
      休言
      2021-04-30回复社区技术运营专员-Jahozheng
      我用了,为什么出现这样的错误:{errMsg: "startLocationUpdate:ok"}?
      2021-04-30
      回复
    • 子慧
      子慧
      2021-06-09
      解决了吗,我也出现了 {errMsg: "startLocationUpdate:ok"}
      2021-06-09
      回复
  • 等等羊
    等等羊
    2021-04-28

    我的今天测试环境,突然开始报这个错误,线上正常,提交会不会受影响


    2021-04-28
    有用
    回复 1
    • d
      d
      2021-04-30
      请问修改好了吗
      2021-04-30
      回复
  • smartzheng
    smartzheng
    2021-03-09

    急需解决方案

    2021-03-09
    有用
    回复
  • 木头
    木头
    2021-03-09

    就换成wx.onLocationChange呗,wx.onLocationChange是不能用还是咋的

    2021-03-09
    有用
    回复 1
    • 2023-07-23
      精度有很大问题
      2023-07-23
      回复
  • Healthy
    Healthy
    2021-03-09

    持续关注中

    2021-03-09
    有用
    回复

正在加载...

登录 后发表内容
问题标签