后台地图的定时定位

原创 2016年05月30日 22:51:49

听说了一些比较流氓的的需求,其中就有iOS的定时定位。可以实现任意时间对用户的定位,只有用户不主动杀死该程序。利用了类似于歌曲后台播放时,只用你不主动切断程序,程序就会一直运行。

首先、导入AVFoundation.framework库。AVFoundation是一个可以用来使用和创建基于时间的视听媒体的框架,它提供了一个能使用基于时间的视听数据的详细级别的Objective-C接口。

//在AppDelegate中导入头文件。当进入后台后可调用。

#import <AVFoundation/AVFoundation.h>  //可以就行类似于音乐播放的操作。

#import <CoreLocation/CoreLocation.h> //必须使用系统的地图定位功能

在info.plist 加入如下:
这里写图片描述


//声明全局属性,方便操作。

@property (strong, nonatomic)CLLocationManager *locationManager;  //

@property (assign, nonatomic)BOOL isLogation;      //判断是否定位

@property (assign, nonatomic) CGFloat deviceLevel; //记录电量

@property (strong, nonatomic) NSTimer *myTimer;  //定时器

利用懒加载,可防止多次的初始化


#pragma mark --------懒加载----------

- (CLLocationManager *)locationManager {

if (!_locationManager) {

_locationManager = [[CLLocationManager alloc] init];

//取得用户授权  不管应用是否在前台运行,都可以获取用户授权;

[_locationManager requestAlwaysAuthorization];

//定位服务,每隔多少米定位一次;

_locationManager.distanceFilter = 100;

//定位的精确度,越高越耗电

_locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

//指定代理

_locationManager.delegate = self;

_locationManager.pausesLocationUpdatesAutomatically = NO; //该模式是抵抗ios在后台杀死程序设置,iOS会根据当前手机使用状况会自动关闭某些应用程序的后台刷新,该语句申明不能够被暂停,但是不一定iOS系统在性能不佳的情况下强制结束应用刷新

}

return _locationManager;

}

在didFinishLaunchingWithOptions就行定位与定时器的初始化。


//确保后台运行

NSError *error1 = nil;

NSError *error2 = nil;

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error1];

[[AVAudioSession sharedInstance] setActive:YES error:&error2];

self.isLogation = [CLLocationManager locationServicesEnabled];

NSLog(@"%.2f",[self getCurrentBatteryLevel]);

//是否可定位

if (self.isLogation) {

_myTimer =  [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(startLocation) userInfo:nil repeats:YES];

[self.myTimer setFireDate:[NSDate distantFuture]];  //先暂停定时器,当应用程序进入后台后再打开。这可根据需求进行修改。

}else {

NSLog(@"洗洗睡吧");

}

在程序进入后台后可进行后台定位操作applicationDidEnterBackground


//开启不停歇定位

UIApplication *app = [UIApplication sharedApplication];

__block UIBackgroundTaskIdentifier identifier;

identifier = [app beginBackgroundTaskWithExpirationHandler:^{

dispatch_async(dispatch_get_main_queue(), ^{

if (identifier != UIBackgroundTaskInvalid) {

identifier = UIBackgroundTaskInvalid;

}

});

}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

dispatch_async(dispatch_get_main_queue(), ^{

if (identifier != UIBackgroundTaskInvalid) {

identifier = UIBackgroundTaskInvalid;

}

});

});

if (self.isLogation) {

[self.myTimer setFireDate:[NSDate distantPast]];

}else { //用过未开启定位服务;

NSLog(@"洗洗睡吧");

}

需要如下方法


#pragma mark -------定时器代理方法------

- (void)startLocation {       

 if ([self getCurrentBatteryLevel]>0.4f) {            

    //开始定位      

  [self.locationManager startUpdatingLocation];

   }else {             

   [self.myTimer invalidate];       

 self.myTimer = nil;    }

}

#pragma mark -------地图代理方法--------

//实时获取的定位信息    代理方法会被多次执行

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

