后台长时间定时定位-Location实践经验

iOS后台持续定位与实时坐标上传完整项目实战 htmltable {th, td {th {pre {简介:在iOS开发中,后台持续定位与实时上传坐标是导航、健身追踪和社交类应用的核心功能。本文基于“ios-后台持续定位,实时上传坐标.zip”项目资源,深入解析如何使用Objective-C或Swift结合Core Location框架实现后台定位服务。 阅读详情

前言

最近接到这样一个需求,每隔固定时间采集用户的位置,然后再把这些数据上传到服务器。研究了下ios的定位功能,在后台定时遇到了一些困难。当app进入后台状态,定时器就不再运行,导致无法取到用户的位置。
在网上查了一些资料,发现有人已经实现了这个功能,它是一个Github上的第三方库,叫Location,不仅能在后台定时采集位置数据,还优化了定位方式,减少耗电。
接下来我们来看看Location是如何实现的以及它存在的问题。

代码结构


Location代码结构
BackgroundTaskManager

负责创建、管理后台任务,提供两个方法,开始和结束后台任务。它实现了后台任务的无限期运行。
@interface BackgroundTaskManager : NSObject

+(instancetype)sharedBackgroundTaskManager;

-(UIBackgroundTaskIdentifier)beginNewBackgroundTask;
-(void)endAllBackgroundTasks;

@end
LocationShareModel

包装了后台任务类,也管理定位定时器。

@interface LocationShareModel : NSObject
@property (nonatomic) NSTimer *timer;
@property (nonatomic) NSTimer * delay10Seconds;
@property (nonatomic) BackgroundTaskManager * bgTask;
@property (nonatomic) NSMutableArray *myLocationArray;
+(id)sharedModel;
@end
LocationTracker

负责管理后台定时定位的主类。
我们先看一下它提供的接口。

+ (CLLocationManager *)sharedLocationManager;

//开始追踪定位
- (BOOL)startLocationTracking;
//停止追踪定位
- (void)stopLocationTracking;
//向服务器发送已获取的设备位置数据
- (void)updateLocationToServer;

LocationTracker类的初始化

+ (CLLocationManager *)sharedLocationManager {
    static CLLocationManager *_locationManager;
    @synchronized(self) {
        if (_locationManager == nil) {
            _locationManager = [[CLLocationManager alloc] init];
            //设备位置精度,这里设置为最高精度
            _locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
            //是否暂停更新
            _locationManager.pausesLocationUpdatesAutomatically = NO;             
            //iOS9的新特性,打开后台位置更新,还要在plist中配置
            if (IOS9ORLATER) {
                _locationManager.allowsBackgroundLocationUpdates = YES;
            }
        }
    }
    return _locationManager;
}

当应用进入后台,借助BackgroundTaskManager无限延长后台任务的存活时间,进行后台采集位置信息。

- (id)init {
    if (self==[super init]) {
        //Get the share model and also initialize myLocationArray
        self.shareModel = [LocationShareModel sharedModel];
        self.shareModel.myLocationArray = [[NSMutableArray alloc]init];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
    }
    return self;
}

-(void)applicationEnterBackground{
    CLLocationManager *locationManager = [LocationTracker sharedLocationManager];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    locationManager.distanceFilter = kCLDistanceFilterNone;

    if(IOS8ORLATER) {
        [locationManager requestAlwaysAuthorization];
    }
    [locationManager startUpdatingLocation];

    //Use the BackgroundTaskManager to manage all the background Task
    self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager];
    [self.shareModel.bgTask beginNewBackgroundTask];
}

持续获取设备的位置,是个特别耗电的任务。为了减少耗电,定时关闭位置服务。在接收到位置信息10秒后,关闭位置服务,一分钟后再重新打开位置服务,这样就达到减少耗电的目的。我们看代码的实现

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

    ......

    self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager];
    [self.shareModel.bgTask beginNewBackgroundTask];

    //Restart the locationMaanger after 1 minute
    self.shareModel.timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self
                                                           selector:@selector(restartLocationUpdates)
                                                           userInfo:nil
                                                            repeats:NO];

    //Will only stop the locationManager after 10 seconds, so that we can get some accurate locations
    //The location manager will only operate for 10 seconds to save battery
    if (self.shareModel.delay10Seconds) {
        [self.shareModel.delay10Seconds invalidate];
        self.shareModel.delay10Seconds = nil;
    }

    self.shareModel.delay10Seconds = [NSTimer scheduledTimerWithTimeInterval:10 target:self
                                                                    selector:@selector(stopLocationDelayBy10Seconds)
                                                                    userInfo:nil
                                                                     repeats:NO];

}

