最近需求允许小程序打开地图位置来选择详细地址。貌似wx.chooseLocation()可以实现。很自信的就进行开发。开发完在手机上测试bug来了。苦逼的开启翻阅开发文档。。。
踩坑一:
wx.chooseLocation()获取地理位置。授权弹窗是否允许获取地理位置,点击不允许,发现接下来的n此触发都不会在弹起授权弹窗,直接fail。原来不卸载小程序,此时小程序不会再次弹起授权弹窗。了。
解决办法:在fail里面自定义弹窗,引导用户授权。
踩坑二:
自定义引导用户进行授权,让用户开启允许地理位置。发现开发工具和手机上还不一样。。what?
手机上的显示只有一个用户信息,没有开启地理位置按钮。。
开发工具上很完美的可以开启地理位置按钮。。
原来是:app.json里面加上配置:
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
}
主代码实现逻辑用户点击事件触发:
第一步检测用户有没有授权wx.getSetting(),没有授权就发起授权请求wx.authorize(),此时会出现弹窗:如果点击允许就会进入地图进行选择,如果点击不允许就授权失败,小程序只会做一次授权,接下来的n此触发都会直接进入fail,不会再次出现弹窗。
为了更好的用户体验只能做一个模拟弹窗引导客户重新开启授权。此时用户可以取消或者确定,当选择确定的时候就会重新授权。。。
此时调用wx.openSetting()打开地理位置就ok啦,然后就会自动弹出选择地图,大功告成。。
代码块:
wx.getSetting({
success(res) {
console.log('res是否开启授权', res)
if (!res.authSetting['scope.userLocation']) {
wx.authorize({
scope: 'scope.userLocation',
success() {
// console.log('前用户发起授权请求')
wepy.chooseLocation({
success: res => {
console.log('打开地图选择位置确定', res)
},
fail: res => {
console.log('打开地图选择位置取消', res)
}
})
},
fail() {
// 用户点击不允许引导重新获取授权
that.fetchAgainLocation()
}
})
} else {
// 已经授权了就会直接进入地图
wepy.chooseLocation({
success: res => {
console.log('打开地图选择位置确定', res)
},
fail: res => {
console.log('打开地图选择位置取消', res)
}
})
}
}
})
wx.openSetting()引导客户再次授权
fetchAgainLocation() {
let that = this
wx.getSetting({
success: (res) => {
var statu = res.authSetting;
if (!statu['scope.userLocation']) {
wx.showModal({
title: '是否授权当前位置',
content: '需要获取您的地理位置,请确认授权,否则地图功能将无法使用',
success: (tip) => {
if (tip.confirm) {
wx.openSetting({
success: (data) => {
if (data.authSetting["scope.userLocation"] === true) {
wx.showToast({
title: '授权成功',
icon: 'success',
duration: 1000
})
wx.chooseLocation({
success: res => {
console.log('打开地图选择确定', res)
}
})
} else {
wx.showToast({
title: '授权失败',
icon: 'success',
duration: 1000
})
}
},
fail: () => {},
complete: () => {}
});
}
}
})
}
},
fail: ()=>{},
complete: ()=>{}
})
}
过程是痛苦的,结果是甜甜的。。