在我的应用中,我需要在后台执行位置更新。为此,我将我的位置跟踪对象注册为观察者,如下所示:
[[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
,则位置更新可在后台完美运行。那么如何才能让它为输入背景通知工作呢?
我想注意为我的应用启用了位置更新后台模式
答案 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)
您需要启用项目后台模式功能。
转到项目属性>>能力部分。
选择背景模式,然后点击开启以启用。
在后台模式中,选中位置更新 true。
这将在后台模式下启用位置更新。