今天做的一个小程序项目中需要用到scope.userLocation
获取用户地理位置这个权限,这个权限对应两个接口wx.getLocation(Object object)
和wx.chooseLocation(Object object)
,这两个接口都能够获取到用户当前位置的经纬度,但是除此之外,wx.getLocation(Object object)
还能获都速度、高度、经纬度的精确度等更多专业的地理信息;wx.chooseLocation(Object object)
则更加通俗化一些,通过这个接口,我们可以获得具体的地理名称,比如某某街道xx号这样的,看到网上有很多关于获取地理名称的教程是先通过wx.getLocation(Object object)
获取经纬度,再由第三方 API 解析成地理名称,这样未免太麻烦了,可能是不知道wx.chooseLocation(Object object)
的存在。
我的思路是直接调用wx.chooseLocation(Object object)
,如果成功,则在它的回调函数success
中直接获取地理名称,如果失败,则是由于还没有授权造成的,我们就在回调函数fail
中获得授权然后再调用wx.chooseLocation(Object object)
即可,一旦同意授权,除非你删除这个小程序,否则授权的有效性是一直存在的,下次直接调用wx.chooseLocation(Object object)
就能成功回调。这部分代码如下:
wx.chooseLocation({
success: function(res) {
console.log('succes1')
console.log(res)
that.setData({
addr: res.address //调用成功直接设置地址
})
},
fail: function() {
wx.getSetting({
success(res) {
if (!res.authSetting['scope.userLocation']) {
console.log("f1")
wx.authorize({
scope: 'scope.userLocation',
success() {
wx.chooseLocation({
success: function(res) {
that.setData({
addr: res.address //调用成功直接设置地址
})
},
})
console.log('success2')
},
fail(){
console.log("f2")
}
})
}
}
})
}
})
但是,问题来了,这部分代码在电脑开发工具上一直可以按照预期结果运行,可是一旦放到手机上,就千奇百怪,大概一百次只有一次是按照预期结果运行的,其他的全部没有成功调出地图获取用户当前位置(我也好奇为什么会有一次成功???)。我查阅了官方文档,才发现,原来scope.userLocation
这个权限比较特别,必须要在app.json文件中声明这个权限是用来干吗的。如下:
"permission": {
"scope.userLocation": {
"desc": "需要记录打卡时的位置信息"
}
},
注意看下图中的描述就是代码中的 desc
:description
加了之后,症状就解除了。
欢迎留言,欢迎关注微信公众号: 月小水长