2012-09-14 33 views
8

Aquí hay un problema extraño: mi aplicación debería poder llamar a los mapas incorporados en iOS (tanto 5.1 como 6). Resulta que funciona bien en iOS6 pero no en iOS5.1. Se llaman los mapas en iOS6 y se rastrean las direcciones de saddr a daddr, pero cuando estoy en iOS5 se llama a la aplicación de mapas, pero solo se coloca un pin en el daddr. Por alguna razón desconocida, las coordenadas iniciales (saddr) no se muestran y no se rastrea ninguna dirección.Mapas de llamadas para direcciones desde el interior de su aplicación - iOS5 iOS6

Aquí está mi código:

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]; 

He intentado cambiar la dirección URL a "http://maps.google.com/something" pero llama Safari en vez de construido en aplicación Mapas. Me di cuenta de que las variables se pasan correctamente a la URL.

¿Alguna idea?

¡Gracias de antemano!

+0

Pregunta prácticamente idéntica [a esta más antigua] (http://stackoverflow.com/q/576768/119114), excepto que la dirección de inicio es la ubicación actual en la otra pregunta (en realidad no cambia mucho el problema)) – Nate

Respuesta

35

Tuve un problema similar y tuve que crear un código del sistema operativo condicional para hacer frente al hecho de que la aplicación Google Maps se ha eliminado. A partir de la nueva 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]; 

Para obtener direcciones caminar:

  1. Para iOS 6 mapas - Puede configurar MKLaunchOptionsDirectionsModeWalking en lugar de MKLaunchOptionsDirectionsModeDriving
  2. Para los mapas de Google - Añadir &dirflg=w a la URL.

Creo que es mejor usar el openInMapsWithLaunchOptions en iOS6 porque le da control total sobre cómo responderá la aplicación de mapas.

+1

¡Gracias por la ayuda, amigo! Sigo tu consejo y usé openInMapsWithLaunchOptions y funcionó perfectamente. El único truco que utilicé fue pasar la ubicación actual como un parámetro dentro de NSString * url = [NSString stringWithFormat: @ "http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f" , altitud actual, longitud actual, latitud, longitud]; porque no pude hacer que Current + Location sintax funcione. Quizás tenga algo que ver con el sandboxing en iOS 5.1.1. – lsp

+0

@lsp, Los problemas con el uso de 'Current + Location' se discuten en mi respuesta [a esta pregunta anterior muy similar] (http://stackoverflow.com/a/964131/119114), y los comentarios que responden a ella. – Nate

+0

no quiero que la vista del mapa cubra la pantalla completa, debería mostrar solo la mitad de mi pantalla. – Arun

0

Puede utilizar MKPlacemark y MKMapItem a lanzar la aplicación Mapas tanto con una coordenada y un título en el mapa pin:

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]]; 
} 

Tenga en cuenta que tendrá que enlazar con AddressBook.framework y también añadir #import <AddressBook/AddressBook.h> en algún lugar de su código para hacer uso de la constante kABPersonAddressStreetKey.

Cuestiones relacionadas