重启位置服务

- (void) restartLocationUpdates
{
    if (self.shareModel.timer) {
        [self.shareModel.timer invalidate];
        self.shareModel.timer = nil;
    }

    CLLocationManager *locationManager = [LocationTracker sharedLocationManager];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    locationManager.distanceFilter = kCLDistanceFilterNone;

    if(IOS8ORLATER) {
        [locationManager requestAlwaysAuthorization];
    }
    [locationManager startUpdatingLocation];
}

按照Location库的设计,在updateLocationToServer方法中,处理向服务器发送信息。

- (void)updateLocationToServer {

    .........

    //TODO: 在这里插入你的代码,处理向服务器发送位置信息


    ........

}

实践

这个类库解决了后台定时定位的问题,使用也很简单,而且还处理了定位耗电的问题,使耗电量降低到每小时5%左右。但在实践的过程中发现它存在一些问题。

  1. 发送数据到服务器方法的定时器,最大支持3分钟;
  2. 发送数据到服务器方法的定时器,在运行2小时后就停止了;
  3. 发送数据到服务器方法的定时器,不准确;

经过一些尝试,废弃了updateLocationToServer方法,将发送数据的代码移到locationManager中,才解决了这几个问题。具体解决方法如下:
首先为LocationTracker类添加一个私有的属性,记录上次执行发送数据的时间。

@interface LocationTracker ()
@property (nonatomic, strong) NSDate *lastSendDate;
@end

在locationManager回调方法中添加自己的代码。

    .......
   //Select only valid location and also location with good accuracy
        if(newLocation!=nil&&theAccuracy>0
           &&theAccuracy<2000
           &&(!(theLocation.latitude==0.0&&theLocation.longitude==0.0))){

            self.myLastLocation = theLocation;
            self.myLastLocationAccuracy= theAccuracy;

            NSMutableDictionary * dict = [[NSMutableDictionary alloc]init];
            [dict setObject:[NSNumber numberWithFloat:theLocation.latitude] forKey:@"latitude"];
            [dict setObject:[NSNumber numberWithFloat:theLocation.longitude] forKey:@"longitude"];
            [dict setObject:[NSNumber numberWithFloat:theAccuracy] forKey:@"theAccuracy"];

            //Add the vallid location with good accuracy into an array
            //Every 1 minute, I will select the best location based on accuracy and send to server
            [self.shareModel.myLocationArray addObject:dict];

            //这里插入代码,处理发送位置数据到服务器
                if (!self.lastSendDate || [[self.lastSendDate dateByAddingHours:1] compare:[NSDate date]] <= 0) {
                    self.lastSendDate = [NSDate date];
                    }
            }


作者:潇潇潇潇潇潇潇
链接:http://www.jianshu.com/p/295a3ae5f8a6
來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载自:http://www.jianshu.com/p/7ccc0860bdbd

