微信小程序 getLocation:fail 频繁调用会增加电量损耗

昨天在开发微信小程序的时候出现了个问题,是这样的:
我需要获取定位信息,传给后端,获取范围内的订单,接单之前也需要再次获取定位获取最新定位信息和自己的信息一起传递过去
结果就出现了这样的情况:

我就蒙了!我就去查看官方文档了:
官方传送门
文档是这么写的


我们去看相关公告
相关公告传送门

简而言之就是
1.在基础库2.17.0版本以上 都会对wx.getLocation进行限制
2.开发和体验版30秒内调用有效,30秒内会返回错误
3.对正式版不会报错,只不过30秒内返回的数据还是第一次获取的数据

面对上面的公告来说,如果你不用频繁调用wx.getLocatio获取定位来说还是可以使用的,就比如初始化 为了获取所在地理位置

这个限制无论是使用上还是测试的时候都是很不友好的

所以说我们就需要用官方提供的另一个方法 wx.onLocationChange

让我们看一下文档

大致意思就是 可以实时监听地理位置变化 传递的数据是一个回调函数 用于接收改变后的地理信息,还需结合 wx.startLocationUpdate使用。
简单理解就是 我需要先打开定位监听wx.startLocationUpdate 这样就可以监听到 使用wx.onLocationChange传递的回调函数接收值,如果不需要的话就用
wx.offLocationChange 关闭定位监听

为了提高代码复用率我们把这个获取定位的功能封装成模块吧

首先我们需要新建一个js文件
我们就叫
location.js放在你想放在的地方
先定义一个函数方法
我们这里叫做authorization并且导出,在里面写一个try-catch用于做错误的处理(这里的错误一般来说是没有开权限导致的)