if (locations.count) {

//获取最新位置

CLLocation *location = locations.lastObject;

NSString *str = [NSString stringWithFormat:@"%.2f:%.2f",location.coordinate.latitude,location.coordinate.longitude];

NSLog(@"%@",str);

[self.locationManager stopUpdatingLocation];

}

}

//定位失败

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

if ([error code] == kCLErrorDenied) {

NSLog(@"定位被拒绝");

}

if ([error code] == kCLErrorLocationUnknown) {

NSLog(@"定位失败 = %@", error);

}

}

#pragma mark -------判断电量------------

- (CGFloat)getCurrentBatteryLevel {

[UIDevice currentDevice].batteryMonitoringEnabled = YES;

return [UIDevice currentDevice].batteryLevel;

}

https://github.com/ChineseMao/backstageLocation1.git小小demo请拿走

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android高德地图实现后台定位

在项目当中,很多时候都会用到地图,百度地图是我们经常用的,下面我给大家用高德地图实现后台定位,这样可以实现轨迹的路线: public class LocationService extends Se...
  • Chen_xiaobao
  • Chen_xiaobao
  • 2017年01月13日 15:21
  • 3695

高德地图实战:后台持续定位实现

最近有个项目需求,要求应用只要打开后,就要每隔一段时间发送一次自身的位置,即便是应用退出了,也同样要在后台持续该功能。 在开始的时候,我准备用后台服务Service机制来实现这一功能,但是想到Ser...
  • yus201120
  • yus201120
  • 2017年02月16日 10:42
  • 3309

Android基于高德地图实时定位服务

Service功能有:实时定位(后台进行) Service不会,去百度谷歌 功能有 实时定位(30秒间隔) 判断是否在规定的时间段内 判断距离是否大于规定的距离 判断服务是否在开启的状态服...
  • qq_24536171
  • qq_24536171
  • 2017年03月27日 14:07
  • 1835

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

之前有做一个定位的项目,类似嘀嘀打车那样。 需要后台持续定位。 这里选择了百度地图,不过在后台持续定位方面, 之前只是简单的设置如下: 不过经测试发现, 这样设置完,在后台运行...
  • shaobo8910
  • shaobo8910
  • 2015年07月04日 16:18
  • 2454

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

之前有做一个定位的项目,类似嘀嘀打车那样。 需要后台持续定位。这里选择了百度地图,不过在后台持续定位方面, 之前只是简单的设置如下:不过经测试发现, 这样设置完,在后台运行大概30分钟,又会被cras...
  • hitwhylz
  • hitwhylz
  • 2014年12月15日 22:40
  • 2952

后台长时间定时定位iOS

  • 2017年07月19日 19:09
  • 132KB
  • 下载

iOS后台持续定位并定时上传

最近做一个考勤APP,功能很简单,就是一直在后台运行,每隔固定时间向服务器上传一次位置信息。持续运行24小时测试,功能实现。 1.ViewController.h文件: #import 并实现 ...
  • dolacmeng
  • dolacmeng
  • 2015年04月15日 21:05
  • 14449

iOS后台持续定位并定时上传

最近做一个考勤APP,功能很简单,就是一直在后台运行,每隔固定时间向服务器上传一次位置信息。持续运行24小时测试,功能实现。 1.ViewController.h文件: ...
  • walkerwqp
  • walkerwqp
  • 2016年07月05日 15:34
  • 1086

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

前言 最近接到这样一个需求,每隔固定时间采集用户的位置,然后再把这些数据上传到服务器。研究了下ios的定位功能,在后台定时遇到了一些困难。当app进入后台状态,定时器就不再运行,导致无法取到用户的位置...
  • iOSCircleAndCircle
  • iOSCircleAndCircle
  • 2017年07月19日 17:34
  • 503

Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息

http://www.cnblogs.com/wangfenjin/archive/2013/01/09/2853307.html?utm_source=tuicool 本文主要介绍了And...
  • mafei852213034
  • mafei852213034
  • 2015年10月15日 18:50
  • 846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:后台地图的定时定位
举报原因:
原因补充:

(最多只允许输入30个字)