Come richiamare iPhone Maps per arrivarci con posizione corrente come Indirizzo di partenza

voti
72

So che è possibile avviare l'applicazione Mappe iPhone chiamando openURLsu un URL google maps con i parametri saddre daddrcon le stringhe di localizzazione o Lat / Long (vedi esempio sotto).

Ma mi chiedo se è possibile fare l'indirizzo di partenza sia il Current Location segnalibro mappe in modo che possa utilizzare il Maps posizione codice di gestione dell'applicazione. La mia ricerca di Google è stata piuttosto inutile.

Per esempio:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat: @http://maps.google.com/maps?saddr=%@&daddr=%@, myLatLong, latlong]]];

Tranne che con qualcosa di invocare la posizione corrente del segnalibro al posto di myLatLong.

È pubblicato 23/02/2009 alle 08:11
fonte dall'utente
In altre lingue...                            


16 risposte

voti
133

iOS 6 Pre

È necessario utilizzare Core Location per ottenere la posizione corrente, ma con quella coppia lat / lungo, è possibile ottenere mappe a voi percorso da lì, a un indirizzo stradale o di posizione. Così:

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

Infine, se si vuole evitare di utilizzare CoreLocation per trovare in modo esplicito la posizione corrente, e si desidera utilizzare l' @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"URL invece, allora vedere questo link che ho fornito nei commenti qui sotto per informazioni su come localizzare il + posizione corrente di stringa. Tuttavia, si sta approfittando di un'altra funzionalità non documentata, e come sottolinea Jason McCreary qui di seguito, potrebbe non funzionare in modo affidabile nelle versioni future.


Aggiornamento per iOS 6

In origine, mappe utilizzate le mappe di Google, ma ora, Apple e Google hanno APPLICAZIONI MAPPE separati.

1) Se si desidera rotta utilizzando l'app Google Maps, utilizzare lo schema URL comgooglemaps :

NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving",
                    [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

2) utilizzare le mappe di Apple, è possibile utilizzare la nuova MKMapItemclasse per iOS 6. Vedere la documentazione API di Apple qui

In sostanza, si utilizzerà una cosa del genere, se il routing di destinazione coordinate ( 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];

Al fine di supportare sia iOS 6+ e iOS 6 pre nello stesso codice, mi consiglia di utilizzare qualcosa di simile a questo codice che Apple ha sul MKMapItempagina di API doc:

Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
   // iOS 6 MKMapItem available
} else {
   // use pre iOS 6 technique
}

Questo sarebbe scontato che il vostro Xcode Base SDK è iOS 6 (o più recenti di iOS ).

Risposto il 08/06/2009 a 10:49
fonte dall'utente

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

Questo funziona, ma solo quando la lingua di iPhone / iPod è impostato in lingua inglese. Se si desidera supportare altre lingue dovrete usare una stringa localizzata per abbinare il nome del segnalibro Maps.

Risposto il 01/12/2010 a 11:05
fonte dall'utente

Risposto il 01/11/2010 a 15:46
fonte dall'utente

voti
10

È possibile utilizzare un # define preprocessore come:

#define SYSTEM_VERSION_LESS_THAN(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

per capire la vostra versione di iOS. Poi, posso usare questo codice per supportare iOS 6, anche:

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];
Risposto il 30/09/2012 a 10:51
fonte dall'utente

voti
5

A causa di sandboxing, non si ha accesso ai segnalibri dell'applicazione Map.

Invece, utilizzare Core Location per determinare la posizione corrente da soli. Quindi utilizzare quella posizione (lat e lungo) nell'URL si costruisce per aprire Maps.

Risposto il 23/02/2009 a 16:07
fonte dall'utente

voti
4

Mi consiglia di check-out CMMapLauncher , un mini-libreria che ho costruito per il lancio di Apple, Google e altre applicazioni di mappatura iOS con una richiesta specifica mappatura. Con CMMapLauncher, il codice per ottenere le istruzioni nella tua domanda potrebbe essere:

[CMMapLauncher launchMapApp:CMMapAppAppleMaps
          forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin"
                                              coordinate:myLatLong]
                         to:[CMMapPoint mapPointWithName:@"Destination"
                                              coordinate:latlong]];

