uniapp h5 app 小程序获取当前定位

目前只测试了h5的获取当前定位方法(可行),小程序和app还有待后续测试补充

借鉴了https://blog.csdn.net/Smile_ping/article/details/138705700文章内容

开发过程可能会遇到的问题

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
相关推荐
*小雪2 小时前
uniapp写H5授权登录及分享,返回到目标页面
开发语言·javascript·uni-app
一只程序熊2 小时前
uniapp uniim ios配置消息推送
uni-app
2501_915106325 小时前
iOS性能调优的系统化实践,从架构分层到多工具协同的全流程优化指南(开发者深度版)
android·ios·小程序·架构·uni-app·iphone·webview
一 乐7 小时前
游戏助手|游戏攻略|基于SprinBoot+vue的游戏攻略系统小程序(源码+数据库+文档)
数据库·vue.js·spring boot·后端·游戏·小程序
TE-茶叶蛋18 小时前
Uniapp运行MuMu模拟器
uni-app
说私域20 小时前
开源AI智能名片链动2+1模式S2B2C商城小程序:分享经济时代的技术赋能与模式创新
人工智能·小程序·开源
一人一程温一壶酒20 小时前
微信小程序uniapp开发附源码——图片加水印
微信小程序·uni-app·notepad++
低代码布道师20 小时前
医疗小程序05我的就诊卡
低代码·小程序
阿拉斯加的头头儿1 天前
小程序下载图片问题处理
小程序