小米手机Magisk解锁与Root完整指南:从Bootloader到模块管理 Android系统Root权限获取是设备深度定制的核心技术之一,其核心原理在于通过修改系统启动流程获取超级用户权限。Systemless Root技术通过动态挂载修改,在不触碰系统分区的前提下实现功能注入,既保证了系统完整性,又能绕过完整性检测。这一技术为设备带来了极高的可定制性,用户可以通过模块化方式增强系统功能、修改UI界面或启用隐藏特性。在小米手机生态中,由于官方提供了完整的Bootloader解锁通道,结合Magisk的无系统修改Root方案,使得安全可控的深度定制成为可能。本文聚焦于Bootloa 阅读详情

相关推荐

NMS非极大值抑制算法原理

NMS非极大值抑制算法

pywin 3500

国产PHY芯片YT8512H替代LAN8742A的实战指南(STM32F407平台)

本文详细介绍了在STM32F407平台上,使用国产PHY芯片YT8512H替代LAN8742A的完整实战过程。文章深入剖析了硬件设计中的关键信号连接差异(如CRS_DV与RXDV复用)、时钟布线要点,并提供了软件驱动修改、PHY配置及调试排错的系统指南,旨在帮助工程师高效完成国产化替代,规避常见陷阱。

defi6farmer的博客 854

IOS CLLocationManager 设置定位请求的方式

最近开始学习 CoreLocation 框架,在设置 manager 的刷新方式时,由于在 IOS8.0 更新了两种定位更新的方法,分别为: requestWhenInUseAuthorization() 和 requestAlwaysAuthorization() 在一开始使用的时候,根据网上以前版本的 manager 初始化方法进行初始化,发生定位服务无法正常进行, 于是对这两个方法的设

wumingdezu的博客 480

FreeRTOS实战:STM32CubeMX配置USART+DMA实现高效串口通信(附完整代码)

本文详细介绍了如何使用FreeRTOS和STM32CubeMX配置USART与DMA实现高效串口通信。通过对比轮询、中断和DMA三种模式的性能差异,提供完整的STM32CubeMX配置步骤和代码实现,帮助开发者优化嵌入式系统的串口通信性能,显著提升数据吞吐量和系统响应速度。

weixin_29190169的博客 455

速腾RS-LiDAR-16激光雷达ROS环境搭建与点云可视化实战指南

本文提供速腾RS-LiDAR-16激光雷达在ROS环境下的完整搭建与可视化实战指南。从硬件连接、网络配置、驱动安装编译,到核心参数详解与Rviz点云可视化,手把手解决IP设置、坐标系对齐等常见问题,帮助开发者快速实现激光雷达三维点云数据的采集与显示。

weixin_29271263的博客 369

iOS后台运行模式(background execution mode)

后台运行模式

realyezi的博客 9169

从.har文件到Postman集合:一键转换的完整教程(附避坑指南)

本文详细介绍了如何将.har文件高效转换为Postman集合的完整教程,涵盖基础操作到高级技巧,包括认证信息处理、环境变量提取等痛点问题的解决方案。通过抓包工具记录的.har文件,开发者可以快速生成Postman集合,提升API调试与测试效率,特别适合前后端分离开发模式下的团队协作。

weixin_26795617的博客 384

【HarmonyOS学习】定位相关知识(Locationkit)

LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。 可以实现点击获取用户位置信息、持续获取位置信息和区域进出监控等多项功能。

包包熊的博客 920

Openharmony 命令行工具hdc的获取与安装

OpenHarmony实战:命令行工具hdc安装应用指南_hdc工具-优快云博客t=N7T8。

Devlin_的博客 1万+

华为无线AP+AC(ensp)

VLAN 100--192.168.100.0/24为AP的管理IP地址VLAN10--192.168.10.0/24为无线用户获取的IP地址在DHCP Server(LSW3)上查看地址分配情况。

abcdlalal的博客 1万+

后台定位上传的代码实践

