提出
小程序自帶了一個獲取地址的 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
分析完了以上三種情況,我們就可以根據這三種情況其分別進行處理,最後得到獲取地址的完美解決方案
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);
},
});
},
});
}
},
});
}
這樣問題就解決了