Aquí está la forma oficial de Apple:
// 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];
}
Si desea obtener instrucciones para conducir o caminar a la ubicación, puede incluir un mapItemForCurrentLocation
con el MKMapItem
en la matriz +openMapsWithItems:launchOptions:
y configurar las opciones de inicio de manera adecuada.
// 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];
}
Puede conservar su iOS 5 original y el código inferior en una else
declaración posterior if
. Tenga en cuenta que si invierte el orden de los elementos en la openMapsWithItems:
matriz, obtendrá indicaciones desde la coordenada hasta su ubicación actual. Probablemente podría usarlo para obtener direcciones entre dos ubicaciones pasando un elemento construido en MKMapItem
lugar del mapa de ubicación actual. No he intentado eso.
Finalmente, si tiene una dirección (como una cadena) para la que desea direcciones, use el geocodificador para crear una MKPlacemark
, a modo de 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];
}];
}
currentLocationMapItem
.Encontré la respuesta a mi propia pregunta. Apple documenta su formato de URL de mapas aquí . Parece que esencialmente puedes reemplazarlo
maps.google.com
conmaps.apple.com
.Actualización: Resulta que lo mismo es cierto en MobileSafari en iOS 6; tocando un enlace para
http://maps.apple.com/?q=...
abrir la aplicación Mapas con esa búsqueda, de la misma manerahttp://maps.google.com/?q=...
que en versiones anteriores. Esto funciona y está documentado en la página vinculada anteriormente.ACTUALIZACIÓN: Esto responde a mi pregunta relacionada con el formato de URL. Pero la respuesta de nevan king aquí (ver más abajo) es un excelente resumen de la API de Maps real.
fuente
La mejor manera de hacerlo es llamar al nuevo método iOS 6 en
MKMapItem
openInMapsWithLaunchOptions:launchOptions
Ejemplo:
Esto iniciará la navegación para conducir desde la ubicación actual.
fuente
MKMapItem
cuando todo lo que tengo es una dirección? Esta API parece un poco complicada para ese caso de uso simple.Veo que encontraste el "esquema" de la URL de maps.apple.com. Es una buena opción porque redirigirá automáticamente los dispositivos más antiguos a maps.google.com. Pero para iOS 6 hay una nueva clase que quizás quieras aprovechar: MKMapItem .
Dos métodos que le interesan:
fuente
init
MKMapItem
con unMKPlacemark
, que obtienes al proporcionar un par de latitud / longitud y un diccionario de direcciones. Parece más simple simplemente abrirhttp://maps.apple.com/?q=1+infinite+loop+cupertino+ca
. ¿Hay alguna ventaja de usarMKMapItem
cuando todo lo que quieres hacer es mostrar una dirección en Maps?MKMapItem
si aún no tiene una referencia a uno que le gustaría usar. Sólo tiene que utilizar el método de clase,+openMapsWithItems:launchOptions:
en laMKMapItem
que hacer la misma cosa.MKMapItem
API y deja caer un punto en el mapa etiquetado como "Ubicación desconocida". ¿Hay alguna manera de hacer que muestre un nombre para la ubicación? No veo ninguna clave para esto en las opciones para el diccionario de direcciones ...Aquí hay una clase que usa la solución de nevan king completada en Swift:
fuente
Me pareció molesto que usando el http://maps.apple.com?q= configuración de enlace ... abra primero el navegador safari en dispositivos más antiguos.
Entonces, para un dispositivo iOS 5 que abre su aplicación con una referencia a maps.apple.com, los pasos son los siguientes:
Creo que los pasos 2 y 3 (muy obvios y confusos) son molestos para los usuarios. Por lo tanto, verifico la versión del sistema operativo y ejecuto maps.google.com o maps.apple.com en el dispositivo (para las versiones del sistema operativo iOS 5 o iOS 6).
fuente
Mi investigación sobre este tema me llevó a las siguientes conclusiones:
fuente
Si desea abrir Google Maps en su lugar (u ofrecerlo como una opción secundaria), puede usar los esquemas
comgooglemaps://
ycomgooglemaps-x-callback://
URL documentados aquí .fuente
Antes de iniciar url, elimine cualquier carácter especial de la url y reemplace los espacios con +. Esto te ahorrará algunos dolores de cabeza:
fuente
// VKJ
fuente
Actualizado a Swift 4 basado en la respuesta de @ PJeremyMalouf:
fuente
No usar mapas, solo usar programáticamente una acción UiButton, esto funcionó muy bien para mí.
Podrías difundir un poco este código. Por ejemplo, puse la variable como una variable de nivel de clase, hice que otra función la llenara y luego, cuando presioné el botón, simplemente tomé lo que estaba en la variable y la borré para usarla en una URL.
fuente