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
相关推荐
速易达网络18 小时前
Uniapp + Coze智能在线课程平台应用实现方案
uni-app
Qlittleboy21 小时前
uniAPP开发 image 标签的@error事件不被触发调用怎么办
uni-app
我命由我123451 天前
微信小程序 - scroll-view 的一些要点(scroll-view 需要设置滚动方向、scroll-view 需要设置高度)
开发语言·前端·javascript·微信小程序·小程序·前端框架·js
吳所畏惧1 天前
少走弯路:uniapp里将h5链接打包为apk,并设置顶/底部安全区域自动填充显示,阻止webview默认全屏化
android·安全·uni-app·json·html5·webview·js
weixin_472183541 天前
微信小程序使用websocket
websocket·微信小程序·小程序
发财北1 天前
线上交友APP怎么开发?
小程序
2501_915921431 天前
Bundle Id 创建与管理的工程化方法,一次团队多项目协作中的流程重构
服务器·ios·小程序·重构·https·uni-app·iphone
少云清1 天前
【功能测试】4_小程序项目 _Ego微商小程序测试点分析
功能测试·小程序
说私域1 天前
直播带货的困境与突破:基于“开源AI智能名片链动2+1模式S2B2C商城小程序”的创新研究
人工智能·小程序·开源
2501_915909061 天前
深度解析 iOS 内存占用,构建多工具协同的内存诊断、监控与优化体系
android·ios·小程序·https·uni-app·iphone·webview