后台挂起时不断获取当前用户位置
(-)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