Comment appeler iPhone Maps pour les directions avec l'emplacement actuel comme adresse de départ

voix
72

Je sais qu'il est possible de démarrer l'application iPhone cartes en appelant openURLune URL Google Maps avec des paramètres saddret daddrdes chaînes de localisation ou Lat / Long (voir exemple ci - dessous).

Mais je me demande s'il est possible de rendre l'adresse de départ soit le « emplacement actuel » bookmark cartes afin que je puisse utiliser le carte code de gestion de position de votre application. Ma recherche Google a été assez stérile.

Par exemple:

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

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

Créé 23/02/2009 à 08:11
source utilisateur
Dans d'autres langues...                            


16 réponses

voix
133

Pré iOS 6

Vous devez utiliser Core Localisation pour obtenir l'emplacement actuel, mais avec cette paire lat / long, vous pouvez obtenir des cartes d'itinéraire à partir de là, à une adresse ou l'emplacement. Ainsi:

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 ne voulez éviter d' utiliser CoreLocation pour trouver explicitement l'emplacement actuel, et que vous souhaitez utiliser l' @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"URL au lieu, puis voir ce lien que je fournis dans les commentaires ci - dessous pour savoir comment localiser le + Emplacement chaîne. Cependant, vous prenez avantage d' une autre fonctionnalité non documentée, et comme Jason McCreary indique ci - dessous, il peut ne pas fiable dans les versions ultérieures.


Mise à jour pour iOS 6

A l' origine, carte utilisé Google Maps, mais maintenant, Apple et Google ont des applications de cartes distinctes.

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

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

2) d'utiliser des cartes d' Apple, vous pouvez utiliser la nouvelle MKMapItemclasse pour iOS 6. Voir les API d' Apple docs ici

En gros, vous utiliserez quelque chose comme ça, si le routage à destination des 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 soutenir à la fois iOS 6 + et iOS 6 avant dans le même code, je vous recommande d' utiliser quelque chose comme ce code que Apple a sur la MKMapItempage doc 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 Xcode SDK de base est iOS 6 (ou dernier iOS ).

Créé 08/06/2009 à 10:49
source utilisateur

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

Cela fonctionne, mais seulement quand la langue iPhone / iPod est réglé en anglais. Si vous voulez soutenir d'autres langues que vous devrez utiliser une chaîne localisée pour correspondre au nom du signet Maps.

Créé 01/12/2010 à 11:05
source utilisateur

Créé 01/11/2010 à 15:46
source utilisateur

voix
10

Vous pouvez utiliser un #define préprocesseur comme:

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

pour comprendre votre version iOS. Ensuite, je peux utiliser ce code pour soutenir iOS 6 aussi:

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];
Créé 30/09/2012 à 10:51
source utilisateur

voix
5

En raison de sandbox, vous n'avez pas accès aux signets de l'application de la carte.

Au lieu de cela, utilisez Core Location pour déterminer l'emplacement actuel vous. Utilisez ensuite cet endroit (la latitude et à long) dans l'URL que vous construisez pour ouvrir Maps.

Créé 23/02/2009 à 16:07
source utilisateur

voix
4

Je recommande de vérifier CMMapLauncher , un mini-bibliothèque que je construit pour lancer Apple, Google et d' autres applications de cartographie iOS avec une demande de cartographie spécifique. Avec CMMapLauncher, le code pour obtenir les instructions de votre question serait:

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

Comme vous pouvez le voir, il encapsule aussi la version vérification nécessaire entre iOS 6 et d'autres.

Créé 07/09/2013 à 13:37
source utilisateur

voix
3

Hé depuis iOS6 est sorti!

Apple a fait quelque chose de remarquable dans une mauvaise façon (de mon point de vue).

Les cartes d'Apple sont lancés et pour les appareils fonctionnant sous iOS 6 , vous ne devriez pas utiliser maps.google.com/?q=si vous voulez que l'iDevice pour ouvrir l'application du plan natif. Maintenant , ce serait maps.apple.com/?q=.

Alors que les développeurs ne doivent pas beaucoup de travail, le serveur maps.apple.com convivial réoriente de sorte que le changement est transparent tous les appareils non-Apple à maps.google.com.

De cette façon, nous developpeurs suffit de changer toutes les chaînes de requête Google pour les pommes de. C'est ce que je n'aime pas beaucoup.

