微信小程序开发——使用高德地图小程序插件获取citycode及异常处理

发布时间 2023-04-11 17:12:23作者: 逍遥云天

前言:

微信官方提供的小程序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. 如果还要考虑用户误点拒绝,那就弹出来一次手动开启定位的提示弹窗,如果用户明确拒绝授权,那就缓存标志,后续不在弹窗提示用户授权。