我有一个监控重要位置变化的应用程序
收到新计算后,我想计算从当前位置到指定位置的持续时间
要计算持续时间,请使用calculateETAWithCompletionHandler:
类中的MKDirections
只要应用程序位于前台,一切都按预期工作。
当我将应用程序发送到后台时,它会在后台正确接收位置更新,一切正常,直到我调用calculateETAWithCompletionHandler:
,这将永远不会返回结果。
MKDirectionsHandler
,calculateETAWithCompletionHandler:
的完成处理程序。在后台永远不会被调用。
只要应用程序再次进入前台,所有等待完成处理程序都会收到结果。
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:
吗?
有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
我相信你使用MKMapItem的方式是问题,你需要在主线程上运行它。所以我认为它不适用于你需要的东西。在后台收集位置时,您应该使用CoreLocation。
答案 1 :(得分:0)
关于MKDirection
的文档在这个问题上并不十分具体,我能找到的最相关的部分是:
MKDirections对象为您提供Apple服务器的基于路线的路线数据。您可以使用此类的实例根据您提供的MKDirectionsRequest对象中的数据获取旅行时信息或驾驶或步行路线。路线对象将您的请求传递给Apple服务器,并将请求的信息返回给您提供的块。
由于您正在尝试计算旅行时间,因此calculateETAWithCompletionHandler:
会尝试向Apple服务器执行网络请求。当应用程序处于后台状态时,请求将被暂停,直到应用程序再次进入前台。
不幸的是,我不认为有一个简单的方法。您可以尝试使用“猜测”方法,在应用程序进入后台状态之前,它会为用户计算ETA,然后在它处于后台时,它会按比例增加或减少ETA与当前位置之间的直接距离和目的地。根据您希望结果的准确程度,这个广泛的估算可能足以满足您的要求。