MKDirections计算ITAWithCompletionHandler:处于后台状态

时间:2015-05-23 13:53:30

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

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

当我将应用程序发送到后台时,它会在后台正确接收位置更新,一切正常,直到我调用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:吗? 有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

  

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

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

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