最近做一个考勤APP,功能很简单,就是一直在后台运行,每隔固定时间向服务器上传一次位置信息。持续运行24小时测试,功能实现。

1.ViewController.h文件:

#import <CoreLocation/CoreLocation.h>并实现CLLocationManagerDelegate 代理,.h文件完整代码如下:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>@interface ViewController : UIViewController<CLLocationManagerDelegate>@end

2.info.list文件:

右键,Add Row,添加的Key为NSLocationAlwaysUsageDescription,其它值默认,示例如下:

3.添加后台定位权限

4.ViewController.m 文件:

(1)定义一个私有CLLocationManager对象

(2)初始化并设置参数(initLocation方法),其中

locationManager.desiredAccuracy设置定位精度,有六个值可选,精度依次递减

kCLLocationAccuracyBestForNavigation

kCLLocationAccuracyBest

kCLLocationAccuracyNearestTenMeters

kCLLocationAccuracyHundredMeters

kCLLocationAccuracyKilometer

kCLLocationAccuracyThreeKilometers

locationManager.pausesLocationUpdatesAutomatically 设置是否允许系统自动暂停定位,这里要设置为NO,刚开始我没有设置,后台定位持续20分钟左右就停止了!

(3)实现CLLocationManagerDelegate的代理方法,此方法在每次定位成功后调用:

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

*也可以通过实现以下方法:

- (void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation

fromLocation:(CLLocation *)oldLocation

(4)实现CLLocationManagerDelegate的代理方法,此方法在定位出错后调用:

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

.m文件完整代码如下:
#import "ViewController.h"@interface ViewController (){CLLocationManager *locationManager;CLLocation *newLocation;CLLocationCoordinate2D coordinate;
}@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[self initLocation];
}#pragma mark 初始化定位
-(void)initLocation {locationManager=[[CLLocationManager alloc] init];locationManager.delegate = self;locationManager.desiredAccuracy = kCLLocationAccuracyBest;//设置定位精度if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){[locationManager requestWhenInUseAuthorization];}if(![CLLocationManager locationServicesEnabled]){NSLog(@"请开启定位:设置 > 隐私 > 位置 > 定位服务");}if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {[locationManager requestAlwaysAuthorization]; // 永久授权[locationManager requestWhenInUseAuthorization]; //使用中授权}locationManager.pausesLocationUpdatesAutomatically = NO;[locationManager startUpdatingLocation];//[locationManager startMonitoringSignificantLocationChanges];
}#pragma mark 定位成功
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{newLocation = [locations lastObject];double lat = newLocation.coordinate.latitude;double lon = newLocation.coordinate.longitude;NSLog(@"lat:%f,lon:%f",lat,lon);
}#pragma mark 定位失败
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{NSLog(@"error:%@",error);
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end
**经过充电状态下以及非充电状态下测试各24小时,APP运行正常,下图为考勤记录截图,另外测试时,每次定位成功都将日志保存到本地plist文件中中,方法链接:http://blog.csdn.net/dolacmeng/article/details/44805953
(5)以上方法虽然可以让APP在后台运行,但是定位是一直在运行着,难免产生耗电量大的问题,从iOS6开始,Apple提供了方法 allowDeferredLocationUpdatesUntilTraveled:timeout: ,可以设置在用户移动多远距离或者经过多少时间间隔后才进行一次定位,从而达到省电的目的。
官方说明文档:
官方示例代码:
// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)managerdidUpdateLocations:(NSArray *)locations {// Add the new locations to the hike[self.hike addLocations:locations];// Defer updates until the user hikes a certain distance// or when a certain amount of time has passed.if (!self.deferringUpdates) {CLLocationDistance distance = self.hike.goal - self.hike.distance;NSTimeInterval time = [self.nextAudible timeIntervalSinceNow];[locationManager allowDeferredLocationUpdatesUntilTraveled:distancetimeout:time];self.deferringUpdates = YES;}
}

因此我们把didUpdateLocations方法改成这样(deferringUpdates是BOOl类型全局变量,标记是否是Defer):

#pragma mark 定位成功

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{newLocation = [locations lastObject];double lat = newLocation.coordinate.latitude;double lon = newLocation.coordinate.longitude;NSLog(@"lat:%f,lon:%f",lat,lon);if (!self.deferringUpdates) {CLLocationDistance distance = 500;NSTimeInterval time = 20;[locationManager allowDeferredLocationUpdatesUntilTraveled:distancetimeout:time];self.deferringUpdates = YES;}
}
但是经过测试,还是没有达到延时的效果,经过查看官方文档和Google后,可能的原因有1.需要使用iphone5及以上的硬件设备(模拟器不得行)2.有其它APP也在请求定位信息,先把他们结束掉。。。。等等等,可以看看这篇论坛讨论:https://devforums.apple.com/message/766429#766429

