【问题标题】:Long running background task in iOSiOS中长时间运行的后台任务
【发布时间】:2014-10-26 18:48:37
【问题描述】:

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

  1. 我有函数 startUpdate 使用 CLLocationManager 更新位置。在 applicationDidEnterBackground 方法中,我写了如下内容:

    [自启动更新]; //位置1 NSLog(@"applicationDidEnterBackground"); __block UIBackgroundTaskIdentifier bgTask; bgTask = [应用程序 beginBackgroundTaskWithExpirationHandler:^{ [应用程序 endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }];

    [自启动更新]; //位置2 // 启动长时间运行的任务并立即返回。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [自启动更新]; // 位置 3 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]]; });

    • 我尝试将 [self startUpdate] 放在三个位置之一(位置 1、2、3),有时它有效,有时无效,我不知道为什么。

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

    • 就在 position3 之后,我调用了以下行来打开 safari [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]]; 但它不起作用。那么这里可以在后台执行哪些类型的任务呢?

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

非常感谢,

【问题讨论】:

  • 我会注意到 Facebook 不会让服务运行以接收通知。 Apple 处理此问题,然后使用 application:didReceiveRemoteNotification 向 AppDelegate 对象发送消息:
  • 您是否只想在后台接收位置更新(并可能将其记录到服务器)?如果是这样,那么您需要做的就是在 Info.plist 中设置位置背景模式并告诉 CLLocationManager 开始更新。即使在后台,也会调用您的位置管理器委托方法。您无需担心长时间运行的任务。但是,您将无法从后台模式启动网站 - 您只能在前台执行此操作
  • @Paulw11:我已经在 Info.plist 中设置了位置背景模式。我问的是:在前台时,我开始更新位置然后进入后台模式,更新在 15 分钟内继续工作(使用真实设备,> 1h 使用模拟器);如果我在应用程序已经在后台时开始更新位置,更新只需 3 分钟。为什么他们如此不同?我怎样才能永远保持更新?
  • 如果您指定了后台定位模式,那么定位更新将无限期地在后台继续进行。您无需为此设置后台任务。当连接到调试器(即模拟器或连接电缆的设备)时,后台任务的行为会有所不同,因为您的应用在后台时间到期后不会终止。
  • startUpdate 是做什么的?它只是在 CLLocationManager 上调用startUpdatingLocation 吗?你运行的是什么版本的 iOS?

标签: ios long-integer background-task


【解决方案1】:

定位服务的确切行为已在核心定位文档的最新更新中得到阐明。它现在声明 -

  • 标准位置服务在应用程序运行时正常传递事件 在前台运行。当您的应用程序在后台时,这 服务仅在 location-updates 后台模式下传递事件 为应用程序启用。此服务不会重新启动 iOS 应用程序 已终止。

  • 重大位置更改服务正常交付事件,而 应用程序正在前台或后台运行。对于终止 iOS 应用程序,此服务重新启动应用程序以传递事件。用于 此服务需要用户“始终”授权。

因此,为了在后台继续接收位置更新的最佳机会,您应该在移动到后台状态后切换到显着位置变化监控,并在返回前台后恢复完整的位置监控。

【讨论】:

  • 感谢@Paulw11 的回复。位置更新后台模式已启用。这就是为什么在前台启动更新后,当应用程序进入后台时更新继续工作。但是,只需约 15 分钟。我想知道的是我能不能永远保留它?
  • 不符合 Apple 文档 - 至少不是正常的 startUpdatingLocation,因为最终您的应用程序将被卸载 - 例如内存压力 - 并且不会重新加载。如果您使用重大位置更改,那么您的应用将在必要时重新启动,但您无法获得更新频率
  • “重新启动”是否意味着将应用程序推到前台?我已将 startUpdate 更改为使用 startUpdateSignificantChanges,将应用程序推送到后台,并进行重大位置更改,但应用程序仍在 bg 中。我错过了什么或者它在 iOS 7 中不起作用? “需要用户“始终”授权”--> 我不明白,如何使它成为“始终”?
  • 否,如有必要,它将重新启动到后台。 iOS 8 中需要“始终”身份验证 - 查看 WWDC 会话“位置服务中的新功能”
猜你喜欢
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
相关资源
最近更新 更多