iPhone GPS在后台暂停后不会恢复

我的应用程序需要跟踪用户在后台的位置变化,只要用户移动,就可以正常工作。 当用户停止并且CLLocationManager在10-20分钟左右之后暂停时。 这是通知:

 -(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{} 

这对我也很好。 太好了,我省了一些电池等等

问题是,当用户开始再次移动时, CLLocationManager永远不会被唤醒, 直到我将应用程序放到前台 (获取活动状态) 之前 ,下面的委托方法才会被触发

 //Never called back after CLLocationManager pauses: -(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{} -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{} 

为什么在设备重新开始移动之后, locationManagerDidResumeLocationUpdates从来不会被调用? GPS不应该自动恢复(自动暂停)? 有没有用户的交互恢复GPS的方法?

应用程序在Info.plist文件中声明如下:

在这里输入图像描述

我的CLLocationManager设置是:

 locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager setActivityType:CLActivityTypeFitness]; //I WANT pauses to save some battery, etc... That is why following line is commented out (default) //[locationManager setPausesLocationUpdatesAutomatically:NO]; locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters; locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; [locationManager startUpdatingLocation]; 

如果你在苹果论坛上自动searchpausesLocationUpdatesAutomatically ,你会发现一个类似的问题,最近有一个苹果开发者的回应。 我不会直接在这里重新发布它,因为它是一个私人论坛,但要点是,当用户忘记了他们有一个位置感知应用程序正在运行,并已停止使用它的情况下的位置暂停。 暂停更新他们的电池将不会尽快排出。 不幸的是,不可能知道新的移动是他们恢复活动还是做别的事情,所以更新不会恢复,直到应用程序回到前台。 他们的build议是捕捉暂停调用,并获得用户的注意力,让他们打开应用程序,如果他们仍然想要更新。

编辑:

自动从苹果自己的文档暂停LocationUpdates 。 他们build议:

暂停发生后,当您确定需要时, 您有责任重新启动位置服务。 核心位置调用位置pipe理器委托的locationManagerDidPauseLocationUpdates(_:)方法,让您知道发生了暂停。 在该方法中,您可以configuration触发器types为UNLocationNotificationTrigger的本地通知,并设置为在用户退出当前区域时进行通知。 本地通知消息应提示用户再次启动您的应用程序,以便它可以恢复更新。

苹果文档在这个话题上非常薄弱。 属性pausesLocationUpdatesAutomatically当苹果认为用户不需要GPS时, pausesLocationUpdatesAutomatically允许苹果closuresGPS。

虽然没有logging,似乎设置此属性导致在后台模式下停止GPS。

各种post描述了这个属性的问题:例如:
iOS 6 CoreLocation不起作用

在iOS 6自动暂停不起作用 Stanislav Dvoychenko张贴苹果的reccomendation:

[更新 – 2013年3月4日]。 我查看了苹果的演示文稿,了解iOS6中的位置变化,他们build议在区域更改事件后使用区域更改监视来“不停顿”。 虽然这不适合我的情况,因为用户可能会去/运行/开车一两公里,直到发生这样的事件。

我build议:将该属性设置为false。

如果可以,请使用startMonitoringSignificantLocationChanges(Apple):

如果您启动此服务,并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。

一旦您的应用程序被唤醒,您可以尝试将其与细粒度跟踪相结合(例如用户重新input)。