当应用程序进入后台时,CLLocationManager不会启动位置更新

时间:2015-02-26 13:13:39

标签: ios objective-c cocoa-touch core-location

在我的应用中,我需要在后台执行位置更新。为此,我将我的位置跟踪对象注册为观察者,如下所示:

 [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(start)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];

这是开始更新位置的方法:

- (void)start
{
NSInteger downloadsCount = [[SGDataManager sharedInstance] countOfActiveDownloads];
NSInteger uploadsCount   = [[SGDataManager sharedInstance] countOfActiveUploads];

if (downloadsCount + uploadsCount > 0)
{
  [self.locationManager startUpdatingLocation];
}
}

但是,位置更新永远不会开始。但是,如果我将UIApplicationDidEnterBackgroundNotification更改为UIApplicationWillResignActiveNotification,则位置更新可在后台完美运行。那么如何才能让它为输入背景通知工作呢?

我想注意为我的应用启用了位置更新后台模式

2 个答案:

答案 0 :(得分:1)

当你的应用程序进入后台时,它有足够的时间来完成任务。在那之后,任务将被暂停。

尝试将UpdateLocation置于后台任务中,例如:

http://hayageek.com/ios-long-running-background-task/

此示例还在进入后台时使用位置更新。

修改

在我看来,这是一个CoreLocation错误。它可能类似于:startUpdatingLocation方法完成,后台任务完成,但在CoreLocation生成的某个其他线程中仍然发生了某些事情,并且应用程序暂停此线程,因为它进入后台。这只是猜测。

无论哪种方式,这都是一种解决方法:在后台延长您的应用生命周期。在startUpdatingLocation完成时不要结束后台任务,让它运行几秒钟。

__block UIBackgroundTaskIdentifier back =  [application beginBackgroundTaskWithExpirationHandler:^{
    [application endBackgroundTask: back];
    back = UIBackgroundTaskInvalid;
}];

    [manager startUpdatingLocation];

此代码可让您的应用在后台运行几分钟。您可以创建一个计时器,如果您愿意,可以更快地暂停它

NSTimer* killBackgroundTaskTimer = [NSTimer scheduledTimerWithTimeInterval: 10 target: self
                               selector: @selector(killBackgroundTask:) userInfo: nil repeats: NO];
-(void) callAfterSixtySecond:(NSTimer*) t 
{
    [application endBackgroundTask: back];
    back = UIBackgroundTaskInvalid;
}

答案 1 :(得分:0)

您需要启用项目后台模式功能。

转到项目属性>>能力部分。

选择背景模式,然后点击开启以启用。

enter image description here

在后台模式中,选中位置更新 true。

这将在后台模式下启用位置更新。