Come si può vedere, ma racchiude anche controlli previsti tra la versione iOS 6 e altri.

Risposto il 07/09/2013 a 13:37
fonte dall'utente

voti
3

Hey poiché iOS6 è fuori!

Apple ha fatto qualcosa di straordinario in un brutto modo (dal mio punto di vista).

Le mappe di Apple sono lanciati e per i dispositivi che eseguono iOS 6 non si dovrebbe usare maps.google.com/?q=se si desidera che l'iDevice per aprire il Piano app nativa. Ora sarebbe maps.apple.com/?q=.

In modo che gli sviluppatori non devono molto lavoro, il server maps.apple.com amichevole reindirizza tutti i dispositivi non-Apple a maps.google.com modo che il cambiamento è trasparente.

In questo modo noi sviluppatori solo devono passare tutte le stringhe di query di Google a quelli di Apple. Questo è ciò che non mi piace molto.

Ho dovuto attuare tale functionnality oggi così ho fatto. Ma sentivo che non avrei solo riscrivere ogni URL che giace in sito web mobile per indirizzare server di mappe di Apple così ho pensato che avevo appena rilevo iDevices lato server e servire gli URL di mele solo per quelli. Ho pensato di condividere.

Sto utilizzando PHP quindi ho usato l'opensource mobile Rileva libreria: http://code.google.com/p/php-mobile-detect/

Basta usare il isiPadmetodo di pseudo come getter booleano e il gioco è fatto, voi non convertire in google apple ;-)

$server=$detect->isiPad()?"apple":"google";
$href="http://maps.{$server}.com/?q=..."

Saluti!

Risposto il 21/09/2012 a 18:57
fonte dall'utente

voti
2

Se non si vuole chiedere i permessi posizione e non hanno il lat e lng, utilizzare la seguente.

NSString *destinationAddress = @"Amsterdam";

Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:destinationAddress completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count] > 0) {

            MKPlacemark *placeMark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];

            MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:placeMark];

            MKMapItem *mapItem2 = [MKMapItem mapItemForCurrentLocation];


            NSArray *mapItems = @[mapItem, mapItem2];

            NSDictionary *options = @{
        MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
        MKLaunchOptionsMapTypeKey:
            [NSNumber numberWithInteger:MKMapTypeStandard],
        MKLaunchOptionsShowsTrafficKey:@YES
            };

            [MKMapItem openMapsWithItems:mapItems launchOptions:options];

        } else {
            //error nothing found
        }
    }];
    return;
} else {

    NSString *sourceAddress = [LocalizedCurrentLocation currentLocationStringForCurrentLanguage];

    NSString *urlToOpen = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=%@&daddr=%@",
                 [sourceAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                 [destinationAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlToOpen]];
}

Per iOS5, la posizione corrente deve essere nella lingua corretta. Io uso il LocalizedCurrentLocation da questo post http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

Per iOS6, io uso il CLGeocoder per ottenere il segnaposto e quindi aprire la mappa con esso e la posizione corrente.

Ricordarsi di aggiungere CoreLocation.framework e MapKit.framework

Risposto il 06/12/2012 a 13:14
fonte dall'utente

voti
2

Per iOS6 la documentazione di Apple consiglia di utilizzare lo schema URL maps.apple.com equivalente

in modo da utilizzare

http://maps.apple.com/maps?saddr=%f,%f&daddr=%f,%f

invece di

http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f

