提出
小程序自带了一个获取地址的 api wx.chooseAddress
,使用该方法便可获取收货地址,但这个方法却有一些小bug, 在某些情况下,将不能获取地址的信息,具体是什么小 bug呢
分析
实现一个如上图的按钮,为其添加点击事件
事件如下
handleChooseAddress() {
wx.chooseAddress({
success: (result)=>{
console.log(result);
wx.setStorageSync("address", result);
},
fail: ()=>{},
complete: ()=>{}
});
}
点击该按钮会出现如下界面,这时候就会问你是否同意获取通讯地址
记下面的步骤为步骤一
情景一:点击确定
如果你点击确定,会出现这样一个页面
这个时候如果点击右上方的确定,则会将地址打印到控制台上(说明一下,这个地址是默认地址,每个人在模拟器上获取地址都会出现这个,所以不必在意)
如果你在这一步点击了取消,重新点击获取地址的按钮也没事,照样能正常打印出地址信息
情景二:点击取消
如果你在这一步点击了取消按钮,再重新获取地址信息,你会发现,控制台上将不会打印处地址信息,无论你试多少次
如何解决
在分析如何解决之前我们先来看另外一个 apl wx.getSetting
获取用户的当前设置,该 api 会返回小程序已经向用户请求过的权限
通过这个 apl 我们就可以获取 小程序所授予获取地址的权限状态(scope),下面来看一下关于获取地址的三种情况
// 根据用户权限的状态进行判断获取地址
handleChooseAddress() {
// wx.chooseAddress({
// success: (result)=>{
// console.log(result);
// },
// });
wx.getSetting({
success: (result)=>{
console.log(result);
},
});
}
第一种情况
当我们在步骤一中点击确定
我们会发现 scope.address 这个值为 true
第二种情况
当我们在步骤一中点击取消时,将其结果打印在控制台上
我们会发现 scope.address 这个值为 false
第三种情况
用户就没有请求获取过用户地址
我们会发现没有 scope.address 这个值,即就是这个值为 undefined
扫描二维码关注公众号,回复:
9916630 查看本文章
分析完了以上三种情况,我们就可以根据这三种情况其分别进行处理,最后得到获取地址的完美解决方案
handleChooseAddress() {
wx.getSetting({
success: (result1)=>{
let scopeAddress = result1.authSetting["scope.address"];
if(scopeAddress === true || scopeAddress === undefined) {
wx.chooseAddress({
success: (result2)=>{
console.log(result2);
},
});
} else {
wx.openSetting({
success: (result1)=>{
wx.chooseAddress({
success: (result2)=>{
console.log(result2);
},
});
},
});
}
},
});
}
这样问题就解决了