【问题标题】:iOS background operations - Is it possible to perform network request subsequent to significant location updates?iOS 后台操作 - 是否可以在重要位置更新后执行网络请求?
【发布时间】:2014-07-12 15:46:16
【问题描述】:

我正在构建一个在后台启用位置更新的应用程序,为此我使用CLLocationManager 的实例和以下代码:

self.coreLocationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.coreLocationManager startMonitoringSignificantLocationChanges];

我实现了它的委托回调- (void)locationManager:(CLLocationManager *)locationManager didUpdateLocations:(NSArray *)locations,在其中我触发了一个对 Google 的网络请求,以便对坐标进行反向地理编码并检索该位置的地址。

如果应用程序在前台,这确实工作得很好,但在后台它似乎不起作用。我也很难调试它以进行测试,因为当应用程序在后台时我无法访问日志(所以我使用 Mixpanel,一个分析框架将位置更新捕获为事件,但是显然它们也不起作用)。

【问题讨论】:

    标签: ios google-maps ios7 location cllocationmanager


    【解决方案1】:

    为了在后台接收重要的位置更改更新,您需要在应用启动到后台时重新启动位置服务 - 除非您这样做,否则不会调用您的委托方法。

    来自Location And Maps Programming Guide -

    如果您正在监控区域或使用显着变化的位置 应用程序中的服务,在某些情况下您必须启动 启动时的定位服务。使用这些服务的应用程序可以 当新的位置事件发生时终止并随后重新启动 到达。虽然应用程序本身重新启动,但定位服务 没有自动启动。当应用程序因以下原因重新启动时 位置更新,启动选项字典传递给您的 应用程序:willFinishLaunchingWithOptions:或 application:didFinishLaunchingWithOptions: 方法包含 UIApplicationLaunchOptionsLocationKey 键。那把钥匙的存在 表示新的位置数据正在等待传送到您的应用程序。 要获取该数据,您必须创建一个新的 CLLocationManager 对象 并重新启动您之前运行的定位服务 应用程序的终止。当您重新启动这些服务时,该位置 manager 将所有待处理的位置更新传递给其委托人。

    此外,当您启动到后台时,您不应执行网络操作,除非您请求额外的执行时间。再次来自位置和地图编程指南 -

    因为您的应用在后台,所以它必须做最少的工作并且 避免任何可能阻止它的任务(例如查询网络) 在分配的时间到期之前返回。如果没有,您的 应用程序将被终止。如果 iOS 应用程序需要更多时间来处理 位置数据,它可以使用 beginBackgroundTaskWithName:expirationHandler: 方法 UIApplication 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2018-03-11
      相关资源
      最近更新 更多