IOS的后台任务之: location updates
2016-06-21 11:25
489 查看
后台挂起时不断获取当前用户位置
(-)CLLocationManager 类需要使用单例的方法创建:
(二)AppDelegate类实现方法:(变量只能声明在.h文件!!!)
@property (assign,nonatomic)UIBackgroundTaskIdentifier
bgTask;
@property (strong,nonatomic)dispatch_block_t
expirationHandler;
@property (assign,nonatomic)BOOLjobExpired;
@property (assign,nonatomic)BOOL
background;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//此处省略一些语句
UIApplication* app = [UIApplication sharedApplication];
__weak AppDelegate* selfRef = self;
self.expirationHandler = ^{
[app endBackgroundTask:selfRef.bgTask];
selfRef.bgTask = UIBackgroundTaskInvalid;
selfRef.bgTask = [app beginBackgroundTaskWithExpirationHandler:selfRef.expirationHandler];
selfRef.jobExpired = YES;
while(selfRef.jobExpired){
NSLog(@"等待180s循环进程的结束");
[NSThread sleepForTimeInterval:1];
}
[selfRef startBackgroundTask];
};
CLLocationManager *locationManager = [ZTCLLocationManager shareZTCLLocationManager];
locationManager.delegate = self;
locationManager.pausesLocationUpdatesAutomatically = NO;
[self monitorBatteryStateInBackground];
return YES;
}
- (void)monitorBatteryStateInBackground{
self.background = YES;
[self startBackgroundTask];
}
- (void)startBackgroundTask
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSInteger count=0;
BOOL NoticeNoBackground=false;//只通知一次标志位
BOOL FlushBackgroundTime=false;//只通知一次标志位
while(self.background && !self.jobExpired){
NSLog(@"进入后台进程循环");
[NSThread sleepForTimeInterval:1];
count++;
if(count>60)//每60s进行一次开启定位,刷新后台时间
{
count=0;
[[ZTCLLocationManager shareZTCLLocationManager] startUpdatingLocation];
NSLog(@"开始位置服务");
[NSThread sleepForTimeInterval:1];
[[ZTCLLocationManager shareZTCLLocationManager] stopUpdatingLocation];
NSLog(@"停止位置服务");
}
//测试后台时间刷新
NSTimeInterval backgroundTimeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining];
NSLog(@"Background Time Remaining = %.02f Seconds",backgroundTimeRemaining);
if(backgroundTimeRemaining<30&&NoticeNoBackground==false){
NoticeNoBackground=true;
}
if(backgroundTimeRemaining>200&&FlushBackgroundTime==false)
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageUpdate" object:@"刷新后台时间成功\n"];
FlushBackgroundTime=true;
}
}
self.jobExpired = NO;
});
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[UIApplication sharedApplication].applicationIconBadgeNumber=0;//取消应用程序通知脚标(不能少这句!!!)
[[ZTCLLocationManager shareZTCLLocationManager] stopUpdatingLocation];
self.background = NO;
}
- (void)applicationDidEnterBackground:(UIApplication *)application{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:self.expirationHandler];
[self monitorBatteryStateInBackground];
}
#pragma mark - <CLLocationManagerDelegate>
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
//当用户位置改变时,系统会自动调用,这里必须写一点儿代码,否则后台时间刷新不管用
NSLog(@"位置改变,必须做点儿事情才能刷新后台时间");
CLLocation *loc = [locations lastObject];
float latitudeMe = loc.coordinate.latitude;
float longitudeMe = loc.coordinate.longitude;
//使用位置发起网络请求。。。
}
(三)审核:你必须要有一个控件或者其他的可以打开这个功能,然后做一个视频提交在备注里就可以了 http://v.youku.com/v_show/id_XMTI1Mzk1NjU0OA==.html?from=y1.7-1.2
(-)CLLocationManager 类需要使用单例的方法创建:
(二)AppDelegate类实现方法:(变量只能声明在.h文件!!!)
@property (assign,nonatomic)UIBackgroundTaskIdentifier
bgTask;
@property (strong,nonatomic)dispatch_block_t
expirationHandler;
@property (assign,nonatomic)BOOLjobExpired;
@property (assign,nonatomic)BOOL
background;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//此处省略一些语句
UIApplication* app = [UIApplication sharedApplication];
__weak AppDelegate* selfRef = self;
self.expirationHandler = ^{
[app endBackgroundTask:selfRef.bgTask];
selfRef.bgTask = UIBackgroundTaskInvalid;
selfRef.bgTask = [app beginBackgroundTaskWithExpirationHandler:selfRef.expirationHandler];
selfRef.jobExpired = YES;
while(selfRef.jobExpired){
NSLog(@"等待180s循环进程的结束");
[NSThread sleepForTimeInterval:1];
}
[selfRef startBackgroundTask];
};
CLLocationManager *locationManager = [ZTCLLocationManager shareZTCLLocationManager];
locationManager.delegate = self;
locationManager.pausesLocationUpdatesAutomatically = NO;
[self monitorBatteryStateInBackground];
return YES;
}
- (void)monitorBatteryStateInBackground{
self.background = YES;
[self startBackgroundTask];
}
- (void)startBackgroundTask
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSInteger count=0;
BOOL NoticeNoBackground=false;//只通知一次标志位
BOOL FlushBackgroundTime=false;//只通知一次标志位
while(self.background && !self.jobExpired){
NSLog(@"进入后台进程循环");
[NSThread sleepForTimeInterval:1];
count++;
if(count>60)//每60s进行一次开启定位,刷新后台时间
{
count=0;
[[ZTCLLocationManager shareZTCLLocationManager] startUpdatingLocation];
NSLog(@"开始位置服务");
[NSThread sleepForTimeInterval:1];
[[ZTCLLocationManager shareZTCLLocationManager] stopUpdatingLocation];
NSLog(@"停止位置服务");
}
//测试后台时间刷新
NSTimeInterval backgroundTimeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining];
NSLog(@"Background Time Remaining = %.02f Seconds",backgroundTimeRemaining);
if(backgroundTimeRemaining<30&&NoticeNoBackground==false){
NoticeNoBackground=true;
}
if(backgroundTimeRemaining>200&&FlushBackgroundTime==false)
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageUpdate" object:@"刷新后台时间成功\n"];
FlushBackgroundTime=true;
}
}
self.jobExpired = NO;
});
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[UIApplication sharedApplication].applicationIconBadgeNumber=0;//取消应用程序通知脚标(不能少这句!!!)
[[ZTCLLocationManager shareZTCLLocationManager] stopUpdatingLocation];
self.background = NO;
}
- (void)applicationDidEnterBackground:(UIApplication *)application{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:self.expirationHandler];
[self monitorBatteryStateInBackground];
}
#pragma mark - <CLLocationManagerDelegate>
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
//当用户位置改变时,系统会自动调用,这里必须写一点儿代码,否则后台时间刷新不管用
NSLog(@"位置改变,必须做点儿事情才能刷新后台时间");
CLLocation *loc = [locations lastObject];
float latitudeMe = loc.coordinate.latitude;
float longitudeMe = loc.coordinate.longitude;
//使用位置发起网络请求。。。
}
(三)审核:你必须要有一个控件或者其他的可以打开这个功能,然后做一个视频提交在备注里就可以了 http://v.youku.com/v_show/id_XMTI1Mzk1NjU0OA==.html?from=y1.7-1.2
相关文章推荐
- ios copy/strong/weak..使用总结
- iOS 实现时间线列表效果
- 普通iOS应用开发人员月薪多少钱?国内创新创业开发大赛进行中
- iOS 关于tableview性能优化概述
- iOS10AdaptationTips
- 分享一下iOS项目目录分级结构
- 利用pod trunk发布程序
- [iOS]怎么在iOS开发中切换显示语言实现国际化
- iostat的深入理解
- IOS音频和视频(Audio & Video)
- iOS NSDate 使用
- IOS categoty,成员变量,属性实现的总结
- iOS之加载HTML中的特殊字符
- iOS 开发 百度地图
- iOS备忘录之常用的第三方开源库
- IOS的后台任务
- iOS 支持 IPv6
- iOS-socket
- iOS中,如何在github上上传自己的项目
- iOS中集成ijkplayer视频直播框架