微信小程序开发——使用高德地图小程序插件获取citycode及异常处理
前言:
微信官方提供的小程序API获取定位没有cityCode返回,需要使用腾讯地图或者高德地图等第三方地图的插件获取。
刚好公司有开通高德地图服务,这里就直接用高德地图的微信小程序插件获取定位信息了。
示例代码:
1 /** 2 * 获取当前城市 3 * 1. 用户授权,则保存city_code、user_lng、user_lat到缓存 4 * 2. 用户拒绝授权,则弹出开启定位提示弹窗,提示用户手动授权,如用户点“不需要”,则缓存标志,后续不在弹出 5 * callback:获取定位后的回调函数,所以这里无论是保存缓存还是获取,都要进行同步处理 6 */ 7 var amapFile = require('~/utils/amap-wx.130') 8 let getLocation = function (callback) { 9 //如果已经缓存city_code或用户明确拒绝授权,那么不在获取位置信息 10 if (wx.getStorageSync('getLocationFailAuthDeny') || wx.getStorageSync('city_code')) return; 11 var self = this 12 //初始化高德地图 13 var myAmapFun = new amapFile.AMapWX({ 14 key: 'xxxxxxxxxxxxxxxxxx' 15 }); 16 //获取地址描述信息 17 myAmapFun.getRegeo({ 18 success: function (data) { 19 let { 20 regeocodeData, 21 longitude, 22 latitude 23 } = data[0]; 24 let addressComponent = regeocodeData.addressComponent; 25 let citycode = addressComponent.citycode; 26 wx.setStorageSync('city_code', citycode) 27 wx.setStorageSync('user_lng', longitude) 28 wx.setStorageSync('user_lat', latitude) 29 if (callback) callback() 30 }, 31 fail: function (info) { 32 if (info.errMsg === 'getLocation:fail auth deny') { 33 //未授权定位,提示开启定位(用户点击不需要,则缓存标志,后边不在检查是否开启定位授权) 34 if (!wx.getStorageSync('getLocationFailAuthDeny')) { 35 wx.showModal({ 36 title: "温馨提示", 37 content: "获取位置信息失败,为了给您提供更好的服务,请前往开启小程序定位", 38 confirmText: "去开启", 39 cancelText: "不需要", 40 success(res) { 41 //不要再这里写,会出现部分机型点取消无效 42 }, 43 fail(e) { 44 //不要再这里写,会出现部分机型点取消无效 45 }, 46 complete(res) { 47 if (res.confirm) { 48 //因前边获取授权失败已经返回授权失败(getLocation:fail auth deny),所以这里就不再调用wx.getSetting()了 49 wx.openSetting({ 50 success(res) { 51 if (!res.authSetting["scope.userLocation"]) { 52 wx.toast("获取位置信息失败") 53 } 54 } 55 }) 56 } else if (res.cancel) { 57 //wx.toast("获取位置信息失败") 58 wx.setStorageAsync('getLocationFailAuthDeny', true) 59 } 60 } 61 }) 62 } 63 } else { 64 wx.showModal({ 65 title: info.errMsg, 66 }) 67 } 68 } 69 }) 70 }
异常处理:
获取定位都是需要用户授权的,小程序中一旦拒绝授权,就会有缓存,后续就不会再弹出(我的小程序中删掉小程序再重新访问才会弹出)。
调用高德地图获取位置信息,如果用户拒绝授权,则返回信息:
{errCode: "0", errMsg: "getLocation:fail auth deny"}
下次再访问就不会再弹窗,依然会返回这个信息,那么可以依据这个信息,确定是否需要提醒用户手动开启授权。
1. 如果一定要用户授权获取位置才可以提供服务,那就在获取用户位置信息失败后弹出弹窗提示(隐藏取消按钮,用户只能点击按钮去开启定位授权才能继续访问)。
示例代码如下:
1 if (info.errMsg === 'getLocation:fail auth deny') { 2 //未授权定位,提示开启定位(用户点击不需要,则缓存标志,后边不在检查是否开启定位授权) 3 wx.showModal({ 4 title: "温馨提示", 5 content: "获取位置信息失败,为了给您提供更好的服务,请前往开启小程序定位", 6 confirmText: "去开启", 7 showCancel: "false", 8 complete(res) { 9 //因前边获取授权失败已经返回授权失败(getLocation:fail auth deny),所以这里就不再调用wx.getSetting()了 10 wx.openSetting({ 11 success(res) { 12 if (!res.authSetting["scope.userLocation"]) { 13 wx.toast("获取位置信息失败") 14 } 15 } 16 }) 17 } 18 }) 19 }
2. 如果非必须,那么,也可以在用户拒绝授权之后,直接设置一个默认的cityCode。
3. 如果还要考虑用户误点拒绝,那就弹出来一次手动开启定位的提示弹窗,如果用户明确拒绝授权,那就缓存标志,后续不在弹窗提示用户授权。
个人原创博客,转载请注明来源地址:https://www.cnblogs.com/xyyt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2019-04-11 css选择器的优先级