72 votes

Comment invoquer iPhone Maps for Directions avec l'emplacement actuel comme adresse de départ ?

Je sais qu'il est possible de lancer l'application iPhone maps en appelant openURL sur une URL de google maps avec des paramètres saddr et daddr avec des chaînes de localisation ou Lat/Long (voir l'exemple ci-dessous).

Mais je me demande s'il est possible de faire en sorte que l'adresse de départ soit la "Emplacement actuel" le signet des cartes afin que je puisse utiliser le Cartes le code de gestion de l'emplacement de l'application. Mes recherches sur Google n'ont rien donné.

Par exemple :

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

Sauf avec quelque chose pour invoquer le signet de l'emplacement actuel à la place de myLatLong .

133voto

Nate Points 22452

Pré iOS 6

Vous devez utiliser Core Location pour obtenir l'emplacement actuel, mais avec ce couple lat/long, vous pouvez demander à Maps de vous diriger vers une adresse ou un emplacement. Par exemple :

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

Enfin, si vous souhaitez éviter d'utiliser CoreLocation pour trouver explicitement l'emplacement actuel, et que vous voulez utiliser la méthode @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@" au lieu de l'url, alors voir ce lien que j'ai fourni dans les commentaires ci-dessous pour savoir comment localiser le Actuel+Localisation chaîne. Cependant, vous profitez d'une autre fonctionnalité non documentée, et comme Jason McCreary le souligne ci-dessous, il se peut que cela ne fonctionne pas de manière fiable dans les futures versions.


Mise à jour pour iOS 6

A l'origine, Cartes utilisait Google maps, mais maintenant, Apple et Google ont des applications de cartes séparées.

1) Si vous souhaitez effectuer un itinéraire en utilisant l'application Google Maps, utilisez le schéma URL de comgooglemaps :

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

2) Pour utiliser Apple Maps, vous pouvez utiliser la nouvelle fonction MKMapItem pour iOS 6. Voir les documents de l'API Apple ici

Fondamentalement, vous utiliserez quelque chose comme ceci, si le routage vers la destination coordonnées ( 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];

Afin de prendre en charge à la fois iOS 6+ et pré iOS 6 dans le même code, je recommanderais d'utiliser quelque chose comme ce code qu'Apple a mis en place sur le site Web de l'entreprise. MKMapItem Page de documentation sur l'API :

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

Cela suppose que votre SDK de base Xcode est iOS 6 (ou Dernier iOS ).

21voto

Tchettane Points 246
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];

Cela fonctionne mais uniquement lorsque la langue de l'iPhone/iPod est réglée sur l'anglais. Si vous souhaitez prendre en charge d'autres langues, vous devrez utiliser une chaîne localisée correspondant au nom du signet Maps.

11voto

bob Points 99

10voto

TheInterestedOne Points 393

Vous pouvez utiliser un #define de préprocesseur comme :

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

pour comprendre votre version d'iOS. Ensuite, je pourrai utiliser ce code pour prendre en charge iOS 6, également :

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

5voto

August Points 9726

En raison du sandboxing, vous n'avez pas accès aux signets de l'application Map.

Au lieu de cela, utilisez Core Location pour déterminer vous-même l'emplacement actuel. Utilisez ensuite cet emplacement (lat et long) dans l'URL que vous construisez pour ouvrir Maps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X