我正在构建一个应用程序,它在后台启用了位置更新,为此我使用CLLocationManager
的实例,其代码如下:
self.coreLocationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.coreLocationManager startMonitoringSignificantLocationChanges];
我实现了其委托回调- (void)locationManager:(CLLocationManager *)locationManager didUpdateLocations:(NSArray *)locations
,其中我向Google发出网络请求,以反转对坐标进行地理编码并检索该位置的地址。
如果应用程序位于前台,这确实很有效,但在后台它似乎无法正常工作。我也很难调试它以进行测试,因为当应用程序在后台时我无法访问日志(因此我使用 Mixpanel ,一个分析框架将位置更新捕获为事件,但显然他们也没有工作)。
答案 0 :(得分:1)
为了在后台接收重要的位置更改更新,您需要在应用程序启动到后台时重新启动位置服务 - 除非您这样做,否则不会调用您的委托方法。
来自Location And Maps Programming Guide -
如果您正在监控区域或使用重要更改位置 您的应用中的服务,有些情况下您必须开始 发布时的位置服务。使用这些服务的应用可以是 终止并随后在新的位置事件时重新启动 到达。虽然应用程序本身已重新启动,但位置服务仍然存在 没有自动启动。当一个应用程序因为a而重新启动时 位置更新,启动选项字典传递给您 application:willFinishLaunchingWithOptions:或 application:didFinishLaunchingWithOptions:方法包含 UIApplicationLaunchOptionsLocationKey键。该密钥的存在 表示新位置数据正在等待发送到您的应用。 要获取该数据,您必须创建一个新的CLLocationManager对象 并重新启动您之前运行的位置服务 应用终止。当您重新启动这些服务时,该位置 经理将所有待定的位置更新提供给其代表。
此外,当您启动到后台时,除非您请求额外的执行时间,否则不应执行网络操作。再次从位置和地图编程指南 -
因为你的应用程序在后台,所以它必须做很少的工作 避免可能阻止它的任何任务(例如查询网络) 从分配的时间到期之前返回。如果没有,你的 应用程序将被终止。如果iOS应用程序需要更多时间来处理 位置数据,它可以使用。请求更多的后台执行时间 beginBackgroundTaskWithName:expirationHandler:方法 UIApplication类。