159 votes

Ouvrez l'application Maps par programmation dans iOS 6

Avant iOS 6, l'ouverture d'une URL de ce type ouvrait l'application Google Maps:

 NSURL *url = [NSURL URLWithString:@"http://maps.google.com/?q=New+York"];
[[UIApplication sharedApplication] openURL:url];
 

Maintenant, avec la nouvelle implémentation Apple Maps, cela ouvre simplement Mobile Safari à Google Maps. Comment puis-je accomplir le même comportement avec iOS 6? Comment puis-je ouvrir par programme l'application Maps et lui indiquer un emplacement / une adresse / une recherche / quelque chose en particulier?

281voto

nevan king Points 46410

Voici l'officiel d'Apple façon:

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) 
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = 
                CLLocationCoordinate2DMake(16.775, -3.009);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate 
                                            addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"My Place"];
    // Pass the map item to the Maps app
    [mapItem openInMapsWithLaunchOptions:nil];
}

Si vous souhaitez obtenir de conduire ou de marcher des instructions à l'emplacement, vous pouvez inclure un mapItemForCurrentLocation avec l' MKMapItem dans le tableau en +openMapsWithItems:launchOptions:, et de définir les options de lancement de la manière appropriée.

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) 
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = 
                CLLocationCoordinate2DMake(16.775, -3.009);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate 
                                            addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"My Place"];

    // Set the directions mode to "Walking"
    // Can use MKLaunchOptionsDirectionsModeDriving instead
    NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeWalking};
    // Get the "Current User Location" MKMapItem
    MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
    // Pass the current location and destination map items to the Maps app
    // Set the direction mode in the launchOptions dictionary
    [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] 
                    launchOptions:launchOptions];
}

Vous pouvez conserver l'original de votre iOS 5 et inférieur du code dans une else déclaration après qu' if. Notez que si vous inversez l'ordre des éléments dans l' openMapsWithItems: tableau, vous obtenez les directions à partir de la coordonnée à votre emplacement actuel. Vous pourriez probablement utiliser pour obtenir un itinéraire entre deux lieux en passant par la construction d'un MKMapItem à la place de l'actuel emplacement de l'élément de la carte. Je n'ai pas essayé.

Enfin, si vous avez une adresse (comme une chaîne de caractères) que vous voulez les directions, utiliser le geocoder de créer un MKPlacemark, par voie d' CLPlacemark.

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:@"Piccadilly Circus, London, UK" 
        completionHandler:^(NSArray *placemarks, NSError *error) {

        // Convert the CLPlacemark to an MKPlacemark
        // Note: There's no error checking for a failed geocode
        CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
        MKPlacemark *placemark = [[MKPlacemark alloc]
                                  initWithCoordinate:geocodedPlacemark.location.coordinate
                                  addressDictionary:geocodedPlacemark.addressDictionary];

        // Create a map item for the geocoded address to pass to Maps app
        MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
        [mapItem setName:geocodedPlacemark.name];

        // Set the directions mode to "Driving"
        // Can use MKLaunchOptionsDirectionsModeWalking instead
        NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving};

        // Get the "Current User Location" MKMapItem
        MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];

        // Pass the current location and destination map items to the Maps app
        // Set the direction mode in the launchOptions dictionary
        [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] launchOptions:launchOptions];

    }];
}

80voto

Mr. Jefferson Points 2742

Trouvé la réponse à ma propre question. Apple documents de ses cartes format de l'URL ici. Il semble que vous pouvez remplacer maps.google.com avec maps.apple.com.

Mise à jour: Il s'avère que la même chose est vraie dans MobileSafari sur iOS 6; taraudage d'un lien vers http://maps.apple.com/?q=... ouvre l'application Maps à la recherche de la même manière, http://maps.google.com/?q=... fait sur les versions précédentes. Cela fonctionne et est documenté dans la page liée ci-dessus.

Mise à JOUR: Il répond à ma question concernant le format de l'URL. Mais nevan du roi réponse ici (voir ci-dessous) est un excellent résumé de la réelle Maps API.

41voto

zvonicek Points 432

La meilleure façon de le faire est d'appeler un nouveau sélecteur iOS 6 sur MKMapItem openInMapsWithLaunchOptions:launchOptions

Exemple:

 CLLocationCoordinate2D endingCoord = CLLocationCoordinate2DMake(40.446947, -102.047607);
MKPlacemark *endLocation = [[MKPlacemark alloc] initWithCoordinate:endingCoord addressDictionary:nil];
MKMapItem *endingItem = [[MKMapItem alloc] initWithPlacemark:endLocation];

NSMutableDictionary *launchOptions = [[NSMutableDictionary alloc] init];
[launchOptions setObject:MKLaunchOptionsDirectionsModeDriving forKey:MKLaunchOptionsDirectionsModeKey];

[endingItem openInMapsWithLaunchOptions:launchOptions];
 

Cela lancera la navigation pour la conduite à partir de l'emplacement actuel.

7voto

Filip Radelic Points 18860

Je vois que vous avez trouvé les maps.apple.com url "régime". C'est un bon choix car il va rediriger automatiquement les appareils plus anciens, à maps.google.com. Mais pour iOS 6 il y a une nouvelle classe, vous voudrez peut-être prendre avantage de: MKMapItem.

Deux méthodes qui sont d'intérêt pour vous:

  1. -openInMapsWithLaunchOptions: - appeler une MKMapItem exemple pour l'ouvrir dans google Maps.app
  2. +openMapsWithItems:launchOptions: - appeler MKMapItem classe pour ouvrir un tableau de MKMapItem instances.

4voto

EeKay Points 1785

Je l'ai trouvé ennuyeux que l'utilisation de la http://maps.apple.com?q=... lien de configuration s'ouvre le navigateur safari d'abord à des appareils plus anciens.

Donc pour iOS 5 appareil à l'ouverture de votre application avec une référence à maps.apple.com les étapes ressembler à:

  1. vous cliquez sur un élément dans l'application et il se réfère à la maps.apple.com url
  2. safari s'ouvre le lien
  3. l'maps.apple.com serveur redirige vers la maps.google.com url
  4. l'maps.google.com url est interprété et ouvre l'application google Maps.

Je pense que la (très évident et la confusion) les étapes 2 et 3 sont ennuyeux pour les utilisateurs. J'ai donc vérifier la version de l'os et de l'exécuter maps.google.com ou maps.apple.com sur l'appareil (resp. ios 5 ou ios 6 versions du système d'exploitation).

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