_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里直接增加二次确认弹窗,为了防止用户第一次拒绝定位授权。