iOS后台持续定位并定时上传相关推荐

  1. iOS开发 - 百度地图后台持续定位

    2019独角兽企业重金招聘Python工程师标准>>> 之前有做一个定位的项目,类似嘀嘀打车那样. 需要后台持续定位. 这里选择了百度地图,不过在后台持续定位方面, 之前只是简单的设 ...

  2. iOS视频录制、压缩、上传(整理)

    iOS视频录制.压缩.上传(整理) 我们在项目中有时会碰到视频相关的需求,一般的可以分为几种情况: 1. 简单的视频开发,对界面无要求,可直接使用系统UIImagePickerController. ...

  3. Android--高德地图后台持续定位

    核心类/接口 类 接口 说明 版本 AMapLocationClient startLocation(); 启动定位 V2.0.0版本起 setLocationOption(mLocationOpti ...

  4. 微信小程序后台持续定位功能使用详解

    微信小程序团队在7月30日更新了 基础库 2.8.0 其中新添加了小程序后台持续定位功能和联系定位的接口 从上到下分别是 1.wx.onLocationChange//监听位置实时变化 2.wx.st ...

  5. curl post https_Linux命令cURL详解,并实现文件定时上传到ftp服务器的程序

    前言 前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现.我记得之前做过 一个项目:为高通的iot模组编写FOTA功能:实现模组可以远程下载升级镜像包,实现版本升级功能.并当时使用的一个超级 ...

  6. 使用Linux命令cURL实现文件定时上传到ftp服务器的程序

    前言 前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现.我记得之前做过 一个项目:为高通的iot模组编写FOTA功能:实现模组可以远程下载升级镜像包,实现版本升级功能.并当时使用的一个超级 ...

  7. H5+App后台持续定位功能实现

    H5+App后台持续定位功能实现 1. 项目需求 2. 实现过程 3.最终实现 4. 关于测试用例 1. 项目需求 最近有个需求就是需要完成在后台的实时定位,并且要将获取到的定位信息写到Map控件上去 ...

  8. curl http header_利用Linux命令cURL实现文件定时上传到ftp服务器的小程序,实用

    前言 前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现.我记得之前做过 一个项目:为高通的iot模组编写FOTA功能:实现模组可以远程下载升级镜像包,实现版本升级功能.并当时使用的一个超级 ...

  9. 微信小程序后台持续定位功能使用

    微信小程序团队在7月30日更新了 基础库 2.8.0 其中新添加了小程序后台持续定位功能和联系定位的接口 从上到下分别是 1.wx.onLocationChange//监听位置实时变化 2.wx.st ...

最新文章

  1. 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
  2. 昔日的独角兽Docker资金紧张,未来前途未卜
  3. node-mongo-服务器封装
  4. linux 时间戳 c语言,c语言中的时间戳和时间格式
  5. JAVA语法——经典题目01
  6. 仔细学习CSS(一)
  7. 重磅!清华这个决定冲上热搜!网友:不愧是清华…
  8. typedef的使用详解
  9. 美国10大计算机软件,美国计算机软件工程专业研究生排名
  10. 最新EXCEL使用技巧大全
  11. 创龙SOM-TL437xF 核心板简介(二)
  12. r语言爬虫和python爬虫哪个好-R语言爬虫常用方法总结(以案例说明)
  13. Ensemble查看基因的外显子信息,并根据染色体位点判断是第几号外显子
  14. html如何制作圣诞树,分享用HTML5来实现一个3D逼真的圣诞树
  15. UE GamePlay学习笔记
  16. ReactOS LiveUSB
  17. 目标检测(四)——xml快速上手(可完整实现)
  18. Jenkins——Jenkins介绍+基于云平台的Jenkins安装和持续集成环境配置(插件+用户权限+凭据+Maven打包)
  19. 百度百科里的个人介绍是怎么做上去的,人物百度百科词条创建
  20. 带你了解磁盘驱动程序(xv6)

热门文章

  1. github后端开发面试题大集合(一)
  2. Java NIO中的Buffer
  3. [转载]SSH框架搭建详细图文教程
  4. selenium webdriver - 结束进程
  5. 三维重建【三】-------------------(三维重建资料收集)
  6. Linux下的Memcache安装(含libevent的安装)
  7. 适当地使用公共语言运行库的垃圾回收器和自动内存管理
  8. 主成分分析(PCA) C++ 实现
  9. windows10 vs2013控制台工程中添加并编译cuda8.0文件操作步骤
  10. Caffe源码中Solver文件分析