修复地图定位bug
This commit is contained in:
+145
-22
@@ -1,5 +1,41 @@
|
||||
// 地图工具函数 - 内联腾讯地图SDK核心代码
|
||||
|
||||
const DEFAULT_LOCALE = 'zh-CN'
|
||||
const permissionTexts = {
|
||||
'zh-CN': {
|
||||
locationTitle: '位置信息授权',
|
||||
locationNeed: '需要获取您的位置信息以展示附近设备,请在“设置-权限管理”中开启定位权限。',
|
||||
locationDenied: '未授权定位,将无法展示附近设备。您可以稍后在“设置-权限管理”中重新开启定位权限。',
|
||||
goToSettings: '去设置',
|
||||
later: '暂不',
|
||||
gotIt: '知道了'
|
||||
},
|
||||
'en-US': {
|
||||
locationTitle: 'Location Permission',
|
||||
locationNeed: 'We need your location to show nearby devices. Please enable location in “Settings > Permissions”.',
|
||||
locationDenied: 'Location access is disabled. You can re-enable it later in “Settings > Permissions”.',
|
||||
goToSettings: 'Set',
|
||||
later: 'Skip',
|
||||
gotIt: 'OK'
|
||||
}
|
||||
}
|
||||
|
||||
const getCurrentLocale = () => {
|
||||
try {
|
||||
const saved = uni.getStorageSync('language')
|
||||
if (saved && permissionTexts[saved]) {
|
||||
return saved
|
||||
}
|
||||
} catch (_) {}
|
||||
return DEFAULT_LOCALE
|
||||
}
|
||||
|
||||
const getPermissionText = (key) => {
|
||||
const locale = getCurrentLocale()
|
||||
const texts = permissionTexts[locale] || permissionTexts[DEFAULT_LOCALE]
|
||||
return texts[key] || permissionTexts[DEFAULT_LOCALE][key] || ''
|
||||
}
|
||||
|
||||
// 腾讯地图Key
|
||||
const QQMAP_KEY = 'RO5BZ-ECZ63-7US3C-RT5QW-TIDZE-2FF35';
|
||||
|
||||
@@ -408,16 +444,120 @@ function getQQMapInstance() {
|
||||
return qqmapInstance || initQQMap();
|
||||
}
|
||||
|
||||
// 获取用户位置(使用微信的接口获取位置)
|
||||
// 获取用户位置(统一处理小程序定位授权 && 实际定位)
|
||||
function getUserLocation() {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.getLocation({
|
||||
// 小程序端优先通过 getSetting 判断权限状态
|
||||
// 这里只考虑 mp-weixin 场景,其它平台回退到直接调用 getLocation
|
||||
// #ifdef MP-WEIXIN
|
||||
uni.getSetting({
|
||||
success: (settingRes) => {
|
||||
const authSetting = settingRes.authSetting || {};
|
||||
// 兼容多种定位 scope(微信近几次版本变更比较多)
|
||||
const hasUserLocation = Object.prototype.hasOwnProperty.call(authSetting, 'scope.userLocation');
|
||||
const userLocationAuth = authSetting['scope.userLocation'];
|
||||
const fuzzyLocationAuth = authSetting['scope.userFuzzyLocation'];
|
||||
const bgLocationAuth = authSetting['scope.userLocationBackground'];
|
||||
|
||||
// 已明确拒绝定位
|
||||
if (
|
||||
userLocationAuth === false ||
|
||||
fuzzyLocationAuth === false ||
|
||||
bgLocationAuth === false
|
||||
) {
|
||||
uni.showModal({
|
||||
title: getPermissionText('locationTitle'),
|
||||
content: getPermissionText('locationNeed'),
|
||||
confirmText: getPermissionText('goToSettings'),
|
||||
cancelText: getPermissionText('later'),
|
||||
success: (modalRes) => {
|
||||
if (modalRes.confirm) {
|
||||
uni.openSetting({});
|
||||
}
|
||||
}
|
||||
});
|
||||
reject({
|
||||
code: 'LOCATION_DENIED',
|
||||
errMsg: 'user denied location permission'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const doGetLocation = () => {
|
||||
wx.getLocation({
|
||||
type: 'gcj02',
|
||||
success: (res) => {
|
||||
const longitude = parseFloat(res.longitude.toFixed(5));
|
||||
const latitude = parseFloat(res.latitude.toFixed(5));
|
||||
console.log('地址获取成功');
|
||||
resolve({
|
||||
longitude,
|
||||
latitude
|
||||
});
|
||||
},
|
||||
fail: (error) => {
|
||||
console.error('获取位置失败:', error);
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 未显式授权时,主动申请一次权限(老版本 scope 为 scope.userLocation)
|
||||
if (!hasUserLocation || userLocationAuth === undefined) {
|
||||
uni.authorize({
|
||||
scope: 'scope.userLocation',
|
||||
success: () => {
|
||||
doGetLocation();
|
||||
},
|
||||
fail: (authErr) => {
|
||||
console.error('定位授权失败:', authErr);
|
||||
uni.showModal({
|
||||
title: getPermissionText('locationTitle'),
|
||||
content: getPermissionText('locationDenied'),
|
||||
confirmText: getPermissionText('gotIt'),
|
||||
showCancel: false
|
||||
});
|
||||
reject({
|
||||
code: 'LOCATION_AUTH_FAIL',
|
||||
errMsg: authErr.errMsg || 'authorize location fail'
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// 已授权,直接获取定位
|
||||
doGetLocation();
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
console.warn('获取授权设置失败,直接尝试定位:', err);
|
||||
wx.getLocation({
|
||||
type: 'gcj02',
|
||||
success: (res) => {
|
||||
const longitude = parseFloat(res.longitude.toFixed(5));
|
||||
const latitude = parseFloat(res.latitude.toFixed(5));
|
||||
console.log('地址获取成功');
|
||||
resolve({
|
||||
longitude,
|
||||
latitude
|
||||
});
|
||||
},
|
||||
fail: (error) => {
|
||||
console.error('获取位置失败:', error);
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
// #endif
|
||||
|
||||
// 非微信小程序平台:使用 uni.getLocation 做一个尽量兼容的兜底
|
||||
// #ifndef MP-WEIXIN
|
||||
uni.getLocation({
|
||||
type: 'gcj02',
|
||||
success: (res) => {
|
||||
// 对经度和纬度进行四舍五入,保留小数点后五位
|
||||
const longitude = parseFloat(res.longitude.toFixed(5));
|
||||
const latitude = parseFloat(res.latitude.toFixed(5));
|
||||
|
||||
console.log('地址获取成功');
|
||||
resolve({
|
||||
longitude,
|
||||
latitude
|
||||
@@ -428,26 +568,9 @@ function getUserLocation() {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
// #endif
|
||||
});
|
||||
}
|
||||
//TODO : 修改getUserLocation函数,使其返回Promise(暂时弃用)
|
||||
// function getUserLocation() {
|
||||
// return new Promise((resolve, reject) => {
|
||||
// wx.getLocation({
|
||||
// type: 'gcj02',
|
||||
// success: (res) => {
|
||||
// resolve({
|
||||
// longitude: res.longitude,
|
||||
// latitude: res.latitude
|
||||
// });
|
||||
// },
|
||||
// fail: (error) => {
|
||||
// console.error('获取位置失败:', error);
|
||||
// reject(error);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
// }
|
||||
|
||||
// 逆地理编码 - 根据经纬度获取地址信息
|
||||
function getRegeo(longitude, latitude) {
|
||||
|
||||
Reference in New Issue
Block a user