per essere compatibile il codice sarebbe

    NSString* versionNum = [[UIDevice currentDevice] systemVersion];
    NSString *nativeMapScheme = @"maps.apple.com";
    if ([versionNum compare:@"6.0" options:NSNumericSearch] == NSOrderedAscending)
        nativeMapScheme = @"maps.google.com";
    }
    NSString* url = [NSString stringWithFormat: @"http://%@/maps?saddr=%f,%f&daddr=%f,%f", nativeMapScheme
             startCoordinate.latitude, startCoordinate.longitude,
             endCoordinate.latitude, endCoordinate.longitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

v'è un intero carico di altri parametri supportati per lo schema URL Mappe Apple: Apple ha URL schema di riferimento

è possibile utilizzare questi iOS macro di rilevamento versione se si dispone di codice condizionale in altre parti del codice. iOS versione macro

Risposto il 20/09/2012 a 11:53
fonte dall'utente

voti
2

La vera soluzione può essere trovata qui. Z5 Concetti iOS sviluppo Snippet di codice

Si richiede solo un po 'di codifica.

- (IBAction)directions1_click:(id)sender
{
    NSString* address = @"118 Your Address., City, State, ZIPCODE";
    NSString* currentLocation = @"Current Location";
    NSString* url = [NSStringstringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@",[currentLocation stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    UIApplication *app = [UIApplicationsharedApplication];
    [app openURL: [NSURL URLWithString: url]];
}
Risposto il 02/06/2012 a 17:51
fonte dall'utente

voti
2

È possibile farlo ora in html solo da un URL su un solo dispositivo mobile. Ecco un esempio . La cosa interessante è se si attiva questo in un codice QR si dispone di un modo di qualcuno sta ottenendo le indicazioni per voi ovunque si trovino solo attraverso la scansione sul proprio telefono cellulare.

Risposto il 27/05/2010 a 00:34
fonte dall'utente

voti
1

Il mio suggerimento sarebbe utilizzando OpenInGoogleMaps-iOS in quanto questo è un up a scelta della data (entro novembre 2015), che supporta l'installazione baccelli di cacao e si è pronti ad andare in pochi click.

Installare utilizzando: pod "OpenInGoogleMaps"

Richiede nel file di intestazione con: #import "OpenInGoogleMapsController.h"

Codice di esempio qui di seguito:

/*In case the user does NOT have google maps, then apple maps shall open*/
[OpenInGoogleMapsController sharedInstance].fallbackStrategy = kGoogleMapsFallbackAppleMaps;    

/*Set the coordinates*/
GoogleMapDefinition *definition = [[GoogleMapDefinition alloc] init];   
CLLocationCoordinate2D metsovoMuseumCoords;     //coordinates struct
metsovoMuseumCoords.latitude = 39.770598;
metsovoMuseumCoords.longitude = 21.183215;
definition.zoomLevel = 20;
definition.center = metsovoMuseumCoords;        //this will be the center of the map

/*and here we open the map*/
[[OpenInGoogleMapsController sharedInstance] openMap:definition];       
Risposto il 10/11/2015 a 13:35
fonte dall'utente

voti
1

Con l'attuale versione di Google Maps, basta omettere il sadrparametro:

saddr: ... Se il valore viene lasciato vuoto, quindi posizione corrente dell'utente verrà utilizzato.

https://developers.google.com/maps/documentation/ios/urlscheme

Risposto il 15/12/2013 a 19:30
fonte dall'utente

voti
1

Per iOS6 Maps App, si può semplicemente utilizzare lo stesso URL postato sopra http://maps.google.com/maps?saddr=%f,%f&daddr=%@

ma invece di URL mappe di Google, è possibile utilizzare l'url con maps://conseguente il seguente URL:maps://saddr=%f,%f&daddr=%@.

Usando 'posizione corrente' non sembra funzionare, così sono rimasto con le coordinate.

Antother buona cosa: E 'retrocompatibile: Su iOS5, si lancia l'applicazione Google Maps.

Risposto il 13/09/2012 a 13:21
fonte dall'utente

voti
0

Se non si forniscono percorso di origine, ci vorranno posizione corrente come sorgente. Prova sotto code-

lasciare urlString = " http://maps.apple.com/maps?daddr=(destinationLocation.latitude),(destinationLocation.longitude)&dirflg=d "}

UIApplication.shared.openURL (URL (stringa:! UrlString))

Risposto il 18/09/2017 a 12:06
fonte dall'utente

voti
0

Ho risposto a questa in un thread diverso. ( Posizione attuale non funziona con Mappe Apple IOS 6 ). È necessario per ottenere le coordinate della posizione corrente, quindi utilizzarlo per creare la mappa URL.

Risposto il 11/01/2013 a 06:37
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more