2012-09-14 8 views
8

Ecco uno strano problema: la mia app dovrebbe essere in grado di chiamare Maps in iOS (entrambe 5.1 e 6). Si scopre che funziona bene su iOS6 ma non su iOS5.1. Vengono chiamate le mappe in iOS6 e viene tracciata la direzione da saddr a daddr, ma quando sono in iOS5 viene chiamata l'app delle mappe, ma viene inserito un solo pin nel daddr. Per qualche motivo sconosciuto le coordinate iniziali (saddr) non vengono mostrate e non viene tracciata alcuna direzione.Chiama Maps per le indicazioni dall'interno della tua app - iOS5 iOS6

Ecco il mio codice:

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

ho cercato modificare l'URL a "http://maps.google.com/something", ma chiama Safari invece di costruito in Maps app. Ho notato che le variabili vengono trasmesse correttamente all'URL.

Qualche idea?

Grazie in anticipo!

+0

Domanda praticamente identica [a questa più vecchia] (http://stackoverflow.com/q/576768/119114), tranne che l'indirizzo iniziale è la posizione corrente nell'altra domanda (in realtà non cambia il problema molto). – Nate

risposta

35

Ho avuto un problema simile e ho dovuto creare un codice di sistema operativo condizionale per gestire il fatto che l'applicazione Google Maps è stata rimossa. Dal nuovo 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]; 

Per ottenere indicazioni a piedi:

  1. per iOS 6 mappe - È possibile impostare MKLaunchOptionsDirectionsModeWalking invece di MKLaunchOptionsDirectionsModeDriving
  2. Per le mappe di Google - Aggiungere &dirflg=w all'URL.

Penso che sia meglio utilizzare openInMapsWithLaunchOptions in iOS6 perché ti dà il controllo completo su come risponderà l'applicazione mappe.

+1

Grazie per l'aiuto amico! Seguo il tuo consiglio e ho usato openInMapsWithLaunchOptions e ha funzionato perfettamente. L'unico trucco che ho usato è stato passare la posizione corrente come parametro all'interno di NSString * url = [NSString stringWithFormat: @ "http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f" , currentLatitude, currentLongitude, latitude, longitude]; perché non riuscivo a far funzionare la sintassi Current + Location. Forse ha qualcosa a che fare con il sandboxing in iOS 5.1.1. – lsp

+0

@lsp, i problemi relativi all'utilizzo di 'Current + Location' sono discussi nella mia risposta [a questa domanda molto simile precedente] (http://stackoverflow.com/a/964131/119114), e i commenti che rispondono ad esso. – Nate

+0

Non voglio che la vista mappa copra tutto lo schermo, dovrebbe mostrare solo la metà del mio schermo è possibile. – Arun

0

È possibile utilizzare MKPlacemark e MKMapItem per lanciare l'applicazione Maps sia con una coordinata e un titolo sul pin di carta:

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

Si noti che è necessario collegare contro AddressBook.framework e anche aggiungere #import <AddressBook/AddressBook.h> da qualche parte nel codice per utilizzare la costante kABPersonAddressStreetKey.

Problemi correlati