小程序:展示,获取,选择地址

微信小程序对于地址的三种处理。

  • wx.openLocation:展示所处地址
  • wx.getLocation():获取当前地址
  • wx.chooseLocation():打开地图选择地址

wx.openLocation:使用微信内置地图查看位置。

  • 不需要授权。
  • 可以跳转导航APP进行导航。
wx.openLocation({
    latitude: this.latitude,
    longitude: this.longitude,
    name: this.name,           // 名称
    address: this.address,    // 地址
    scale: 28
});
查看位置.png

wx.getLocation() :获取当前的地理位置、速度。

  • 调用前需要用户授权 scope.userLocation
  • type 默认 wgs84 坐标,返回 gps 坐标, type 为 gcj02 返回可用于 wx.openLocation的坐标。
    wx.getLocation({
      type: 'gcj02', // 返回可以用于wx.openLocation的经纬度
      success(res) {
        const latitude = res.latitude
        const longitude = res.longitude
        wx.openLocation({
          latitude,
          longitude,
          scale: 18
        });
      }
    });
第一次请求位置时会出现的弹窗.png

最近这个接口有了新的要求,要先在 app 配置说明。

微信客户端 7.0.0 及以上版本支持

app的配置

desc 会在弹窗的标题下作为说明。


desc出现在以往的标题下作为说明.png

详细公告:https://developers.weixin.qq.com/community/develop/doc/000ea276b44928f7e8d73d0a65b801?idescene=7&op=1

但有时候用户拒绝了授权,这样的话,你再次进入的话就不会弹出弹窗了,如果你还想再次请求授权的话,就要用到 wx.getSetting

wx.getSetting:获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限
要注意是,请求过的权限,不是用户所有的权限。

wx.getSetting({
  success(res) {
    console.log(res.authSetting);
    // 具体API的授权字段见权限页面
    // res.authSetting = {
    //   "scope.userInfo": true,
    //   "scope.userLocation": true
    // }
  }
})

既然用 wx.getSetting 获取到用户已经授权过的权限。如果用户拒绝授权,"scope.userInfo": false,若是 "scope.userInfo": true,则用户授权成功。
而用户没有申请过位置的授权的话,则scope.userInfo 不会出现在 res 里。

如果用户拒绝授权后,要想再次打开授权窗口,就要用到wx.openSetting
wx.openSetting:调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限

在用户没有申请过授权的情况下,不能调用此接口,因为授权页面不会出现你想要但用户没有申请过的授权接口。


用户申请过的接口列表.png

以下是申请定位功能的代码:

wx.getSetting({
    success(res) {
        console.log('get-setting', res.authSetting);
        // 只返回用户请求过的授权
        let auth = res.authSetting;
        if (auth['scope.userLocation']) {
            // 已授权,申请定位地址
            that.getUserLocation();
        } else if (auth['scope.userLocation'] === undefined) {
            // 用户没有请求过的授权,不需要我们主动弹窗,微信会提供弹窗
            that.getUserLocation();
        } else if (!auth['scope.userLocation']) {
            // 没有授权过,需要用户重新授权
            // 这个弹窗是为了实现点击,不然openSetting会失败
            wx.showModal({
                title: '是否授权当前位置?',
                content: '需要获取您的地理位置,请确认授权,否则定位功能将无法使用',
                success: res => {
                    if (res.confirm) {
                        wx.openSetting({
                            success(res) {
                                console.log('open-setting-suc', res.authSetting);
                                let setting = res.authSetting;
                                if (!setting['scope.userLocation']) {
                                    wx.showToast({
                                        title: '地址授权失败,定位功能无法使用',
                                        icon: 'none',
                                    });
                                } else {
                                    // 地址授权成功,申请定位地址
                                    that.getUserLocation();
                                }
                            },
                            fail(err) {
                                // 需要点击,有时候没有点击,是无法触发openSetting
                                console.log('open-setting-fail',err);
                            }
                        });
                    }
                }
            });
        } 
    }
});

async getUserLocation () {
    let res = await wepy.getLocation();
    this.longitude = res.longitude;
    this.latitude = res.latitude;
    this.$apply();
} 

wx.chooseLocation:打开地图选择位置。

  • 调用前需要用户授权 scope.userLocation。
  • wx.getLocation()的权限字段一样,都是scope.userLocation
  • 返回位置名称,详细地址,gcj02 坐标。
  • wx.getLocation() 的代码大同小异

wx.chooseLocation需要用户授权成功后才能调用成功。

以用户当前位置为中心的地图,也可以搜索具体地点

具体授权表:


在wx.getSetting的返回可见请求过的权限.png

授权具体做法:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html

你可能感兴趣的:(小程序:展示,获取,选择地址)