小程序收货地址的获取

提出

小程序自带了一个获取地址的 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);
              },
            });
          },
        });
      }
    },
  });
}

这样问题就解决了

发布了61 篇原创文章 · 获赞 15 · 访问量 4057

猜你喜欢

转载自blog.csdn.net/qq_44162474/article/details/104849218