前言 之前的文章说过 我现在做的是LBS定位的社交APP 其中主要的一个功能就是能够实时定位社交圈中各个成员的位置 后台实时上传位置则是非常重要的一个技术点 接下来就来说说我关于这方面的实践经验 需求 先来看看实现这个功能的具体需求是什么 由于我们是实时定位的生活类社交APP 所以我们需要做到一下几点 1. 如果用户的位置在持续变化 则隔一段时间上报一次

Bob的专栏 824

扫码登录原理

扫码登录功能通过PC端与移动端的交互实现安全认证,分为三个阶段:待扫描阶段生成唯一二维码ID并轮询状态;已扫描阶段移动端提交token与二维码ID关联,生成临时token并要求用户确认;确认阶段验证临时token后为PC端生成正式登录凭证。整个过程通过二维码唯一性、状态轮询和二次确认机制确保安全性,防止未授权登录,最终完成跨设备认证流程。

阿杰同学的博客 345

iOS后台定位如何持续更新又省电?Location项目10秒停止加60秒重启定时器策略深度解析

**iOS后台定位**是很多移动应用绕不开的需求:App 退到后台后,系统会很快把它挂起,GPS 停止上报,导致轨迹断点、耗电飙升。开源项目 **Location** 针对 iOS 7/8 给出了一套经过实机验证的后台定位更新方案,核心思路是「**10秒停止 + 60秒重启**」的定时器策略——让 CLLocationManager 只工作 10 秒就关掉,60 秒后再唤醒,用最短的 GPS 工作

gitblog_00467的博客 820

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS 保持APP在后台长时间运行

官方网站: https://developer.apple.com/documentation/uikit/core_app/managing_your_app_s_life_cycle/preparing_your_app_to_run_in_the_background?language=objc 一、iOS 应用程序5个状态 1、停止运行-应用程序已经终止,或者还未启动。 2、不活动-应用程...

heqiang2015的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

为什么iOS会杀掉后台定位更新?深入剖析suspended挂起机制与Location项目绕过方案原理对比

如果你正在开发**iOS 后台定位**应用,一定被同一个问题折磨过:应用一退到后台,定位更新就"断流"了。开源项目 **Location**(iOS 7/8 后台定位更新编程示例)正是为了解决这个问题而生——它让你在前台和后台都能持续获取设备位置,并周期性上报服务器。本文将用通俗的方式讲清楚:iOS 为什么要挂起(suspended)你的应用、系统机制的原理,以及 Location 项目是如何一步

gitblog_00097的博客 432

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Location项目架构详解:4大核心组件如何协作实现持续后台位置追踪

Location 是一个开源的 iOS 后台位置追踪(Background Location Update)示例项目,帮助 App 在前台和后台都能持续获取设备位置,并在 iOS 7 / iOS 8 上实现长时间稳定的后台位置更新与上报。本文带你快速看懂它的整体架构:4 大核心组件如何分工协作,让"后台持续定位"这件难题变得可控。 ## 为什么 iOS 后台位置追踪这么难?😮 在 iOS 7

gitblog_00910的博客 195

iOS App后台保活

奇技指南 前段时间,笔者和GY哥一起吃饭聊天的时候,GY哥问了笔者一个问题,iOS App 可以后台保活吗?是如何做到后台保活的?当时笔者只想到了可以在后台播放静音的音乐,对于唤醒App,可以考虑使用推送的方式。GY哥提到播放静音文件会影响上线吗?这我就不大知道了……由于没有相关实践,笔者后来在网上查了相关资料,总结了本文。 本文转载自公众号QiShare 笔者查询了相关资料后发现,iOS App...

weixin_46837673的博客 3647

iOS 后台持续定位

项目需要,加了长时间后台定位(计时器控制后台运行时间),现在把代码发给大家哈 本人只测试了定时一小时控制后台获取位置信息,肯定可以更长时间的运行,不过耗电那是当然的了,所以做类似软件一定要先提醒用户,避免被拒和被用户差评! 一、首先。在Info.plist里面添加Key:Required background modes  Value:App registers for

