使用uniapp开发app实现后台保活定位能力

在 UniApp 中实现后台保活定位能力通常涉及几个关键步骤,包括获取定位权限、实现定位功能、处理后台定位以及确保应用在后台时能够持续定位。以下是一个基本的指南:

1. 系统定位

IOS系统

首先开启系统定位能力

需要配置后台运行能力

注意:本地测试需要打自定义基座包 才行

 代码实现(可进行定时获取,实现后台实时定位能力)

    			uni.getLocation({
					type: 'wgs84',
					success: function(res) {
						console.log('系统当前地址' + JSON.stringify(res))
					}
				});

安卓系统

/utils/location.js

export default {
	//检测是否开启系统定位权限
	hasLocationPermission() {
		let system = uni.getSystemInfoSync();
		if (system.platform === 'android') { //安卓
			let context = plus.android.importClass("android.content.Context");
			let locationManager = plus.android.importClass("android.location.LocationManager");
			let main = plus.android.runtimeMainActivity();
			let service = main.getSystemService(context.LOCATION_SERVICE);
			//已开启系统定位服务功能
			if (service.isProviderEnabled(locationManager.GPS_PROVIDER)) return true;
			else { //未开启引导开启
				uni.showModal({
					title: '友情提示',
					content: '请开启位置服务功能',
					success: e => {
						if (e.confirm) {
							//打开手机系统gps定位设置页面
							let Intent = plus.android.importClass('android.content.Intent');
							let Settings = plus.android.importClass('android.provider.Settings');
							let intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
							main.startActivity(intent);
						}
					}
				})
				// return false
			}
		} else if (system.platform === 'ios') { //ios
			let cllocationManger = plus.ios.import("CLLocationManager");
			let enable = cllocationManger.locationServicesEnabled();
			let status = cllocationManger.authorizationStatus();
			plus.ios.deleteObject(cllocationManger);
			if (enable && status != 2) return true; //已开启定位功能
			else {
				// return false
				uni.showModal({
					title: '友情提示',
					content: '请前往设置-定位服务打开定位服务功能',
					success: e => {
						if (e.confirm) {
							let UIApplication = plus.ios.import("UIApplication");
							let application = UIApplication.sharedApplication();
							let NSURL = plus.ios.import("NSURL");
							let setting = NSURL.URLWithString("app-settings:");
							application.openURL(setting);
							plus.ios.deleteObject(setting);
							plus.ios.deleteObject(NSURL);
							plus.ios.deleteObject(application);
						}
					}
				});
			}
		}
		return false;
	},
	gotoLocationSetting() {
		let system = uni.getSystemInfoSync();
		if (system.platform === 'ios') {
			let UIApplication = plus.ios.import("UIApplication");
			let application = UIApplication.sharedApplication();
			let NSURL = plus.ios.import("NSURL");
			let setting = NSURL.URLWithString("app-settings:");
			application.openURL(setting);
			plus.ios.deleteObject(setting);
			plus.ios.deleteObject(NSURL);
			plus.ios.deleteObject(application);
		} else {
			let main = plus.android.runtimeMainActivity();
			//打开手机系统gps定位设置页面
			let Intent = plus.android.importClass('android.content.Intent');
			let Settings = plus.android.importClass('android.provider.Settings');
			let intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
			main.startActivity(intent);
		}
	},
	gotoAppSetting() {
		let system = uni.getSystemInfoSync();
		if (system.platform === 'ios') {
			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);
		}
	},
	/**开启后台持续获取定位功能
	 * successCallBack:成功回调函数
	 *failCallBack:失败回调函数 
	 *maximumAge:获取定位间隔时间
	 */
	startLocationService(successCallBack = () => {}, failCallBack = () => {}, maximumAge = 10 * 1000) {
		if (this.hasLocationPermission()) { //有定位权限
			let locationWatcherId = plus.geolocation.watchPosition((position) => {
				console.log(position);
				successCallBack({
					locationWatcherId,
					position: position.coords
				})
			}, function(e) {
				console.log(e, '定位失败');
				failCallBack(e)
			}, {
				provider: 'system', //优先使用定位模块,“system”:表示系统定位模块,支持wgs84坐标系; “baidu”:表示百度定位模块,支持gcj02/bd09/bd09ll坐标系; “amap”:表示高德定位模板,支持gcj02坐标系,默认值按以下优先顺序获取(amap>baidu>system)
				// timeout: 10000, //定位超时
				enableHighAccuracy: false, //高精确度获取位置信息
				coordsType: "wgs84", //坐标系类型, “wgs84”:表示WGS-84坐标系; “gcj02”:表示国测局经纬度坐标系,"bd09":百度地图使用的坐标系
				//geocode:false//是否解析地址
				geocode: true,
				maximumAge: maximumAge,
			});

		}
	},
	//关闭定位功能
	closeLocationService(locationWatcherId) { //locationWatcherId:开启步骤生成的监听器id
		plus.geolocation.clearWatch(locationWatcherId)
	},
}

