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

相关推荐
AI品信智慧数智人2 小时前
文旅景区小程序集成数字人智能语音交互系统,山东品信解锁AI伴游新玩法✨
人工智能·小程序
医疗信息化王工3 小时前
钉钉小程序开发实战:投诉管理系统
小程序·钉钉·开发·投诉管理
灵机一物6 小时前
灵机一物AI原生电商小程序(已上线)-从“48 小时失联”到“长期可触达”:一套小程序公众号关注引导 + 订阅消息授权的产品化设计
小程序
碎像6 小时前
掌握uniapp发布微信小程序、App(Android)
微信小程序·小程序·uni-app
程序媛徐师姐7 小时前
Java基于SSM的实验室管理微信小程序,附源码+文档说明
java·微信小程序·实验室管理·实验室管理微信小程序·java实验室管理微信小程序·java实验室管理小程序·实验室管理小程序
CHU7290351 天前
生鲜团购商城小程序:新鲜触手可及的便捷购物新体验
小程序
医疗信息化王工1 天前
钉钉小程序开发实战:手术查询小程序
小程序·钉钉·手术查询
软件开发技术1 天前
新版点微同城主题源码34.7+全套插件+小程序前后端 源文件
小程序·php
mon_star°2 天前
消防安全培训小程序项目亮点与功能清单
小程序
自然 醒2 天前
uni-app开发微信小程序,如何使用towxml去渲染md格式和html标签格式的内容?
微信小程序·uni-app·html