【问题标题】:CLLocationManager not receiving updates in background after a while一段时间后 CLLocationManager 未在后台接收更新
【发布时间】:2016-07-23 18:32:52
【问题描述】:

我有一个应用程序,用户可以在其中使用 gps 跟踪他的活动。

后台 GPS 更新一切正常,但在极少数情况下(千分之一),当我的应用程序处于后台时,我没有收到来自 CLLocationManager 的更新调用。不是马上,而是一段时间后。

我的应用开始接收更新,然后突然(可能是几分钟或几小时的跟踪)它就不再获得任何位置更新。一旦应用再次激活,它就会继续报告位置。当然,那些丢失的位置很糟糕!

我不知道它发生的时间和原因,这就是为什么我想问其他人是否已经遇到过同样的问题?我可以说这不是一个电话或类似的东西在打断。我也没有在 didFail 委托方法中得到回调。我只是什么都没有了...... 最大的问题是我不知道如何调试它,因为我无法故意重现它。

非常感谢任何帮助。

编辑:

这是我设置位置管理器的方法

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... 但我的应用似乎就是这样。如果应用程序被暂停,我什至如何能够开始跟踪?那是不可能的,不是吗?原因暂停意味着它没有执行代码?!?

【问题讨论】:

  • 你能显示你设置位置管理器的代码吗?你是在前台还是后台调用startUpdatingLocation?您是否启用了重要位置监控? stackoverflow.com/questions/20187700/…
  • 我用一些代码更新了我的问题。谢谢帮助! startUpdatingLocation 在主线程和应用程序在前台时调用。我也不使用显着位置监控...
  • 如果您的应用重新启动,您是否再次正确设置了您的位置管理器(即位置键存在于传递给didFi ishLaunchingWithOptions 的字典中?)
  • 它存在于单例中。所以它只初始化了一次......
  • 但这不会阻止我的追踪?!?因为我将pausesLocationUpdatesAutomatically 设置为否。我现在正试图尽可能地减少能源影响。也许这有帮助......

标签: ios gps cllocationmanager cllocation


【解决方案1】:

您的Info.plist 中是否将allowsBackgroundLocationUpdates 设置为YES

来自文档:

默认情况下,对于链接到 iOS 9.0 或 稍后,无论最小部署目标如何。

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

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

将此属性重置为 NO 相当于省略“位置” 从 UIBackgroundModes 值。访问位置仍然是 每当应用程序正在运行(即未挂起)时都允许,并且 有足够的授权(即它有WhenInUse授权并且是 正在使用中,或者它具有 Always 授权)。但是,该应用程序仍将 遵守通常的任务暂停规则。

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

【讨论】:

  • 我们会像我说的那样,它在 1000 次跟踪中的 999 次中工作。我的问题是什么可能导致我的 CLLocationManager 停止不时报告位置更新?!?
  • allowsBackgroundLocationUpdatesa property on CLLocationManager,而不是 Info.plist 键。
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多