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
相关推荐
qq_124987075321 分钟前
基于微信小程序的校园跑腿系统的设计与实现(源码+论文+部署+安装)
spring boot·微信小程序·小程序·毕业设计·计算机毕业设计
雪芽蓝域zzs1 小时前
uniapp基于picker选择器实现年月日时分秒
uni-app
niucloud-admin2 小时前
本地开发部署——uniapp端站点部署
uni-app
小小王app小程序开发2 小时前
盲盒小程序一番赏特殊玩法超细分拆解:从底层逻辑到落地细节
大数据·小程序
说私域3 小时前
基于AI大模型与AI智能名片S2B2C商城小程序的抖音内容力构建与品牌增长研究
大数据·人工智能·小程序·开源
微爱帮监所写信寄信4 小时前
微爱帮监狱写信寄信小程序DDoS防护:智能负载均衡架构
小程序·负载均衡·ddos
计算机毕设指导64 小时前
基于微信小程序的设备报修系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
qq_12498707534 小时前
悦读圈图书共享微信小程序(源码+论文+部署+安装)
spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计
说私域20 小时前
移动互联网生态下定制开发开源AI智能名片S2B2C商城小程序源码在营销技术中的应用与发展
人工智能·小程序·开源
微爱帮监所写信寄信20 小时前
微爱帮监狱写信寄信工具服务器【Linux篇章】再续:TCP协议——用技术隐喻重构网络世界的底层逻辑
linux·服务器·开发语言·网络·网络协议·小程序·监狱寄信