微信小程序在用户拒绝授权后无法使用wx.opensetting再次获取定位授权

javascript 复制代码
 _getLocation(callback,errCall) {
      if (app.globalData.isLocationIng) {
        setTimeout(() => {
          this._getLocation(callback);
        }, 100);
        return;
      }
      app.globalData.isLocationIng = true;
      wx.getSetting({
        success: (resData) => {
          // 检查永久拒绝状态
          if (resData.authSetting["scope.userLocation"] === false) {
            app.globalData.isLocationIng = false;
            errCall && errCall({ type: 'permanent_deny' });
            return;
          }

          if (!resData.authSetting["scope.userLocation"]) {
            wx.authorize({
              scope: "scope.userLocation",
              success: () => this._getlocaldata(callback, errCall),
              fail: () => {
                // 新增:首次拒绝处理
                if (!this.data.hasTriggeredSetting) {
                  this.setData({ hasTriggeredSetting: true });
                  wx.showModal({
                    title: '位置信息授权申请',
                    content: 'xxx为了给您更好的xx服务,我们需要您的授权',
                    confirmText: '去授权',
                    cancelText: '残忍拒绝',
                    success: (res) => {
                      if (res.confirm) {
                        wx.openSetting({
                          success: (settingdata) => {
                            if (settingdata.authSetting["scope.userLocation"]) {
                              this._getlocaldata(callback);
                            } else {
                              app.globalData.isLocationIng = false;
                              errCall && errCall({ type: 'permanent_deny' });
                            }
                          }
                        });
                      } else {
                        app.globalData.isLocationIng = false;
                        errCall && errCall({ type: 'permanent_deny' });
                      }
                    }
                  });
                } else {
                  app.globalData.isLocationIng = false;
                  errCall && errCall({ type: 'permanent_deny' });
                }
              }
            });
          } else {
            this._getlocaldata(callback, errCall);
          }
        },
        fail: (msgData) => {
          console.log(msgData);
          app.globalData.isLocationIng = false;
        }
      });
    },
    _getlocaldata(callback,errCall) {
      if (wx.getStorageSync("address-point")) {
        let point = wx.getStorageSync("address-point").point;
        this._setaddressData({
          lat: point.lat,
          lng: point.lng,
          from: 'storage'
        },
        callback
        );
      } else {
        wx.getLocation({
          type: "gcj02",
          isHighAccuracy: true,
          success: (res) => {
            const latitude = res.latitude;
            const longitude = res.longitude;
            // const speed = res.speed;
            // const accuracy = res.accuracy;
            this._setaddressData({
              lat: latitude,
              lng: longitude,
            },
            callback
            );
          },
          fail: (err) => {
            if (err.errMsg === "getLocation:fail auth deny") {
              console.log("当初用户拒绝,再次发起授权");
              //此方法无用,因为微信不允许在异步回调中直接调用 wx.openSetting,必须由用户主动触发(如点击按钮),所以直接在_getLocation方法里进行处理
              wx.openSetting({
                success: (settingdata) => {
                  if (settingdata.authSetting["scope.userLocation"]) {
                    wx.showToast({
                      icon: "none",
                      title: "获取权限成功",
                      duration: 1500,
                    });
                    this._getlocaldata(callback);
                  } else {
                    app.globalData.isLocationIng = false;
                    wx.showToast({
                      icon: "none",
                      title: "获取权限失败,定位需要用户授权",
                      duration: 1500,
                    });
                  }
                },
                fail:(err)=>{
                  try {
                    this.is_errCall(errCall)
                  } catch (error) {
                    console.log(error)
                  }
                }
              });
            }else{
              app.globalData.isLocationIng = false;
            }
          },
        });
      }
    },

在myhehavior组件里无法在用户已经拒绝授权后再调用wx.opensetting()。wx.opensetting()必须由用户主动触发(如点击按钮),不能在wx.getLocation 的fail 回调中直接调用。这是为了防止开发者强制跳转设置页干扰用户,所以我直接在getlocation里直接增加二次确认弹窗,为了防止用户第一次拒绝定位授权。

相关推荐
java1234_小锋1 天前
【免费】基于Python的微信小程序网约车(打车,在线叫车,移动出行)系统(FastAPI+Vue3) 锋哥原创出品,必属精品
微信小程序·小程序·fastapi·网约车系统·在线叫车系统
2501_916007471 天前
Bundle ID 注册与管理 App ID 创建指南 命名规则 权限开关与删除注意事项
android·ios·小程序·https·uni-app·iphone·webview
凡科网小帆2 天前
2026小程序商城做的比较好的品牌,怎么选小程序商城品牌
小程序·小程序商城
2501_915909062 天前
iOS 证书创建与管理 类型限制 p12 密码与云备份实操
android·ios·小程序·https·uni-app·iphone·webview
拖孩2 天前
用 AI 重解千年观音灵签,做了一个微信小程序,每天摇一摇,命运给你回应
前端·后端·微信小程序
黄华SJ520it3 天前
顶俏洗衣液模式制度开发介绍:S2B2C社交分销+多门店核销系统全解析
前端·数据库·小程序·零售·系统开发
北极糊的狐3 天前
钉钉小程序报错data.formatTime is not a function是因为 axml 模板中不能直接调用 Page 内自定义方法!
java·小程序·钉钉
java1234_小锋3 天前
【免费】微信小程序网约车(打车,在线叫车,移动出行)系统(SpringBoot4+Vue3) 锋哥原创出品,必属精品
微信小程序·网约车·在线叫车·移动出行
show4334 天前
多格式导出怎么做?2026免费小程序TXT/SRT实践
开发语言·小程序·c#
AI砖家4 天前
AI编程—微信小程序开发规范
微信小程序·小程序·notepad++·ai编程