iOS 6 之前
您需要使用核心位置来获取当前位置,但是使用该纬度/经度对,您可以让地图将您从那里路由到街道地址或位置。像这样:
CLLocationCoordinate2D currentLocation = [self getCurrentLocation];
// this uses an address for the destination. can use lat/long, too with %f,%f format
NSString* address = @"123 Main St., New York, NY, 10001";
NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%@",
currentLocation.latitude, currentLocation.longitude,
[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
最后,如果您确实想避免使用 CoreLocation 来显式查找当前位置,而是想使用@"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"
url,请参阅我在下面的评论中提供的链接,了解如何本地化Current+Location字符串。但是,您正在利用另一个未记录的功能,正如 Jason McCreary 在下面指出的那样,它在未来的版本中可能无法可靠地工作。
iOS 6 更新
最初,地图使用谷歌地图,但现在,苹果和谷歌拥有独立的地图应用程序。
1)如果您希望使用 Google Maps 应用程序进行路由,请使用comgooglemaps URL 方案:
NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving",
[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
2)要使用 Apple 地图,您可以使用MKMapItem
iOS 6 的新类。 请参阅此处的 Apple API 文档
基本上,如果路由到目标坐标( latlong
),您将使用类似的东西:
MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate: latlong addressDictionary: nil];
MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark: place];
destination.name = @"Name Here!";
NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];
NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:
MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsDirectionsModeKey, nil];
[MKMapItem openMapsWithItems: items launchOptions: options];
为了在同一代码中同时支持 iOS 6+ 和 iOS 6 之前的版本,我建议使用 Apple 在MKMapItem
API 文档页面上提供的类似代码:
Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
// iOS 6 MKMapItem available
} else {
// use pre iOS 6 technique
}
这将假设您的 Xcode Base SDK 是 iOS 6(或最新的 iOS)。