当前位置: 首页 > news >正文

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全局注册

import location from './utils/location.js'
Vue.prototype.$location = location

2.页面内使用(用获取到的经纬度调用高德的api获取具体的位置中文名)

const that = this;
this.$location.getLocation((lb) => {console.log('位置信息', lb)let key = 'xxxxxxxxxx';//高德地图keyuni.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.regeocodethat.locationInfo.address = data.addressComponent.city + data.addressComponent.district + data.addressComponent.streetNumber.street + data.addressComponent.streetNumber.number || res.data.regeocode.formatted_address || '未知位置';},})})

相关代码

location.js

// #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-PLUSlet status = await checkPermission();if (status !== 1) {return status;}// #endif// #ifdef MP-WEIXINlet status = await getSetting();if (status === 2) {showConfirm();return;}// #endifdoGetLocation(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和小程序才会用到,暂未测试)

// 管理相关权限,例相册、相机等,可以写在此文件中
// 根据不同平台,处理向系统请求权限// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启var isIOSfunction 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

http://www.dtcms.com/a/609680.html

相关文章:

  • 重庆潼南网站建设哪家好沈阳市建设工程安全监督站网站
  • [特殊字符] 嵌入式音频接口全景图解:I2S、TDM、PDM、SPDIF、AC’97 与 PCM 的关系
  • 从 API 到应用:用 Rust 和 SQLx 为 Axum 服务添加持久化数据库
  • 【高级机器学习】 9. 代理损失函数的鲁棒性
  • 测试之测试用例篇
  • 做网站优化推广的好处网站界面设计实验报告
  • 自建node云函数服务器
  • TRO侵权预警|Lauren动物插画发起维权
  • Rust实战:使用Axum和SQLx构建高性能RESTful API
  • 波动率曲面分解法在期货价差套利策略中的应用研究
  • 泌阳县住房建设局网站网站seo排名优化工具在线
  • 电子商务网站建设课北京建设网官方网站
  • vr大空间体验馆,vr大空间是什么意思啊?
  • Node.js实现WebSocket教程
  • 朝阳区搜索优化seosem百度seo关键词排名优化工具
  • C++初阶
  • NFS:K8s集群的跨主机存储方案
  • 动态设计网站制作wordpress
  • 短临 Nowcast 在分布式光伏的落地:分钟级降水与云量对 Irradiance 的影响(工程版)
  • linux centos 防火墙操作命令
  • 破解行业绿电直供痛点:直连架构适配关键技术解析
  • token无感刷新全流程
  • MySQL 数据增删改查
  • 浏阳做网站的公司价格网站设计步骤详解
  • 南京做网站外包试论述网上商城的推广技巧
  • 面试150——二叉树
  • opencv 学习: QA_02 什么是图像中的高频成分和低频成分
  • C++_面试题13_QVector和QList的区别
  • Vue 2脚手架从入门到实战核心知识点全解析(day6):从工程结构到高级通信(附代码讲解)
  • 2025年AI面试防作弊指南:技术笔试如何识别异常行为