微信小程序在用户拒绝授权后无法使用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里直接增加二次确认弹窗,为了防止用户第一次拒绝定位授权。

相关推荐
咸虾米_13 分钟前
微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题
微信小程序·小程序·uniapp开发·小程序地图api
未来之窗软件服务2 小时前
蔬菜批发小程序:生产商的数字化转型利器——仙盟创梦IDE
小程序·自动化·仙盟创梦ide·东方仙盟·蔬菜批发·批发系统
数据皮皮侠5 小时前
最新上市公司业绩说明会文本数据(2017.02-2025.08)
大数据·数据库·人工智能·笔记·物联网·小程序·区块链
不如摸鱼去21 小时前
Trae 辅助下的 uni-app 跨端小程序工程化开发实践分享
微信小程序·小程序·uni-app·aigc·ai编程
意会1 天前
微信闪照小程序实现
前端·css·微信小程序
小白_ysf1 天前
uniapp 开发微信小程序,获取经纬度并且转化详细地址(单独封装版本)
微信小程序·uni-app
weixin_lynhgworld1 天前
剧本杀小程序系统开发:构建剧本杀社交新生态
小程序
说私域1 天前
基于定制开发开源 AI 智能名片 S2B2C 商城小程序的热点与人工下发策略研究
人工智能·小程序
weixin_lynhgworld1 天前
陪诊小程序系统开发:让就医不再是一件难事
小程序
是一碗螺丝粉2 天前
拯救你的app/小程序审核!一套完美避开审核封禁的URL黑名单机制
前端·javascript·微信小程序