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

发布于:2025-07-04 ⋅ 阅读:(10) ⋅ 点赞:(0)
 _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里直接增加二次确认弹窗,为了防止用户第一次拒绝定位授权。


网站公告

今日签到

点亮在社区的每一天
去签到