从您的应用内部调用地图以获取路线 - iOS 5 iOS 6

时间:2012-09-14 03:51:37

标签: objective-c ios5 mapkit ios6 ios6-maps

这是一个奇怪的问题:我的应用程序应该能够调用iOS中的内置地图(包括5.1和6)。事实证明它在iOS6下工作得很好,但在iOS5.1下却没有。调用iOS6中的地图并跟踪从saddr到daddr的路线,但是当我在iOS5中时,地图应用程序被调用,但只有一个引脚被放在daddr上。由于某些未知原因,初始坐标(saddr)没有显示,也没有跟踪方向。

这是我的代码:

addr = [NSString stringWithFormat: @"maps://saddr=%f,%f&daddr=%f,%f", newLocation.coordinate.latitude, newLocation.coordinate.longitude, oldLatitude, oldLongitude];
NSURL *url = [NSURL URLWithString:addr];
[[UIApplication sharedApplication] openURL:url];

我尝试将网址更改为“http://maps.google.com/something”,但它会调用Safari而不是内置的地图应用。我注意到变量正在正确地传递给URL。

有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:35)

我遇到了类似的问题,我不得不创建一些条件操作系统代码来处理谷歌地图应用程序已被删除的事实。来自新的MKMapItem Reference

//first create latitude longitude object
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude,longitude);

//create MKMapItem out of coordinates
MKPlacemark* placeMark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
MKMapItem* destination =  [[MKMapItem alloc] initWithPlacemark:placeMark];

if([destination respondsToSelector:@selector(openInMapsWithLaunchOptions:)])
{
    //using iOS6 native maps app
    [destination openInMapsWithLaunchOptions:@{MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving}];        
} 
else
{
    //using iOS 5 which has the Google Maps application
    NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=Current+Location&daddr=%f,%f", latitude, longitude];
    [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
}

[placeMark release];
[destination release];

获取步行路线:

  1. 对于iOS 6地图 - 您可以设置MKLaunchOptionsDirectionsModeWalking而不是MKLaunchOptionsDirectionsModeDriving
  2. 对于Google地图 - 将&dirflg=w添加到网址。
  3. 我认为最好在iOS6中使用openInMapsWithLaunchOptions,因为它可让您完全控制地图应用程序的响应方式。

答案 1 :(得分:0)

您可以使用MKPlacemarkMKMapItem在地图图钉上使用坐标标题启动地图应用:

NSString *pinTitle;
CLLocationCoordinate2D coordinate;

MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:@{(id)kABPersonAddressStreetKey: pinTitle}];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];

if ([mapItem respondsToSelector:@selector(openInMapsWithLaunchOptions:)])
{
    [mapItem openInMapsWithLaunchOptions:@{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving}];
}
else
{
    // Google Maps fallback
    NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%f,%f&saddr=Current+Location", locationItem.coordinate.latitude, locationItem.coordinate.longitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
}

请注意,您需要与AddressBook.framework相关联,并在代码中的某处添加#import <AddressBook/AddressBook.h>以使用kABPersonAddressStreetKey常量。