love_Coders的专栏 989

Android 7.0以上关闭屏幕,高德地图后台持续定位

不知道大家在用高德地图的时候有没有发现,7.0以上的手机屏幕关闭后如果还在定位的话间隔两分钟后定位就停止了,8.0以上就更加了 用官方的通知也没用。下面说重点: 用服务定位通过广播发送在页面里面接收,这种能在后台定位2个小时左右,两个小时后还是会熄灭一切操作,不过两个小时已经可以满足大多数要求了吧。如果还需要更久那就定时重启服务,前提是应用没被杀死 只针对熄屏操作。下面是代码: package com.swq.mcsrefine.service; import android.app.AlarmM.

weixin_42602900的博客 4448

uniapp跨平台定位实践:从权限配置到后台持续追踪

本文详细介绍了uniapp跨平台定位实践,涵盖权限配置、后台持续追踪等关键技术。针对Android和iOS系统的差异化限制,提供了实时定位、保活策略和息屏定位的解决方案,帮助开发者实现高效稳定的位置追踪功能。

weixin_30733003的博客 298

iOS后台运行浅析

在之前的文章《App States and Multitasking IOS应用程序状态和多任务》 说到IOS程序有前台后台之分。在IOS程序进入后台之后,程序就会不执行代码,如果非要有什么必须执行的过程,可以申请大约600s的时间,如果在这段时间内程序还没有完成则会被系统杀死。出现:has active assertions beyond permitted time.  更多IOS后台

Dogg 596

如何过滤无效位置数据?Location项目位置新鲜度、精度与坐标三重过滤及最优位置选择算法

**Location** 是一个面向 iOS 7/8 的后台持续定位项目,核心价值就在于教会我们如何过滤无效位置数据:它对每一条 GPS 原始数据做**位置新鲜度、水平精度、坐标有效性三重过滤**,再用一套极简的"最优位置选择算法"从多个候选点中挑出最准的一个上报服务器。对于正在开发定位类 App 的新手来说,这套"先过滤、再择优、最后上报"的思路可以直接照搬。 ## 为什么 GPS 原始数据必

gitblog_00228的博客 796

android:应用程序内定位处理,百度定位,高德定位,系统定位处理.

文章来自:http://blog.youkuaiyun.com/intbird 关于定位的几点体验 地图上使用定位 定位信息说明 应用内确保定位返回结果思考 应用内使用定位服务代码 代码基础使用方法关于定位的几点体验: 百度定位:定位返回很快,很及时,推荐使用,单次定位,能很大程度的保证应用获取位置,5.1的定位有了位置提醒; 高德定位:和系统的很像,需要设置定位的米和时间,有时候不返回,有时候返回一大推,不清

intbird的专栏 2674

IOS后台运行浅析

在之前的文章《App States and Multitasking IOS应用程序状态和多任务》说到IOS程序有前台后台之分。在IOS程序进入后台之后,程序就会不执行代码,如果非要有什么必须执行的过程,可以申请大约600s的时间,如果在这段时间内程序还没有完成则会被系统杀死。出现:has active assertions beyond permitted time. 更多IOS后台内容参考...

weixin_30569153的博客 110

Cindy Mobile 开发与验证全指南:模拟器身份链、冷更边界与移动端运行时实现

本文以 Cindy 仓库的 Mobile 开发规范为主线,讲清 `apps/mobile` 从日常启动、调试、验证到发版前审查的完整闭环:如何确认“模拟器里跑的确实是当前 worktree 的代码”、如何按 `fingerprint` 策略判断一次改动是否会触发冷更、以及相册原图、离线图片、消息缓存、入站分享、Android 应用内更新等专项能力的实现边界。读完后,你可以独立搭起一套可复现、可留证

gitblog_00147的博客 546
上一篇: 常用的iOS第三方资源
下一篇: Apple Configurator用法(MDM黑白名单实现)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值