想要获取当前位置,大前提:1、微信允许访问位置信息,2、手机定位开启
所以,我们进入小程序时,要获取位置,需要考虑权限问题。
怎样才能在每次进入都获取,并且大部分用户进入 执行的代码更少?怎样避免每次每人都执行所有的代码?
考虑:
1、既然每次都要获取经纬度,那么获取位置方法必须。同时,老用户,绝大部分情况是微信授权过的,至于新用户,反正都是得执行一遍。所以,我进入后直接获取位置经纬度。
2、如果获取经纬度失败,那么有两种情况,一个是微信位置没有授权,一个是定位没开。
我这里,优先判断微信位置授权,siteAuthoriza 标识授权,初始化为null,通过 微信 getSetting方法校验权限之后 赋值 true 或 false分别标识允许否。siteAuthoriza一旦不等于null,代表已经校验过权限了。
- 先获取经纬度
getUserLocation() {
const that = this
wx.getLocation({
type: 'wgs84',
success(res) {
console.log('res----获取到了经纬度', res)
...
},
fail(error) {
console.log(error, '----------error------------')
// 失败 大部分两种情况
// 1、微信授权成功后调用此方法 siteAuthoriza 标识微信地址授权 true 但是 手机定位没打开
// 2 微信地址授权拒绝,或者拒绝过。若拒绝过短期内不会出弹窗
if (that.data.siteAuthoriza === true) {
that.openPhoneSetting() // 去打开手机设置 用户手动
} else { // 校验微信授权
that.getAuthorizaInfo(1)
}
}
})
}
- 获取位置失败,校验微信授权
(这个授权校验方法,两个地方会调用,1、获取位置经纬度失败 2、进入微信授权页之后返回当前页-onShow)
// noPhoneSite 值 1 标识 获取经纬度失败时调用 无值或值null标识 从微信授权页返回调用校验
getAuthorizaInfo(noPhoneSite) {
//查看设置是否允许获取地理位置
const that = this
wx.getSetting({
success(res) {
if (!res.authSetting['scope.userLocation']) {
//已拒绝授权--显示授权弹出层 点击 手动打开微信设置
this.setData({
siteAuthoriza: false
})
// 可以是弹窗或其他,需用户手动触发
...
} else {
//已授权啦
that.setData({
siteAuthoriza: true // 标识微信授权过了
})
if (noPhoneSite) {// 已授权 但获取位置失败 需手动打开手机定位
that.openPhoneSetting() // 弹窗提示打开手机定位
return
}
// 微信授权后 校验确实授权过,重新获取微信信息
that.getUserLocation()
}
}
})
},