mrr.sj.front/utils/locationService.js

222 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 定位服务检测工具
* 功能:检测用户是否开启定位权限/服务
* 支持平台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
// });
// });
}
};