iOS 后台持续定位
2015-08-18 14:49
513 查看
项目需要,加了长时间后台定位(计时器控制后台运行时间),现在把代码发给大家哈
本人只测试了定时一小时控制后台获取位置信息,肯定可以更长时间的运行,不过耗电那是当然的了,所以做类似软件一定要先提醒用户,避免被拒和被用户差评!
一、首先。在Info.plist里面添加Key:Required
background modes
Value:App registers for location updates
二、初始化
#define RUNTIME 60*60//当然是控制在一小时以内
- (void)viewDidLoad
{
[superviewDidLoad];
[self initData];
//响应后台
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotificationobject:nil];
}
//初始化数据
-(void)initData{
backgroundUpdateInterval= RUNTIME;//设置计时器时间
self._saveLocations =
[[NSMutableArray alloc] init];
self._locationManager=
[[CLLocationManageralloc] init];
self._locationManager.desiredAccuracy= kCLLocationAccuracyBest;
self._locationManager.delegate= self;
[self._locationManagerstartUpdatingLocation];
}
三、更新定位
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
//在地图上加大头针
MKPointAnnotation*annotation
= [[MKPointAnnotationalloc] init];
annotation.coordinate =
newLocation.coordinate;
[self._mapView addAnnotation:annotation];//
[self._saveLocations addObject:annotation];
if(UIApplication.sharedApplication.applicationState== UIApplicationStateActive)
{
if(backgroundTask!= UIBackgroundTaskInvalid)//如果后台没有关闭,结束
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
//显示所有的大头针
for (MKPointAnnotation *annotation in self._saveLocations)
{
CLLocationCoordinate2D coordinate
= annotation.coordinate;
MKCoordinateRegionregion=MKCoordinateRegionMakeWithDistance(coordinate,storedLatitudeDelta,storedLongitudeDelta);
MKCoordinateRegion adjustedRegion
= [_mapView regionThatFits:region];
[_mapView setRegion:adjustedRegion animated:NO];
}
}
else
{
NSLog(@"applicationD
in Background,newLocation:%@", newLocation);
}
}
四、后台加入计时器
//用定时器控制后台运行定位时间
-(void)applicationDidEnterBackground:(NSNotificationCenter *)notication{
UIApplication*
app = [UIApplicationsharedApplication];
backgroundTask=
[app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"applicationD
in Background");
}];
//加入定时器,用来控制后台运行时间
self._updateTimer=
[NSTimerscheduledTimerWithTimeInterval:backgroundUpdateInterval
target:self
selector:@selector(stopUpdate)
userInfo:nil
repeats:YES];
[[NSRunLoopcurrentRunLoop] addTimer:self._updateTimerforMode:NSRunLoopCommonModes];
}
五、计时时间到,停止后台运行与定位
-(void)stopUpdate{
[self._locationManagerstopUpdatingLocation];
[self._updateTimerinvalidate];
self._updateTimer= nil;
if(backgroundTask!= UIBackgroundTaskInvalid)
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
}
六、用模拟器测试方法
用模拟器测试的时候选择:调试-位置-后三者都行
然后在控制台就可以看到后台输出的信息了
本人只测试了定时一小时控制后台获取位置信息,肯定可以更长时间的运行,不过耗电那是当然的了,所以做类似软件一定要先提醒用户,避免被拒和被用户差评!
一、首先。在Info.plist里面添加Key:Required
background modes
Value:App registers for location updates
二、初始化
#define RUNTIME 60*60//当然是控制在一小时以内
- (void)viewDidLoad
{
[superviewDidLoad];
[self initData];
//响应后台
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotificationobject:nil];
}
//初始化数据
-(void)initData{
backgroundUpdateInterval= RUNTIME;//设置计时器时间
self._saveLocations =
[[NSMutableArray alloc] init];
self._locationManager=
[[CLLocationManageralloc] init];
self._locationManager.desiredAccuracy= kCLLocationAccuracyBest;
self._locationManager.delegate= self;
[self._locationManagerstartUpdatingLocation];
}
三、更新定位
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
//在地图上加大头针
MKPointAnnotation*annotation
= [[MKPointAnnotationalloc] init];
annotation.coordinate =
newLocation.coordinate;
[self._mapView addAnnotation:annotation];//
[self._saveLocations addObject:annotation];
if(UIApplication.sharedApplication.applicationState== UIApplicationStateActive)
{
if(backgroundTask!= UIBackgroundTaskInvalid)//如果后台没有关闭,结束
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
//显示所有的大头针
for (MKPointAnnotation *annotation in self._saveLocations)
{
CLLocationCoordinate2D coordinate
= annotation.coordinate;
MKCoordinateRegionregion=MKCoordinateRegionMakeWithDistance(coordinate,storedLatitudeDelta,storedLongitudeDelta);
MKCoordinateRegion adjustedRegion
= [_mapView regionThatFits:region];
[_mapView setRegion:adjustedRegion animated:NO];
}
}
else
{
NSLog(@"applicationD
in Background,newLocation:%@", newLocation);
}
}
四、后台加入计时器
//用定时器控制后台运行定位时间
-(void)applicationDidEnterBackground:(NSNotificationCenter *)notication{
UIApplication*
app = [UIApplicationsharedApplication];
backgroundTask=
[app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"applicationD
in Background");
}];
//加入定时器,用来控制后台运行时间
self._updateTimer=
[NSTimerscheduledTimerWithTimeInterval:backgroundUpdateInterval
target:self
selector:@selector(stopUpdate)
userInfo:nil
repeats:YES];
[[NSRunLoopcurrentRunLoop] addTimer:self._updateTimerforMode:NSRunLoopCommonModes];
}
五、计时时间到,停止后台运行与定位
-(void)stopUpdate{
[self._locationManagerstopUpdatingLocation];
[self._updateTimerinvalidate];
self._updateTimer= nil;
if(backgroundTask!= UIBackgroundTaskInvalid)
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
}
六、用模拟器测试方法
用模拟器测试的时候选择:调试-位置-后三者都行
然后在控制台就可以看到后台输出的信息了
相关文章推荐
- iOS iOS8注册通知
- iOS开发中如何获取设备唯一标识
- iOS 初始化 懒加载
- IOS Core Data框架初探
- github优秀开源项目大全-iOS
- 【iOS】iPhone屏幕尺寸、分辨率及适配(详细深入了解)
- github优秀开源项目大全-iOS
- iOS 常见系统库介绍
- iOS蓝牙开发入门06--demo的外设代码释义
- iOS内存管理
- iOS设计模式之单例模式
- iOS tableview复用时候崩溃
- iOS 手机没有安装支付宝的情况下,不调支付宝网页的解决办法
- iOS URL scheme
- iOS Block学习
- ios设计模式之代理模式
- iOS开发 -- 程序常见错误(不定时更新,适合初学)
- iOS开发 -- 置顶按钮功能实现
- iOS开发中SVN管理工具的使用
- Block的应用场景