uniapp App端后台间隔时间发送定位功能实现
文章目录
- 前言
- 一、核心api
- 二、代码实现
- 1.locationWatcher.js:
- 2.页面引用
- 运行结果
- 三、注意事项
前言
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') { //ioslet 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:开启步骤生成的监听器idplus.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:'',//监听器idmaximumAge: 10 * 1000//间隔时间10s}},methods: {//开启定位功能open(){locationWatcher.startLocationService(e=>{let {latitude,longitude}=e.positionconsole.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位
uniapp App端后台间隔时间发送定位功能实现相关推荐
- uniapp APP端视频轮播问题
uniapp APP端视频轮播问题(黑屏,变形) 今天接到一个需求:需要在商品详情轮播展示视频,本以为很简单,但是发现好多坑,在app端出现黑屏,卡顿,变形,视频只展示半屏的情况. 完整代码放底下了 ...
- uni-app APP端-微信登录流程
uni-app APP端-微信登录流程 手把手教学 1.前期准备 在微信开放平台注册账户 微信开放平台 (qq.com) 在管理中心中创建移动应用项目,按要求填写相关信息 审核通过后即可获得我们所需的 ...
- uniapp App端使用高德地图
uniapp App端使用高德地图 第一步: 先去高德官网申请keyhttps://console.amap.com/dev/key/app 关于SHA1生成方法如下:https://lbs.amap ...
- uniApp APP端调起微信支付失败errCode:-100的踩坑
使用了在开放平台配置好包名和签名后调试,在有的机型上通过调试可以调起微信支付,但是打包成apk就调起失败,有一种可以成功的结果,反向推断出代码肯定没有问题.但是控制台报errCode:-100的错. ...
- FPGA串口收发(四):接收数据并转发,间隔时间发送
FPGA串口收发(四):接收数据并转发,间隔时间发送 // Description: 串口收发:串口接收数据,内部生成数据,串口间隔特定时间发送数据 // 串口接收数据:串行信号线 1101_1000 ...
- uniapp app端使用html2canvas和renderjs实现生成海报图
uniapp app端使用html2canvas和renderjs实现生成海报图 原本app端是无法使用html2canvas的因为,app端不支持浏览器js. 不过我在uniapp里面看到了rend ...
- uniapp App端 echarts 设置tooltip的formatter不生效问题及解决办法
一.开发需求 在App端实现,图表的tooltip提示框中展示数值的单位.如下图: 二.遇到的问题 1.首先想到的是对tooltip进行相关的设置,然后试了两种方式,都没有效果. (1)设置toolt ...
- uniapp APP端运行报错 cid unmatched at view.umd.min.js:1
最近写的一个IM即时通讯系统差不多算是完善了,在h5端调试着一般都没有什么很难搞的bug.然而就在昨天,将项目运行到模拟器时聊天界面获取历史记录消息并渲染在页面上时,却报了一堆很奇怪的错误 cid u ...
- uniApp App端跳转到深色页面闪白记录及优化处理方法
此方法仅针对App端 (IOS 未测试). 问题产生 从亮色页面切换到深色页面,切换过程中会先出来白底(闪一下),然后才会出现页面内容. 一般首次打开深色页面时候不会出现,二次进入深色页面才会出现以上 ...
最新文章
- 1069 The Black Hole of Numbers
- Linux内核--异常和中断的区别
- java ios websocket_Java WebSocket的例子
- Matlab神经网络十讲(7): Self-Organizing and LVQ Networks
- HDLBits答案(10)_D触发器、同步与异步复位、脉冲边沿检测
- TFBOYS饭票上线引热议,骗局之外,区块链技术能重构娱乐产业吗?
- 深入理解python面向对象_转:Python3 面向对象,较为深入的两个理解
- SparkStreaming之transform
- 大数据笔记(二十一)——NoSQL数据库之Redis
- gogs 把用户加入团队
- #10015 灯泡(无向图连通性+二分)
- python正则判断邮箱_Python实现正则表达式匹配任意的邮箱方法
- IDC机房的网络防火墙设备
- 在html里怎么给表单加上边框,html如何给table表单加边框
- 小程序开发之全栈开发(一)
- 货车什么叫半挂?什么叫全挂?
- 少女口述:我跟一个小混混那不堪回首的感情
- Qt Designer如何设置GroupBox的标题字体大小,不改变其他字体
- 转让英孚10个月课程
- php检测网页连接速度,xyphp.com
热门文章
- 伯禹公益AI《动手学深度学习PyTorch版》Task 05 学习笔记
- 古文选读161篇--蔡礼旭老师选
- java 记录微信转发次数_微信分享朋友圈记录分享次数统计实现
- python爬虫微博图片_python爬取微博图片及内容
- C# dotnet 使用 OpenXml 解析 PPT 元素的坐标和宽度高度
- Linux 环境部署|Anaconda及Tensorflow
- 【GPU Gems 学习笔记】Rendering Water Caustics
- 中标麒麟操作系统安装MySQL5.7.22
- 从高通手动搜网代码流程看sd脚本的执行
- 学习Servlet2