调用:

import locationWatcher from '@/utils/location.js'

// 其他代码...

let locationWatcherId;
locationWatcher.startLocationService(e => {
	let {
		latitude,
		longitude
	} = e.position
	console.log('地位中', e)

	if (!locationWatcherId) {
		locationWatcherId = e.locationWatcherId //举例保存到data,实际可以缓存到全局
	}
}, (e) => {
	console.log(e, '定位失败')
}, 10 * 1000)

 

2. 第三方SDK定位(高德定位)

勾选相应的定位模块

 申请相关的key,根据后面的获取方式步骤进行申请即可;

    			uni.getLocation({
					type: 'gcj02',
					success: function(res) {
						console.log('高德当前地址' + JSON.stringify(res))
					}
				});

 注意:系统定位只支持 wgs84 gps 坐标系, 不设置type默认就会使用系统定位返回 wgs84 坐标,如果设置了 gcj02 类型,那就会使用高德定位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698692.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经气体生长算法【GNG】

当德国计算神经学家 Bernd Fritzke 在其 1995 年的开创性论文中提出后来被称为神经气体生长(GNG)的算法时,机器学习还是一个相对较新的领域,并且受到实际神经科学的极大启发。 当时,神经科学正处于一个突破性的时代—…

浅谈word格式:.doc和.docx的优缺点及区别

.doc和.docx是两种最为常见的文档格式,它们在多个方面存在着显著的区别。首先,从版本角度来看,.doc是Microsoft Office Word 2003及之前版本的保存类型,而.docx则是Word 2007及之后版本的保存类型。这一区别直接影响了文档在不同版…

【数据分析】统计学基础及Python具体实现

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

FlowUs息流:新媒体运营者的智能协作解决方案

新媒体和自媒体运营者在日常工作中经常面临信息管理复杂、创意记录不便、团队协作效率低等痛点。FlowUs作为一款多功能的协作工具,能够针对性地解决这些问题。 FlowUs息流是一款专为新媒体从业者设计的协作文档工具,它具备以下功能特色: 中文…

Android 代码打印meminfo

