背景

很多时候做商城类型或者本地服务类型的小程序,需要获取用户当前定位,这个权限已经变得很普遍

场景

  1. 代码中写了获取定位,但是没有弹出获取定位的授权框。

  2. 定位获取授权框弹出了点击没反应 (新)

  3. 获取定位授权成功了,但是没有返回0,且没有报错

解决方案

场景一

  1. 原因:其中可能主要原因是用户进入小程序没有确认隐私条款,有的场景就会业务代码执行了,把隐私条款页面调走了,这个时候没有同意隐私就会导致无法弹出小程序所有的功能组。

  2. 方案:进入小程序第一件事就是授权,先检查授权情况,没授权的直接跳到授权页面 ,授权的在进入,这样不影响原来的业务

checkPrivacy() {
      console.log("可用隐私授权:", wx.canIUse('getPrivacySetting'))
      if (!wx.canIUse('getPrivacySetting')) {
        return
      }
      return new Promise((resolve, reject) => {
      wx.getPrivacySetting({
          success: res => {
              console.log("是否需要授权:", res.needAuthorization, "隐私协议的名称为:", res.privacyContractName)
              if (res.needAuthorization) {
                  wx.reLaunch({
                      url: '/pages/common/privacy',
                  })
              } else{
                  resolve()
              }
          }
          complete: (res) => { 
              console.log("是否需要授权:", res)
          },
          })
      });
  },

场景二

  1. 原因:我遇到的场景是进入到地址选择页面,会自动focus让用户输入他当前地址,后面加上了根据当前定位自动选择先选到一个位置。在之前版本这个是不冲突的,在2024年11月初头,安卓版本就会因为focus后输入法弹窗 导致在授权框上一层,但是显示上又是授权框在上面。点通过、拒绝都没有反应;ios能够正常,模拟器无法模拟出输入法弹窗导致问题很难被发现。

  2. 方案:进入页面取消focus,在获取定位失败以后再设置focus,优化用户体验

场景三

  1. 原因:存在于所有授权定位都开了,但是单app的定位权限在手机系统限制了,这个拿不到定位或者拿到的是0,也没有进入fail。

  2. 方案:这个时候判断lng和lat是不是为空或0,一样进入到fail的逻辑中,为了代码简洁性,可以抽离出一个方法给失败的场景调用