Je devais mettre en œuvre cette fonctionnalité aujourd'hui, donc je l'ai fait. Mais je sentais que je ne devrais pas simplement réécrire toutes les URL se trouvant sur le site mobile pour cibler le serveur de cartes d'Apple, donc je pensais que je venais de côté serveur détecte iDevices et servir urls de pomme seulement pour ceux-ci. Je pensais que je partage.

J'utilise PHP donc je l'opensource mobile bibliothèque détecter: http://code.google.com/p/php-mobile-detect/

Il suffit d' utiliser la isiPadméthode pseudo comme getter booléen et vous avez terminé, vous convertissez wont Google en pomme ;-)

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

À votre santé!

Créé 21/09/2012 à 18:57
source utilisateur

voix
2

Si vous ne voulez pas demander des autorisations d'emplacement et ne pas la latitude et lng, utilisez ce qui suit.

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

Pour iOS5, l'emplacement actuel doit être dans la langue correcte. J'utilise le LocalizedCurrentLocation de ce poste http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

Pour iOS6, j'utilise le CLGeocoder pour obtenir le placemark puis ouvrez la carte avec elle et l'emplacement actuel.

Rappelez-vous d'ajouter CoreLocation.framework et MapKit.framework

Créé 06/12/2012 à 13:14
source utilisateur

voix
2

Pour iOS6 les docs Apple recommande d'utiliser l'URL maps.apple.com équivalent Scheme

donc utiliser

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

au lieu de

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

être le code serait rétrocompatible

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

il y a une charge entière d'autres paramètres pris en charge pour le système d'URL Apple Maps: d' Apple URL Schéma de référence

vous pouvez utiliser ces macros de détection de la version iOS si vous avez du code conditionnel dans d' autres parties de votre code. macros version iOS

Créé 20/09/2012 à 11:53
source utilisateur

voix
2

La vraie solution se trouve ici. Z5 Concepts code de développement iOS Snippet

Il faut juste un peu de codage.

- (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]];
}
Créé 02/06/2012 à 17:51
source utilisateur

voix
2

Vous pouvez le faire maintenant en html juste d'une URL sur votre appareil mobile uniquement. Voici un exemple . La chose est cool si vous en faire un code qr vous avez un moyen de quelqu'un pour vous obtenir les directions où qu'ils se trouvent juste en balayant sur leur téléphone.

Créé 27/05/2010 à 00:34
source utilisateur

voix
1

Ma suggestion serait d'utiliser OpenInGoogleMaps iOS car cela est un choix à la date (en Novembre 2015), il prend en charge l' installation des cabosses de cacao et vous êtes prêt à partir en quelques clics.

Installation à l'aide: pod "OpenInGoogleMaps"

Exiger dans le fichier d'en-tête en utilisant: #import "OpenInGoogleMapsController.h"

Exemple de code ci-dessous:

/*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];       
Créé 10/11/2015 à 13:35
source utilisateur

voix
1

Avec la version actuelle de Google Maps, omettez simplement le sadrparamètre:

saddr: ... Si la valeur est vide, puis sera utilisé l'emplacement actuel de l'utilisateur.

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

Créé 15/12/2013 à 19:30
source utilisateur

voix
1

Pour iOS6 application Maps, vous pouvez simplement utiliser la même URL affiché ci-dessus http://maps.google.com/maps?saddr=%f,%f&daddr=%@

mais au lieu de l'URL Google Maps, vous utilisez l'URL avec pour maps://résultat l'URL suivante:maps://saddr=%f,%f&daddr=%@.

En utilisant « emplacement actuel » ne semble pas fonctionner, donc je suis resté avec les coordonnées.

Antother bonne chose: Il est rétrocompatible: Sur iOS5, il lance l'application Google Maps.

Créé 13/09/2012 à 13:21
source utilisateur

voix
0

Si vous ne fournissez pas l'emplacement de la source, il prendra position actuelle en tant que source. Essayez ci-dessous code-

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

UIApplication.shared.openURL (URL (chaîne: urlString))

Créé 18/09/2017 à 12:06
source utilisateur

voix
0

Je lui ai répondu ceci sur un thread différent. ( Position actuelle ne fonctionne pas avec Apple IOS 6 Plans ). Vous devez obtenir les coordonnées de l'emplacement actuel d' abord, puis utilisez pour créer l'URL de la carte.

Créé 11/01/2013 à 06:37
source utilisateur

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