小程序
小游戏
企业微信
微信支付
扫描小程序码分享
errMsg: "getLocation:fail 频繁调用会增加电量损耗,可考虑使用 wx.onLocationChange 监听地理位置变化",
今日开始一直报这个问题正式环境没有,只有测试环境有这样的问题。有人遇到这样的问题吗?怎样解决?
13 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
我遇到的问题是: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: '位置授权已被拒绝!', showCancel: true, 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({})结束
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
wx.onLocationChange 开发工具不会触发,增加了开发难度
帮忙看一下呀,本地测试 15 s内重复调用获取地理位置就会报错,考虑一下引用三方库导致的重复调用嘛,尽快处理一下吧
我在调用高德逆地址转换api,系统报错,wx.getLocation 一直fail?,频繁调用会增加电量损耗...
同问,体验版出现这个情况,正式版的不会
体验版也出现这种情况了
我的今天测试环境,突然开始报这个错误,线上正常,提交会不会受影响
急需解决方案
就换成wx.onLocationChange呗,wx.onLocationChange是不能用还是咋的
持续关注中
正在加载...
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
我遇到的问题是: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: '位置授权已被拒绝!', showCancel: true, 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({})结束
wx.onLocationChange 开发工具不会触发,增加了开发难度
帮忙看一下呀,本地测试 15 s内重复调用获取地理位置就会报错,考虑一下引用三方库导致的重复调用嘛,尽快处理一下吧
我在调用高德逆地址转换api,系统报错,wx.getLocation 一直fail?,频繁调用会增加电量损耗...
我查看逆地址转换中 高德、百度、腾讯云,都是使用wx.getLocation获取经纬度的。这种情况怎么办?
同问,体验版出现这个情况,正式版的不会
体验版也出现这种情况了
从基础库2.17.0版本起(预计发布时间2021.4.9),将对getLocation接口增加频率限制,包括:
在开发版或体验版中,30秒内调用getLocation,仅第一次有效,剩余返回fail。
正式版中,为保证小程序正常运行同时不过度消耗用户电量,一定时间内(根据设备情况判断)调用getLocation,仅第一次会返回实时定位信息,剩余返回与第一次定位相同的信息。
未做好兼容调整可能会影响用户体验,请开发者尽快适配。
具体请参考社区公告https://developers.weixin.qq.com/community/develop/doc/000aee91a98d206bc6dbe722b51801
我的今天测试环境,突然开始报这个错误,线上正常,提交会不会受影响
急需解决方案
就换成wx.onLocationChange呗,wx.onLocationChange是不能用还是咋的
持续关注中