目前只测试了h5的获取当前定位方法(可行),小程序和app还有待后续测试补充
开发过程可能会遇到的问题
1.uni.getLocation不触发不生效
解决:不用谷歌浏览器,用edge浏览器
谷歌浏览器中没梯子是没法用的(开了梯子也不知道能不能用,看社区应该是可以,不过我没用测试),在使用调试时完全就不触发
2.在http开发环境,浏览器报错,大概就是如下提示

解决:在manifest.json中源码视图找到"h5"加入如下代码,加完以后重新跑,说是只能在https环境里调用
复制代码
"devServer": {
"port": 8080,
"https": true,
"proxy": {
"/api": {
"target": "https://localhost:8080",
"changeOrigin": true,
"secure": true
}
}
},
使用:
1.先到main.js全局注册
javascript
复制代码
import location from './utils/location.js'
Vue.prototype.$location = location
2.页面内使用(用获取到的经纬度调用高德的api获取具体的位置中文名)
javascript
复制代码
const that = this;
this.$location.getLocation((lb) => {
console.log('位置信息', lb)
let key = 'xxxxxxxxxx';//高德地图key
uni.request({
// 高德
url: 'https://restapi.amap.com/v3/geocode/regeo?output=json&location=' + lb.longitude + ',' + lb.latitude + '&key=' + key + '&radius=1000&extensions=all',
data: {},
header: {
'Content-Type': 'application/json',
},
success: function (res) {
console.log('高德地图API接口返回信息', res)
let data = res.data.regeocode
that.locationInfo.address = data.addressComponent.city + data.addressComponent.district + data.addressComponent.streetNumber.street + data.addressComponent.streetNumber.number || res.data.regeocode.formatted_address || '未知位置';
},
})
})
相关代码
location.js
javascript
复制代码
// #ifdef APP-PLUS
import permision from '@/common/js/permission.js'
// #endif
import store from '@/store/index.js'
var modalInfo = {
content: '为了您更好的体验App蓝牙功能,需要获取位置信息,请点击设置开启定位权限',
confirmText: '设置'
}
export async function getLocation (cb) {
// #ifdef APP-PLUS
let status = await checkPermission();
if (status !== 1) {
return status;
}
// #endif
// #ifdef MP-WEIXIN
let status = await getSetting();
if (status === 2) {
showConfirm();
return;
}
// #endif
doGetLocation(cb);
}
export const doGetLocation = (cb) => {
uni.getLocation({
success: (res) => {
// 通过回调函数返回位置信息
if (typeof cb === 'function') {
cb(res);
}
},
fail: (err) => {
if (err.errMsg.indexOf("auth deny") >= 0) {
uni.showToast({
title: '访问位置被拒绝',
icon: 'none'
})
} else {
uni.showToast({
title: err.errMsg,
icon: 'none'
})
}
}
})
}
async function checkPermission () {
let status = permision.isIOS ? await permision.requestIOS('location') :
await permision.requestAndroid('android.permission.ACCESS_FINE_LOCATION');
if (status === null || status === 1) {
status = 1;
} else if (status === 2) {
uni.showModal({
content: '系统定位已关闭',
showCancel: false,
success: function (res) { }
})
} else if (status.code) {
uni.showModal({
content: status.message
})
} else {
uni.showModal({
content: modalInfo.content,
confirmText: modalInfo.confirmText,
success: function (res) {
if (res.confirm) {
permision.gotoAppSetting();
}
}
})
}
return status;
}
/**
* 获取用户的当前设置
*/
function getSetting () {
return new Promise((resolve, reject) => {
uni.getSetting({
success: (res) => {
if (res.authSetting['scope.userLocation'] === undefined) {
resolve(0);
return;
}
if (res.authSetting['scope.userLocation']) {
resolve(1);
} else {
resolve(2);
}
}
});
});
}
/**
* 拒绝授权:弹窗可以和App共用,根据平台调用方法,自行修改下即可;
*/
function showConfirm () {
uni.showModal({
content: modalInfo.content,
confirmText: modalInfo.confirmText,
showCancel: true,
success: (res) => {
if (res.confirm) {
openSetting();
}
}
})
}
/**
* 如果拒绝授权,调起微信小程序设置界面
*/
function openSetting () {
uni.openSetting({
success: (res) => {
if (res.authSetting && res.authSetting['scope.userLocation']) {
doGetLocation();
}
},
fail: (err) => { }
})
}
const location = {
getLocation
}
export default location;
permission.js(app和小程序才会用到,暂未测试)
javascript
复制代码
// 管理相关权限,例相册、相机等,可以写在此文件中
// 根据不同平台,处理向系统请求权限
// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启
var isIOS
function location () {
var result = 0;
var cllocationManger = plus.ios.import("CLLocationManager");
var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
if (!enable) {
result = 2;
} else if (status === 0) {
result = null;
} else if (status === 3 || status === 4) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(cllocationManger);
return result;
}
function requestIOS (permissionID) {
return new Promise((resolve, reject) => {
switch (permissionID) {
case "location":
resolve(location());
break;
default:
resolve(0);
break;
}
});
}
function requestAndroid (permissionID) {
return new Promise((resolve, reject) => {
plus.android.requestPermissions(
[permissionID],
function (resultObj) {
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
console.log('已获取的权限:');
result = 1
}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var deniedPresentPermission = resultObj.deniedPresent[i];
console.log('拒绝本次申请的权限:');
result = 0
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var deniedAlwaysPermission = resultObj.deniedAlways[i];
console.log('永久拒绝申请的权限:');
result = -1
}
resolve(result);
},
function (error) {
resolve({
code: error.code,
message: error.message
});
}
);
});
}
function gotoAppPermissionSetting () {
if (permission.isIOS) {
var UIApplication = plus.ios.import("UIApplication");
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.import("NSURL");
var setting2 = NSURL2.URLWithString("app-settings:");
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
} else {
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
const permission = {
get isIOS () {
return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios')
},
requestIOS: requestIOS,
requestAndroid: requestAndroid,
gotoAppSetting: gotoAppPermissionSetting
}
export default permission