IOS的后台任务之: location updates

  后台挂起时不断获取当前用户位置

(-)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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值