mrr.sj.front/utils/locationService.js

222 lines
6.2 KiB
JavaScript
Raw Permalink Normal View History

2026-03-24 11:45:13 +08:00
/**
* 定位服务检测工具
* 功能检测用户是否开启定位权限/服务
* 支持平台APPAndroid/iOS微信小程序H5
*/
export default {
/**
* 检查定位服务是否可用
* @returns {Promise<boolean>} 返回Promisetrue表示定位可用
*/
isLocationEnabled() {
return new Promise((resolve, reject) => {
// APP端处理
// #ifdef APP-PLUS
this._checkAppLocation().then(resolve).catch(reject);
// #endif
// 微信小程序处理
// #ifdef MP-WEIXIN
this._checkWxLocation().then(resolve).catch(reject);
// #endif
// H5处理
// #ifdef H5
this._checkH5Location().then(resolve).catch(reject);
// resolve(false);
// #endif
// 默认处理(非上述平台)
// #ifndef APP-PLUS || MP-WEIXIN || H5
resolve(false);
console.warn('当前平台不支持定位检测');
// #endif
});
},
/**
* APP端检测定位
* @private
*/
_checkAppLocation() {
return new Promise((resolve) => {
plus.geolocation.getCurrentPosition(
() => resolve(true),
(err) => {
// 错误码参考https://www.html5plus.org/doc/zh_cn/geolocation.html#plus.geolocation.GeolocationError
console.log(err,"---------------------")
if (err.code === 2 || err.code === 12) {
resolve(false); // 权限被拒绝或定位服务未开启
}else {
resolve(false); // 其他错误也视为不可用
}
},
{ provider: 'system', enableHighAccuracy: false }
);
});
},
/**
* 微信小程序检测定位
* @private
*/
_checkWxLocation() {
return new Promise((resolve) => {
wx.getSetting({
success(res) {
const authSetting = res.authSetting || {};
// undefined表示尚未询问过权限也视为可用
resolve(authSetting['scope.userLocation'] !== false);
},
fail() {
resolve(false);
}
});
});
},
/**
* H5端检测定位
* @private
*/
_checkH5Location() {
return new Promise((resolve) => {
// 现代浏览器 Permissions API
if (navigator.permissions && navigator.permissions.query) {
navigator.permissions.query({ name: 'geolocation' })
.then(permissionStatus => {
resolve(permissionStatus.state !== 'denied');
})
.catch(() => {
resolve('geolocation' in navigator);
});
}
// 传统浏览器检测
else {
resolve('geolocation' in navigator);
}
});
},
/**
* 请求定位权限
* @returns {Promise<boolean>} 返回是否成功获取权限
*/
requestLocationPermission() {
return new Promise((resolve) => {
uni.authorize({
scope: 'scope.userLocation',
success: () => resolve(true),
fail: () => resolve(false)
});
});
},
/**
* 打开系统定位设置页面
*/
openSystemLocationSetting() {
// APP端
// #ifdef APP-PLUS
if (plus.os.name === 'Android') {
const Intent = plus.android.importClass('android.content.Intent');
const Settings = plus.android.importClass('android.provider.Settings');
const main = plus.android.runtimeMainActivity();
const intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent);
} else if (plus.os.name === 'iOS') {
const UIApplication = plus.ios.importClass('UIApplication');
const NSURL = plus.ios.importClass('NSURL');
const url = NSURL.URLWithString('App-Prefs:root=Privacy&path=LOCATION');
const sharedApplication = UIApplication.sharedApplication();
plus.ios.invoke(sharedApplication, 'openURL:', url);
}
// #endif
// 微信小程序
// #ifdef MP-WEIXIN
wx.openSetting();
// #endif
// H5无法直接打开系统设置
// #ifdef H5
console.warn('H5端无法直接打开系统定位设置');
// #endif
},
/**
* 跳转到当前应用的系统设置页面
*/
openAppSettings() {
// APP端处理
// #ifdef APP-PLUS
if (plus.os.name === 'Android') {
const Intent = plus.android.importClass('android.content.Intent');
const Settings = plus.android.importClass('android.provider.Settings');
const Uri = plus.android.importClass('android.net.Uri');
const main = plus.android.runtimeMainActivity();
const intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
const uri = Uri.fromParts("package", main.getPackageName(), null);
intent.setData(uri);
main.startActivity(intent);
}
else if (plus.os.name === 'iOS') {
var app = plus.ios.invoke('UIApplication', 'sharedApplication');
var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
plus.ios.invoke(app, 'openURL:options:completionHandler:', setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(app);
}
// #endif
// 微信小程序处理
// #ifdef MP-WEIXIN
wx.openSetting({
success(res) {
console.log('已打开小程序设置页面');
}
});
// #endif
// H5处理
// #ifdef H5
console.warn('H5端无法直接打开应用设置');
alert('请在浏览器设置中修改权限');
// #endif
},
/**
* 获取当前位置封装了权限检测
* @param {Object} options 同uni.getLocation参数
* @returns {Promise<Object>} 返回位置信息
*/
async getCurrentPosition(options = {}) {
const isEnabled = await this.isLocationEnabled();
if (!isEnabled) {
// uni.showModal({
// title: '提示',
// content: '您的系统位置权限未开启,无法为您提供服务。',
// success: (res)=> {
// if (res.confirm) {
// this.openSystemLocationSetting()
// } else if (res.cancel) {
// }
// }
// })
return isEnabled;
throw new Error('定位服务未开启或没有权限');
}
return isEnabled;
// return new Promise((resolve, reject) => {
// uni.getLocation({
// type: 'gcj02',
// geocode: true,
// ...options,
// success: resolve,
// fail: reject
// });
// });
}
};