一段时间后,CLLocationManager无法在后台接收更新

时间:2016-04-04 09:27:52

标签: ios gps cllocationmanager cllocation

我有一个应用程序,用户可以通过gps跟踪他的活动。

所有功能都可以通过背景GPS更新实现,但是非常罕见的情况(1000个中的1个),当我的应用处于后台时,我只是没有收到来自CLLocationManager的更新电话。不是立即,但过了一段时间。

我的应用程序开始接收更新,然后突然(可能是几分钟或几小时的跟踪)它不会再获得更多位置更新。只要应用程序再次处于活动状态,它就会继续报告位置。但当然那些遗失的地方很糟糕!

我没有弄清楚它何时以及为什么会发生,这就是为什么我想问其他人是否已经遇到过同样的问题?我可以说这不是一个电话或类似的东西正在打断。我也没有在didFail委托方法中获得回调。我再也没有得到任何东西...... 最大的问题是我没有关于如何调试它的IDEA,因为我不能故意重现它。

非常感谢任何帮助。

修改

以下是我设置位置管理器的方法

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

self.locationManager.distanceFilter = kMinimumDistanceFilter;
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
self.locationManager.pausesLocationUpdatesAutomatically = NO;
self.locationManager.activityType = CLActivityTypeFitness;

[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestAlwaysAuthorization];

if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)])
{
    self.locationManager.allowsBackgroundLocationUpdates = YES;
}

然后在点击开始录制按钮时

[self.locationManager startUpdatingLocation];

编辑2:

  

如果您启动此服务并且您的应用已暂停,则系统会停止   交付事件,直到您的应用程序再次开始运行(在...中)   前景或背景)。如果您的应用程序被终止,则交付   新的位置事件完全停止。因此,如果您的应用需要   要在后台接收位置事件,它必须包括   其Info.plist中的UIBackgroundModes键(具有位置值)   文件。

我甚至不在后台startUpdatingLocation ......但似乎这就是我的应用程序发生的事情。如果应用程序被暂停,我怎么能开始跟踪?那是不可能的,不是吗?原因暂停意味着它没有执行代码?!?

1 个答案:

答案 0 :(得分:1)

allowsBackgroundLocationUpdates中的YES设置为Info.plist吗?

来自文档:

  

默认情况下,对于链接到iOS 9.0或iOS的应用程序,这是NO   以后,无论最低部署目标如何。

     

将UIBackgroundModes设置为在Info.plist中包含“location”   每次调用时,还必须在运行时将此属性设置为YES   -startUpdatingLocation,目的是在后台继续。

     

当UIBackgroundModes不包含时,将此属性设置为YES   “位置”是一个致命的错误。

     

将此属性重置为NO等同于省略“location”   来自UIBackgroundModes值。访问位置仍然是   在应用程序运行时(即未暂停)允许,以及   有足够的授权(即它具有WhenInUse授权并且是   在使用中,或它具有始终授权)。但是,该应用程序仍然会   遵守通常的任务暂停规则。

     

请参阅-requestWhenInUseAuthorization和-requestAlwaysAuthorization for   有关可能的授权值的更多详细信息。