小程序收貨地址的獲取

提出

小程序自帶了一個獲取地址的 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);
              },
            });
          },
        });
      }
    },
  });
}

這樣問題就解決了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章