微信小程序对于地址的三种处理。
-
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
});
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
});
}
});
最近这个接口有了新的要求,要先在 app 配置说明。
微信客户端 7.0.0 及以上版本支持
desc 会在弹窗的标题下作为说明。
详细公告: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
:调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限。
在用户没有申请过授权的情况下,不能调用此接口,因为授权页面不会出现你想要但用户没有申请过的授权接口。
以下是申请定位功能的代码:
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
需要用户授权成功后才能调用成功。
具体授权表:
授权具体做法:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html