uniapp App端后台间隔时间发送定位功能实现


前言

uniapp开发app端时候,某些业务场景需求:在后台不间断(间隔一定时间)向服务器发送用户定位信息,不管页面是否关闭,app是否处于前后台,发送位置信息功能必须持续,直到某一个页面操作行为触发事件才停下来。


一、核心api

开启定位 plus.geolocation.watchPosition(successFn,errorFn,options)
关闭定位 plus.geolocation.clearWatch(id)

更详细api介绍:https://www.html5plus.org/doc/zh_cn/geolocation.html#plus.geolocation.watchPosition

二、代码实现

1.locationWatcher.js:

定位工具类locationWatcher.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);
						}
					}
				})

			}
		} 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 {
				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;
	},
	/**开启后台持续获取定位功能
	 * successCallBack:成功回调函数
	 *failCallBack:失败回调函数 
	 *maximumAge:获取定位间隔时间
	 */
	startLocationService( successCallBack=()=>{},failCallBack=()=>{},maximumAge=60*1000) {
		if (this.hasLocationPermission()) { //有定位权限
			let locationWatcherId = plus.geolocation.watchPosition((position) => {
				successCallBack({
					locationWatcherId,
					position:position.coords
				})
			}, function(e) {
				console.log(e, '定位失败');
				failCallBack(e)
			}, {
				maximumAge, //获取位置间隔时间,在不同定位模块下支持范围值可能不同,如百度定位模块的间隔范围为大于等于1秒,如果设置的值小于最小值则使用最小值。iOS平台根据设备位置变化自动计算回调更新的间隔时间。
				// provider: 'amap', //优先使用定位模块,“system”:表示系统定位模块,支持wgs84坐标系; “baidu”:表示百度定位模块,支持gcj02/bd09/bd09ll坐标系; “amap”:表示高德定位模板,支持gcj02坐标系,默认值按以下优先顺序获取(amap>baidu>system)
				// timeout: 10000, //定位超时
				enableHighAccuracy: true,//高精确度获取位置信息
				//coordsType:"gcj02",//坐标系类型, “wgs84”:表示WGS-84坐标系; “gcj02”:表示国测局经纬度坐标系,"bd09":百度地图使用的坐标系
				//geocode:false//是否解析地址
			});

		}


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

2.页面引用

代码如下(示例):

<template>
	<view>
		<button @click="open">开启</button>
		<button @click="close">关闭</button>
	</view>
</template>

<script>
	import locationWatcher from './locationWatcher.js'
	export default {
		data() {
			return {
				locationWatcherId:'',//监听器id
				maximumAge: 10 * 1000//间隔时间10s
			}
		},
		methods: {
			//开启定位功能
	        open(){
				locationWatcher.startLocationService(e=>{
					let {latitude,longitude}=e.position
					console.log(`当前位置,经度${longitude},纬度${latitude}`)
					if(!this.locationWatcherId){
						this.locationWatcherId=e.locationWatcherId//举例保存到data,实际可以缓存到全局
					}
				},(e)=>{
					console.log(e,'定位失败')
				},this.maximumAge)
			},
			
			//关闭定位
			close(){
				this.locationWatcherId&&locationWatcher.closeLocationService(this.locationWatcherId)
			}
		}
	}
</script>

运行结果

在这里插入图片描述


三、注意事项

1.定位功能需要引入地图appkey,申请百度或高德地图key,在manifest.json-APP模块-Maps配置
2.locationWatcherId实际开发需要全局缓存,在需要关闭定位功能地方调用
3.定位功能跟app生命周期一致,后台app进程被杀死或完全退出app功能停止
4.定位功能授权弹窗必须选择允许
5 如果需要绘制轨迹或地图显示,coordsType(坐标系)属性需要按需设置,高德地图:gcj02,百度地图:bd09,谷歌地图:wgs84
6对于做绘制轨迹需求的话从个人测试结果看精准度会有些偏差,如果对精度要求比较高的话建议还是去插件市场采用原生插件,原生插件应用高德sdk去获取定位精准度可以到小数点后14位,此方案或者uniapp提供的api都只能到小数点后6位

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
uniapp是一个基于Vue.js框架的跨平台应用开发框架,可以使用一套代码同时在多个平台上进行开发,例如iOS、Android和Web等。在uniapp实现app的在线升级功能以及下载进度调控需经过以下步骤: 首先,在后服务器上准备好最新版本的app文件,并提供相应的下载链接。 其次,在uniappApp.vue文件中,监听app的启动事件,通过调用uni.request方法向后发送请求获取最新版本的信息。 然后,与服务器返回的版本信息进行比较,判断是否有新版本需要更新。如果有新版本需要更新,将服务器返回的下载链接存储到本地。 接下来,通过uni.downloadFile方法进行文件下载,同时使用uni.showLoading方法显示下载进度。 在下载过程中,可以通过uni.onDownloadProgress方法监听下载进度变化,并根据下载进度进行相应的界面更新或用户提示。 当下载完成后,使用uni.hideLoading方法隐藏下载进度提示,并提示用户是否立即安装新版本。如果用户选择立即安装,可以通过uni.openDocument方法打开下载的app文件进行安装。 最后,如果用户选择稍后安装或者取消安装,可以在合适的时机再次提醒用户是否需要更新,重复上述步骤。 总之,通过以上步骤,可以实现uniapp app的在线升级功能以及下载进度调控,让用户可以方便地获取到最新版本的app,并且在下载过程中可以实时查看下载进度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值