我知道可以通过调用openURL
带有参数saddr
和daddr
位置字符串或Lat/Long 的谷歌地图URL 来启动iPhone地图应用程序(参见下面的示例).
但我想知道是否可以将起始地址设为"当前位置"地图书签,以便我可以使用地图应用程序的位置处理代码.我的谷歌搜索一直没有结果.
例如:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@", myLatLong, latlong]]];
除了要调用当前位置书签代替的东西myLatLong
.
您需要使用核心位置来获取当前位置,但是使用该纬度/长对,您可以获取地图以将您从那里路由到街道地址或位置.像这样:
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在下面指出的那样,它可能在将来的版本中无法可靠地运行.
最初,地图使用谷歌地图,但现在,苹果和谷歌有单独的地图应用程序.
1)如果您希望使用Google地图应用进行路线,请使用comgooglemaps网址计划:
NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving",
[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
2)要使用Apple Maps,您可以使用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,我建议在MKMapItem
API文档页面上使用类似Apple的代码:
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).
NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=Current Location&saddr=%@",startAddr]; NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; [[UIApplication sharedApplication] openURL:url]; [url release];
仅当iPhone/iPod语言设置为英语时才有效.如果要支持其他语言,则必须使用本地化字符串来匹配地图书签名称.
这适用于iPhone:
http://maps.google.com/maps?saddr=当前位置&daddr = 123 Main St,Ottawa,ON
您可以使用预处理器#define,如:
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
了解您的iOS版本.然后,我也可以使用此代码来支持iOS 6:
NSString* addr = nil; if (SYSTEM_VERSION_LESS_THAN(@"6.0")) { addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude]; } else { addr = [NSString stringWithFormat:@"http://maps.apple.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude]; } NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; [[UIApplication sharedApplication] openURL:url];
由于沙盒,您无权访问Map应用程序的书签.
而是使用Core Location自己确定当前位置.然后在您构建的URL中使用该位置(lat和long)来打开Maps.