/** * 定位服务检测工具 * 功能:检测用户是否开启定位权限/服务 * 支持平台:APP(Android/iOS)、微信小程序、H5 */ export default { /** * 检查定位服务是否可用 * @returns {Promise} 返回Promise,true表示定位可用 */ 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} 返回是否成功获取权限 */ 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} 返回位置信息 */ 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 // }); // }); } };