【问题标题】:MKDirections calculateETAWithCompletionHandler: in background stateMKDirections calculateETAWithCompletionHandler:处于后台状态
【发布时间】:2015-05-23 13:53:30
【问题描述】:

我有一个监控重大位置变化的应用。
收到新的计算后,我想计算从当前位置到指定位置的持续时间。
为了计算我使用MKDirections 类中的calculateETAWithCompletionHandler: 的持续时间。
只要应用程序在前台,一切都会按预期运行。

当我将应用程序发送到后台时,它会在后台正确接收位置更新,并且一切正常,直到我调用 calculateETAWithCompletionHandler:,它永远不会返回结果。

MKDirectionsHandlercalculateETAWithCompletionHandler: 的完成处理程序。在后台时从不调用。

一旦应用再次进入前台,所有等待完成的处理程序都会收到结果。

MKMapItem* origin = [MKMapItem mapItemForCurrentLocation];
MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark:destinationPlacemark];

MKDirectionsRequest* request = [MKDirectionsRequest new];
[request setSource:origin];
[request setDestination:destination];
[request setTransportType:MKDirectionsTransportTypeAutomobile];

MKDirections* directions = [[MKDirections alloc] initWithRequest:request];

[directions calculateETAWithCompletionHandler:^(MKETAResponse *response, NSError *error) {
        completion(response.expectedTravelTime, error);
}];

是否不允许在后台调用calculateETAWithCompletionHandler:
有没有办法解决这个问题?

【问题讨论】:

  • 我相信您使用MKMapItem 的方式是问题所在,您需要在主线程上运行它。所以我认为它不会满足你的需要。在后台收集位置时,您应该改用CoreLocation
  • @rmp 感谢您的提示。这似乎是解决方案。如果您将其发布为答案,我会接受。
  • 好的,我会这样做很高兴它帮助解决了您的问题
  • @pre 你能找到后台执行“calculateETAWithCompletionHandler:”的解决方案吗?
  • 这个问题有什么解决办法吗?自创建帖子以来已经大约 4 年了,我目前遇到了同样的问题。 Directions.calculate 在主线程上运行,但在应用程序处于后台状态时返回空数组。这是苹果的错误吗?

标签: ios objective-c mapkit objective-c-blocks


【解决方案1】:

我相信您使用 MKMapItem 的方式是问题所在,您需要在主线程上运行它。所以我认为它不会满足你的需要。在后台收集位置时,您应该改用 CoreLocation。

【讨论】:

  • 问题出在[MKMapItem mapItemForCurrentLocation]这行,我不得不直接使用CLLocationManager提供的位置。
  • 你能发布一些固定的代码吗?我遇到了同样的问题。
  • @AtWork 我的问题是[MKMapItem mapItemForCurrentLocation]。此方法不会在后台返回。在后台使用CLLocationManager获取当前位置。
  • @pre 谢谢。修复了问题。
【解决方案2】:

MKDirection 周围的文档在这个问题上不是很具体,我能找到的最相关的部分是:

MKDirections 对象为您提供来自 Apple 服务器的基于路线的方向数据。您可以使用此类的实例来根据您提供的 MKDirectionsRequest 对象中的数据获取旅行时间信息或驾驶或步行路线。路线对象将您的请求传递给 Apple 服务器,并将请求的信息返回给您提供的块。

由于您尝试计算行程时间,因此calculateETAWithCompletionHandler: 似乎尝试向苹果服务器执行网络请求。当应用程序处于后台状态时,请求将被搁置,直到应用程序再次进入前台。

不幸的是,我认为没有一个简单的方法可以解决这个问题。您可以尝试使用“猜测”方法,在应用程序进入后台状态之前,它会为用户计算 ETA,然后当它在后台时,它会根据您当前位置之间的直接距离按比例增加或减少 ETA和目的地。根据您希望结果的精确程度,这种广泛的估计可能足以满足您的要求。

【讨论】:

  • 您是否有任何文件证明MKDirection 请求(或一般的网络请求)在后台状态下被搁置?
  • 不,我不知道,但我知道如果你想在后台发出请求,你可以使用 NSURLSession 使用后台会话,或者你必须将网络调用包装在后台任务中,根据这个答案:stackoverflow.com/questions/11864553/…
  • 也许您可以尝试将calculateETAWithCompletionHandler: 包装在后台任务中?
  • 您可能需要提交错误报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多