上一页到iOS 6,打开这样的URL将打开(谷歌)地图应用:
NSURL *url = [NSURL URLWithString:@"http://maps.google.com/?q=New+York"];
[[UIApplication sharedApplication] openURL:url];
现在,随着新的苹果地图的实现,这只是打开移动Safari浏览器谷歌地图。 我怎样才能做到与iOS 6相同的行为? 如何编程方式打开地图应用,并将它指向一个特定位置/地址/搜索/什么?
Answer 1:
下面是苹果官方的方法:
// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
// Create an MKMapItem to pass to the Maps app
CLLocationCoordinate2D coordinate =
CLLocationCoordinate2DMake(16.775, -3.009);
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate
addressDictionary:nil];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:@"My Place"];
// Pass the map item to the Maps app
[mapItem openInMapsWithLaunchOptions:nil];
}
如果你想获得驾车或步行指示的位置,你可以包括mapItemForCurrentLocation
与MKMapItem
阵列中的+openMapsWithItems:launchOptions:
并设置适当的启动选项。
// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
// Create an MKMapItem to pass to the Maps app
CLLocationCoordinate2D coordinate =
CLLocationCoordinate2DMake(16.775, -3.009);
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate
addressDictionary:nil];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:@"My Place"];
// Set the directions mode to "Walking"
// Can use MKLaunchOptionsDirectionsModeDriving instead
NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeWalking};
// Get the "Current User Location" MKMapItem
MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
// Pass the current location and destination map items to the Maps app
// Set the direction mode in the launchOptions dictionary
[MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem]
launchOptions:launchOptions];
}
你可以保留你原来的iOS 5和较低的代码在else
以后声明if
。 请注意,如果您反转项目的顺序在openMapsWithItems:
数组,你会得到从协调到您当前所在位置。 你也许可以使用它通过传递一个构造得到任何两个地点之间的方向MKMapItem
而不是当前位置地图项目。 我还没有试过。
最后,如果你有一个地址(字符串)要方向,使用地理编码器来创建一个MKPlacemark
,途经CLPlacemark
。
// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:@"Piccadilly Circus, London, UK"
completionHandler:^(NSArray *placemarks, NSError *error) {
// Convert the CLPlacemark to an MKPlacemark
// Note: There's no error checking for a failed geocode
CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
MKPlacemark *placemark = [[MKPlacemark alloc]
initWithCoordinate:geocodedPlacemark.location.coordinate
addressDictionary:geocodedPlacemark.addressDictionary];
// Create a map item for the geocoded address to pass to Maps app
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:geocodedPlacemark.name];
// Set the directions mode to "Driving"
// Can use MKLaunchOptionsDirectionsModeWalking instead
NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving};
// Get the "Current User Location" MKMapItem
MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
// Pass the current location and destination map items to the Maps app
// Set the direction mode in the launchOptions dictionary
[MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] launchOptions:launchOptions];
}];
}
Answer 2:
找到了答案,以我自己的问题。 苹果记录其地图URL格式在这里 。 它看起来像你基本上可以代替maps.google.com
与maps.apple.com
。
更新:原来,同样是在MobileSafari在iOS 6上真实的; 攻链接到http://maps.apple.com/?q=...
打开与搜索的地图应用程序,以同样的方式http://maps.google.com/?q=...
没以前版本。 这个工程在上面链接的页面进行了说明。
更新:这个回答我有关的URL格式问题。 但是妮娃王的答案在这里 (见下文)是实际的地图API的一个很好的总结。
Answer 3:
要做到这一点,最好的方法是调用新的iOS 6上的方法MKMapItem
openInMapsWithLaunchOptions:launchOptions
例:
CLLocationCoordinate2D endingCoord = CLLocationCoordinate2DMake(40.446947, -102.047607);
MKPlacemark *endLocation = [[MKPlacemark alloc] initWithCoordinate:endingCoord addressDictionary:nil];
MKMapItem *endingItem = [[MKMapItem alloc] initWithPlacemark:endLocation];
NSMutableDictionary *launchOptions = [[NSMutableDictionary alloc] init];
[launchOptions setObject:MKLaunchOptionsDirectionsModeDriving forKey:MKLaunchOptionsDirectionsModeKey];
[endingItem openInMapsWithLaunchOptions:launchOptions];
这将启动导航从当前位置行驶。
Answer 4:
我看你找到了maps.apple.com网址“方案”。 这是一个很好的选择,因为它会自动重定向旧设备到maps.google.com。 但对于iOS 6的存在,你可能想利用的一个新的类: MKMapItem 。
两种方法是您感兴趣的:
- -openInMapsWithLaunchOptions: -调用它的MKMapItem比如在Maps.app打开它
- + openMapsWithItems:launchOptions: -调用它MKMapItem类打开MKMapItem实例的数组。
Answer 5:
下面是使用妮娃王的溶液中,斯威夫特完成了一个类:
class func openMapWithCoordinates(theLon:String, theLat:String){
var coordinate = CLLocationCoordinate2DMake(CLLocationDegrees(theLon), CLLocationDegrees(theLat))
var placemark:MKPlacemark = MKPlacemark(coordinate: coordinate, addressDictionary:nil)
var mapItem:MKMapItem = MKMapItem(placemark: placemark)
mapItem.name = "Target location"
let launchOptions:NSDictionary = NSDictionary(object: MKLaunchOptionsDirectionsModeDriving, forKey: MKLaunchOptionsDirectionsModeKey)
var currentLocationMapItem:MKMapItem = MKMapItem.mapItemForCurrentLocation()
MKMapItem.openMapsWithItems([currentLocationMapItem, mapItem], launchOptions: launchOptions)
}
Answer 6:
我发现它烦人,使用http://maps.apple.com?q= ...链路建立在旧设备首次打开Safari浏览器。
因此,对于在iOS 5设备打开你的应用程序有一个参考maps.apple.com的步骤是这样的:
- 您单击应用程序的东西,它是指maps.apple.com网址
- Safari浏览器打开该链接
- 在maps.apple.com服务器重定向到maps.google.com网址
- maps.google.com的URL被解释并打开谷歌地图应用。
我认为,(很明显和混乱)步骤2和3是恼人的用户。 因此,我检查操作系统版本,要么在设备上运行maps.google.com或maps.apple.com(对于RESP。IOS 5或6 IOS OS的版本)。
Answer 7:
我对这个问题的研究使我得出以下结论:
- 如果你使用maps.google.com,然后它会在Safari为每部iOS打开地图。
- 如果你使用maps.apple.com那么将在iOS 6中的地图应用程序中打开地图,也运行马丽娟与iOS 5,并在iOS 5中它打开地图,如野生动物园正常。
Answer 8:
如果你想打开谷歌地图,而不是(或提供作为第二选项),你可以使用comgooglemaps://
和comgooglemaps-x-callback://
记录URL方案在这里 。
Answer 9:
启动URL之前,从URL中删除任何特殊字符和+替换空格。 这将节省你有些头疼:
NSString *mapURLStr = [NSString stringWithFormat: @"http://maps.apple.com/?q=%@",@"Limmattalstrasse 170, 8049 Zürich"];
mapURLStr = [mapURLStr stringByReplacingOccurrencesOfString:@" " withString:@"+"];
NSURL *url = [NSURL URLWithString:[mapURLStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
if ([[UIApplication sharedApplication] canOpenURL:url]){
[[UIApplication sharedApplication] openURL:url];
}
Answer 10:
NSString *address = [NSString stringWithFormat:@"%@ %@ %@ %@"
,[dataDictionary objectForKey:@"practice_address"]
,[dataDictionary objectForKey:@"practice_city"]
,[dataDictionary objectForKey:@"practice_state"]
,[dataDictionary objectForKey:@"practice_zipcode"]];
NSString *mapAddress = [@"http://maps.apple.com/?q=" stringByAppendingString:[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"Map Address %@",mapAddress);
[objSpineCustomProtocol setUserDefaults:mapAddress :@"webSiteToLoad"];
[self performSegueWithIdentifier: @"provider_to_web_loader_segue" sender: self];
// K,
Answer 11:
更新斯威夫特4基于@ PJeremyMalouf的回答:
private func navigateUsingAppleMaps(to coords:CLLocation, locationName: String? = nil) {
let placemark = MKPlacemark(coordinate: coords.coordinate, addressDictionary:nil)
let mapItem = MKMapItem(placemark: placemark)
mapItem.name = locationName
let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
let currentLocationMapItem = MKMapItem.forCurrentLocation()
MKMapItem.openMaps(with: [currentLocationMapItem, mapItem], launchOptions: launchOptions)
}
Answer 12:
不使用的地图,只是以编程方式使用一个UIButton的行动,这对我来说真是棒极了。
// Button triggers the map to be presented.
@IBAction func toMapButton(sender: AnyObject) {
//Empty container for the value
var addressToLinkTo = ""
//Fill the container with an address
self.addressToLinkTo = "http://maps.apple.com/?q=111 Some place drive, Oak Ridge TN 37830"
self.addressToLinkTo = self.addressToLinkTo.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let url = NSURL(string: self.addressToLinkTo)
UIApplication.sharedApplication().openURL(url!)
}
你可以把一些该代码了一下。 例如,我把变量作为类级别的变量,还有另外一个功能填充它,然后当按下按钮简单地采取了什么是变量和擦洗它在URL中使用。
文章来源: Programmatically open Maps app in iOS 6