iOS后台操作 - 是否可以在重要位置更新后执行网络请求?

时间:2014-05-23 10:15:38

标签: ios google-maps ios7 location cllocationmanager

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

来自Location And Maps Programming Guide -

  

如果您正在监控区域或使用重要更改位置   您的应用中的服务,有些情况下您必须开始   发布时的位置服务。使用这些服务的应用可以是   终止并随后在新的位置事件时重新启动   到达。虽然应用程序本身已重新启动,但位置服务仍然存在   没有自动启动。当一个应用程序因为a而重新启动时   位置更新,启动选项字典传递给您   application:willFinishLaunchingWithOptions:或   application:didFinishLaunchingWithOptions:方法包含   UIApplicationLaunchOptionsLocationKey键。该密钥的存在   表示新位置数据正在等待发送到您的应用。   要获取该数据,您必须创建一个新的CLLocationManager对象   并重新启动您之前运行的位置服务   应用终止。当您重新启动这些服务时,该位置   经理将所有待定的位置更新提供给其代表。

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

  

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