export const authorization = () => {try{//运行定位  }catch{//处理错误 没有开定位权限的处理}
}

我们定义一个方法用于获取定位(主要的函数) 叫做getWxLocation

const getWxLocation = () => {//提示定位中wx.showLoading({title: '定位中...',mask: true,})//运用promise 同步接收获取的值return new Promise((resolve, reject) => {//定义接收定位信息的函数let _locationChangeFn = (res) => {//当监听到了定位信息的数据console.log('location change', res)//返回定位数据resolve(res)wx.hideLoading()//关闭监听wx.offLocationChange(_locationChangeFn)}//开启定位服务wx.startLocationUpdate({type: 'gcj02',success: (res) => {//开启成功后启动监听 传递回调函数wx.onLocationChange(_locationChangeFn)},fail: (err) => {console.log('获取当前位置失败', err)wx.hideLoading()//返回错误reject()}})})
}

把这个函数放在刚开始的那个函数里
这里使用async - await 异步转同步

export const authorization = async () => {try{//运行定位函数//把定位信息return出去return await getWxLocation();}catch{//处理错误 没有开定位权限的处理}
}

定义没有开定位权限的函数

const toSetting = () => {return new Promise((resolve, reject) => {//调起客户端小程序设置界面,返回用户设置的操作结果wx.openSetting({success(res) {console.log(res)if (res.authSetting["scope.userLocation"]) {// res.authSetting["scope.userLocation"]为trueb表示用户已同意获得定位信息,此时调用getlocation可以拿到信息let locationRes = await getlocation()resolve(locationRes)}},fail(err) {reject()}})})
}

放在主函数里

export const authorization = async () => {try{//运行定位函数//把定位信息return出去return await getWxLocation();}catch{//处理错误 没有开定位权限的处理wx.showModal({title: '温馨提示',content: '获取权限失败,需要获取您的地理位置才能为您提供更好的服务!是否授权获取地理位置?',success: function (res) {if (res.confirm) {//这里是点击了确定以后console.log('用户点击确定')toSetting()} else {//这里是点击了取消以后console.log('用户点击取消')}}})}
}

调用就是引入

const { authorization } = require('../../../utils/location')

使用

  let res = await authorization()console.log(res)

这样就可以了,不会做限制!!

完整代码

//这个函数是一开始点击事件触发的:
export const authorization = async () => {try {return await getWxLocation() //等待} catch (error) {wx.showModal({title: '温馨提示',content: '获取权限失败,需要获取您的地理位置才能为您提供更好的服务!是否授权获取地理位置?',success: function (res) {if (res.confirm) { //这里是点击了确定以后console.log('用户点击确定')toSetting()} else { //这里是点击了取消以后console.log('用户点击取消')}}})return}
}const getWxLocation = () => {wx.showLoading({title: '定位中...',mask: true,})return new Promise((resolve, reject) => {let _locationChangeFn = (res) => {console.log('location change', res)// Storage.set('userLocation', res)resolve(res)wx.hideLoading()wx.offLocationChange(_locationChangeFn)}wx.startLocationUpdate({type: 'gcj02',success: (res) => {console.log(res);wx.onLocationChange(_locationChangeFn)},fail: (err) => {console.log('获取当前位置失败', err)wx.hideLoading()reject()}})})
}
const toSetting = () => {return new Promise((resolve, reject) => {//调起客户端小程序设置界面,返回用户设置的操作结果wx.openSetting({success(res) {console.log(res)if (res.authSetting["scope.userLocation"]) {// res.authSetting["scope.userLocation"]为trueb表示用户已同意获得定位信息,此时调用getlocation可以拿到信息let locationRes = await getWxLocation()resolve(locationRes)}},fail(err) {reject()}})})
}


点个关注支持一下我吧

微信小程序 wx.getLocation:fail 频繁调用会增加电量损耗相关推荐

  1. 微信小程序wx.getLocation()报错以及解决方法

    问题介绍 使用wx.getLocation()来获取当前地理位置的经纬度 主要代码如下: wx.getLocation({success: function(res) {//经度let lat = r ...

  2. 企业微信小程序wx.qy.login 的调用调试踩坑

    企业微信小程序wx.qy.login 的调用调试踩坑 起步 在企业微信的开发过程中有很多坑,一切以企业微信开发文档为准. 近期我公司项目需要我联调开发企业微信小程序,以前没开发过,所以一切只能跟着企业 ...

  3. 微信小程序wx.getLocation接口审核不通过

    审核不通过的原因一般包含这几种: 一.当前提审小程序代码包中地理位置相关接口( wx.getLocation )暂未开通 分析原因:接口未开通. 解决方法:按下图申请开通对应的接口即可. 二.你所描述 ...

  4. 微信小程序wx.switchTab

    [转]关于微信小程序wx.switchTab的问题 昨天做了个功能要从首页跳到tabBar页,并且要带上参数.首先我是这样做的: 在index.js中: toCategory:function(eve ...

  5. 微信小程序服务器开小差了,微信小程序wx.request请求封装

    微信小程序 wx.request RequestTask wx.request(Object object)发起 HTTPS 网络请求. 示例代码 wx.request({ url: 'test.ph ...

  6. 微信小程序 wx.request 的封装

    自学转行到前端也已近两年,也算是简书和掘金的忠实粉丝,但是以前一直惜字如金(实在是胆子小,水平又低),现在我决定视金钱如粪土(就只是脸皮厚了,水平就那样),好了废话不多说,切入主题,最近自己尝试了一下 ...

  7. 微信小程序wx.compressImage的坑

    微信小程序wx.compressImage的坑 如何使用 第二个坑 如何使用 微信小程序api官网写的是这个 wx.compressImage({ src: '', // 图片路径 quality: ...

  8. 获取微信小程序wx.login 生成的code

    微信小程序获取用户信息需要调用微信内置都wx.login()方法,这个方法会生成一个时效很短的code,通过微信另外都接口,使用code作为参数我们可以获得用户的openid.unionid等信息,然 ...

  9. 微信小程序wx.downloadFile()使用体验

    微信小程序wx.downloadFile()使用体验 想给单位做一个小程序,实现模板文件下载的功能,方便办事群众把文件下载到手机上自行打印填写,也能提高办事效率. 不过想法是好的,截止目前2018年1 ...

最新文章

  1. CSDN博文中完美地去掉图片水印、调整图片位置和大小
  2. request对象方法详解
  3. 《JavaScript高级程序设计 第3版》-学习笔记-1
  4. QT5 动态链接库的创建和使用
  5. Defend Your Country
  6. Linux学习总结(11)——Linux文件查找
  7. python自动登录qq空间_python 利用splinter组件,自动登录QQ空间
  8. atop用法_linux高级监控atop的使用
  9. Memento 备忘录 快照模式 MD
  10. ffmpeg编码视频总结
  11. Java使用Executor执行Callable任务时的几种方法
  12. 分布式系统中Topology(Rack) Awareness的实现思路
  13. Flume 数据采集
  14. 用matlab做二阶电路分析,MATLAB绘制二阶电路响应
  15. nginx的平滑升级
  16. 为什么《请回答1988》能被称为神剧
  17. Mysql中删除语句delete、truncate、drop的区别
  18. 微信小程序,学习笔记(三)微信小计算器
  19. mysql修改字段类型语句
  20. Java 套接字(Socket)

热门文章

  1. win10 中 建立网络映射盘符(虚拟盘符)
  2. 关于java空指针报错(NullPointException)
  3. 旗舰对飙、高端死磕,2019下半年手机圈好看了
  4. 软件测试面试受挫?——我整理了一份超全面试题详解
  5. JDBC——连接mysql的报错处理(Mysql8.0以上的报错处理)
  6. 操作系统之内存管理总结——进来背书
  7. pytorch深度学习保姆级笔记--gpu环境配置
  8. 计算机二级考试word没做完,计算机二级ms office是的Excel没做完会扣几分,太心急了,求求哪个告诉我???...
  9. IOS疯狂基础之键盘挡住输入框
  10. Android开发笔记-Vincent