您的位置:首页 > 移动开发 > IOS开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: