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