小程序 wx.authorize 之 scope.userLocation 授权错误

今天做的一个小程序项目中需要用到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

小程序 wx.authorize 之 scope.userLocation 授权错误_第1张图片

加了之后,症状就解除了。

你可能感兴趣的:(小程序)