iOS中长时间运行的后台任务

时间:2014-09-02 13:23:26

标签: ios long-integer background-task

我知道这是一个非常常见的问题。我已经阅读了很多答案,但没有找到适合我的答案。这就是为什么我发布这个问题,并希望有人会告诉我如何修复我的代码。

  1. 我有函数startUpdate来使用C​​LLocationManager更新位置。在applicationDidEnterBackground方法中,我写了类似下面的内容:

    [self startUpdate]; // position1 的NSLog(@ “applicationDidEnterBackground”); __block UIBackgroundTaskIdentifier bgTask; bgTask = [application beginBackgroundTaskWithExpirationHandler:^ {     [application endBackgroundTask:bgTask];   bgTask = UIBackgroundTaskInvalid; }];

    [self startUpdate]; // position2 //启动长时间运行的任务并立即返回。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ {     [self startUpdate]; // position3      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@“http://google.com”]]; });

    • 我试图将[self startUpdate]放在三个位置之一(position1,2,3),有时它可以工作,有时候不行,我不知道为什么。

    • 如果它有效,更新只需在3分钟的事件中运行。如果我在应用程序处于前台时调用startUpdate,然后将应用程序置于后台,使用真实设备更新将持续15分钟,使用模拟器更新超过1小时(我不确切知道,1小时后,我认为它将永远持续我停止测试)。那么之间有什么不同:前景中的startupdate->在后台转到后台vs startupdate;模拟器与真实设备?

    • 在position3之后,我打电话跟随线打开野生动物园 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@“http://google.com”]]; 但它不起作用。那么在后台可以执行哪些类型的任务?

  2. 我需要让服务永远运行。一些搜索结果表明这是不可能的。但是一些熟悉的应用程序做到了这一点(Facebook,...保持服务接收通知)。他们怎么能这样做?

  3. 非常感谢你,

1 个答案:

答案 0 :(得分:1)

位置服务的确切行为已在Core Location文档的最新更新中阐明。它现在说明了 -

  
      
  • 标准位置服务在应用程序正常时提供事件   在前台跑。当你的应用程序在后台时,这个   服务仅在位置更新后台模式时才传递事件   已启用该应用程序。此服务不会重新启动iOS应用程序   已被终止。

  •   
  • 重要的地理位置变更服务正常地提供活动   应用程序正在前台或后台运行。对于终止   iOS应用程序,此服务重新启动应用程序以提供事件。用于   此服务需要用户“始终”授权。

  •   

因此,似乎为了在后台继续接收位置更新的最佳机会,一旦您转到后台状态,您应切换到重要的位置更改监控,并在返回前台后恢复完整位置监控。