如何在我的应用程序进入后台模式时更新位置管理器和计时器?

时间:2012-01-16 08:27:11

标签: iphone objective-c ios nstimer cllocationmanager

我有一个计时器,显示用户锻炼的NSTime。当我的应用程序进入后台模式时,位置管理器和该计时器停止更新。当我的应用处于后台模式时,如何让它们更新?

我有一个名为RunViewController的视图,它有一个启动按钮。当用户单击该按钮时,计时器和位置管理器将启动。代码是:

 -(void)startRun{
    timeSec = 0;
    timeMin = 0;
    timeHour = 0;

    NSString* timeNow = [NSString stringWithFormat:@"%02d:%02d:%02d",timeHour , timeMin, timeSec];
    //Display on your label
    lblTime.text = timeNow;

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    self.locManager = [[CLLocationManager alloc] init];
    locManager.delegate = self;
    locManager.desiredAccuracy = kCLLocationAccuracyBest; //kCLLocationAccuracyBest
    [locManager setDistanceFilter:3]; //kCLDistanceFilterNone

    [locManager startUpdatingLocation];
    locationManagerStartDate = [[NSDate date] retain];


}

In - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

只需在地图上从旧位置绘制一条线到新位置,然后将该位置保存在数组中。

提前致谢。

2 个答案:

答案 0 :(得分:1)

在Apple Developer论坛的帮助下找到了实现此解决方案的解决方案。我做了以下事情:

  • 指定位置背景模式

  • 使用

  • 在后台使用NSTimer
  • UIApplication:beginBackgroundTaskWithExpirationHandler:如果n是

小于UIApplication:backgroundTimeRemaining它确实有效    很好,如果n较大,应启用位置管理器    (并禁用)在没有剩余时间之前再次避免    背景任务被杀死。这确实有效,因为位置是其中之一    三种允许的后台执行类型。

注意:通过在无法运行的模拟器中进行测试可以节省一些时间,在手机上正常工作。

Here是相同的参考。

答案 1 :(得分:0)

试试这个..

-(void)viewDidLoad
{
    UIDevice* device = [UIDevice currentDevice];
    BOOL backgroundSupported = NO;
    if ([device respondsToSelector:@selector(isMultitaskingSupported)])
        backgroundSupported = device.multitaskingSupported;

    NSLog(backgroundSupported ? @"Yes" : @"No");


    counterTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
     //called after 10min of your app in background
        NSLog(@"10 minutes finished.");
    }];

    theTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(selectorForUpdatingLocation) userInfo:nil repeats:YES];

}