MKDirections calculateETAWithCompletionHandler:处于后台状态

MKDirections calculateETAWithCompletionHandler: in background state

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

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

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:吗?
有什么办法可以解决这个问题吗?

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

An MKDirections object provides you with route-based directions data from Apple servers. You can use instances of this class to get travel-time information or driving or walking directions based on the data in an MKDirectionsRequest object that you provide. The directions object passes your request to the Apple servers and returns the requested information to a block that you provide.

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

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

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