旨在替代adb shell dumpsys meminfo packageName,在log打印meminfo,以便分析内存情况 ActivityManager.MemoryInfo memoryInfo new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); long totalMemory Runtime.getRuntime(…

Python从0到100(三十二):lxml模块的学习与应用

学习目标 掌握使用lxml库提取数据的方法。理解lxml在数据处理后提取的数据类型。学习将元素(element)转换为字符串的方法。 1. lxml的安装 通过以下命令安装lxml库: pip install lxml2. lxml的使用 2.1 基础使用 导入lxml的etree库&…

用英语介绍端午节,柯桥零基础英语培训

端午节 Dragon Boat Festival 中国传统节日,农历五月初五。相传古代诗人屈原在五月初五投江自杀,后人把这天作为节日纪念他。有划龙舟比赛、包粽子等风俗。 A traditional Chinese festival on the fifth day of the fifth lunar month. Legend has i…

Doris 2.1 元数据更新

metadata_refresh_interval_sec 20

护理考试搜题软件哪个免费?分享九个搜题直接出答案的软件 #知识分享#微信

培养自己的阅读习惯,并不仅仅限于课外读物,还包括学术期刊、行业报告等,以不断提升自己的知识水平和思考能力。 1.彩虹搜题 这是一个公众号 是一款专门针对于大学生或者是成年自考等学生顺利完成证件考试的应用软件,这款软件涵…

AI巅峰对决:8款大模型边缘作文谁领风骚?

前几天我们预测高考作文题目,然后有朋友说我们预测对了,但是我们认真看,发现和全国卷作文人工智能有点交集,但是不能说预测对。 这次我们不预测了,而是让实力说话——邀请8个国产AI大模型参与一场别开生面的“边缘作文…

人工智能对聊天机器人训练数据的“淘金热”可能会耗尽人类编写的文本

人工智能对聊天机器人训练数据的“淘金热”可能会耗尽人类编写的文本 像ChatGPT这样的人工智能系统可能很快就会耗尽让它们变得更聪明的东西——人们在网上写下和分享的数万亿字。 Epoch AI研究集团发布的一项新研究预计,科技公司将在大约十年之交——2026年至203…

Spring--Bean的作用域,生命周期

Bean的作用域 Bean的作用域有很多种,在Spring Framework中支持6种(其中有四种只有在web环境中才能生效),同时Spring还支持自定义Bean的范围。 Spring Framework中支持的6种范围: 作用域解释singleton每个Spring IoC…

【数学建模】微分方程的数值求解

微分方程的数值求解 一阶差分求解微分方程原理:四阶龙格-库塔方法应用:小船渡河问题: 进阶求二阶微分方程 一阶差分求解微分方程原理: d y d x f ( x n , y n ) \dfrac{dy}{dx}f(x_n,y_n) dxdy​f(xn​,yn​) y n 1 − y n x n 1 − x n f ( x n , y n ) \dfrac{y_{n1}-y_n…

React+TS前台项目实战(一)-- 项目初始化配置及开此系列的初衷

文章目录 前言一、初始化项目二、基础配置1. 项目目录及说明如下2. TS版本使用Craco需注意 总结 前言 前面 后台管理系统实战 系列教程暂时告一段落了,想了解全局各种配置的可自行查看。本次教程将重点介绍React前台项目的实操,关于具体的配置&#xff…

51单片机-数码管显示多个

目录 简介: 一. 简单全亮 二. 控制单个变化 三. 2024 书接上回 51单片机-数码管显示单个 http://t.csdnimg.cn/Ii6x0 简介: 51 单片机作为控制核心,可以与数码管相连接来实现数字的显示。 数码管通常有多个段,通过控制这些段的点亮和熄灭状态&…

弘君资本炒股技巧:银行降准对股票的影响?

银行降准会带动股票市场变得相对活泼起来,假如降准前股价在跌落状态,降准能够起到一定缓冲股价跌落的效果。 什么是降准:降准指的是减少银行在央行的存款准备金率,也便是说银行需求存放于央行的资金份额下降,银行能够…

Tensorflow2.10 完成图像分割任务

前言 图像分割在医学成像、自动驾驶汽车和卫星成像等方面有很多应用,本质其实就是图像像素分类任务,也就是使用深度学习模型为输入图像的每个像素分配一个标签(或类)。 准备 本文的准备如下,使用 pip 安装如下配置&…

动态内存管理<C语言>

导言 在C语言学习阶段,指针、结构体和动态内存管理,是后期学习数据结构的最重要的三大知识模块,也是C语言比较难的知识模块,但是“天下无难事”,只要认真踏实的学习,也能解决,所以下文将介绍动态…

成都石室中学学子游汶鑫展现新时代好少年风采 拾金不昧获表彰

在繁华的都市中,每天都有无数的故事在上演,而其中的一些故事,却以其独特的温暖和正能量,深深打动着我们的心灵。近日,成都石室中学初中学校的一名学生游汶鑫同学,就用他的实际行动,诠释了新时代好少年的风采,展现了中华民族传统美德在当代青少年身上的生动体现。 成都石室中学初…

# Mac下反编译微信小程序获得源码

Mac下反编译微信小程序获得源码 所需工具 mac版微信 最好3.8以上版本node环境wxappUnpacker wxappUnpacker: 小程序反编译(支持分包) 小程序反编译(支持分包) https://gitee.com/ksd/wxappUnpacker 大体步骤 用微信搜索打开对应小程序,为的是把产物文件加载到…