Voici la méthode officielle d'Apple:
// 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 des instructions de conduite ou de marche vers l'emplacement, vous pouvez inclure un mapItemForCurrentLocation
avec le MKMapItem
dans le tableau +openMapsWithItems:launchOptions:
et définir les options de lancement de 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 votre iOS 5 d'origine et le code inférieur dans une else
déclaration ultérieure if
. Notez que si vous inversez l'ordre des éléments dans le openMapsWithItems:
tableau, vous obtiendrez des directions entre les coordonnées et votre emplacement actuel. Vous pouvez probablement l'utiliser pour obtenir des directions entre deux emplacements en passant un MKMapItem
élément de carte construit au lieu de l'élément de carte de localisation actuel. Je n'ai pas essayé ça.
Enfin, si vous avez une adresse (sous forme de chaîne) à laquelle vous souhaitez accéder, utilisez le géocodeur pour créer un MKPlacemark
, via 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];
}];
}
currentLocationMapItem
.J'ai trouvé la réponse à ma propre question. Apple documente son format d'URL de cartes ici . Il semble que vous puissiez essentiellement remplacer
maps.google.com
parmaps.apple.com
.Mise à jour: Il s'avère que la même chose est vraie dans MobileSafari sur iOS 6; en appuyant sur un lien pour
http://maps.apple.com/?q=...
ouvrir l'application Maps avec cette recherche, de la même manièrehttp://maps.google.com/?q=...
que dans les versions précédentes. Cela fonctionne et est documenté dans la page liée ci-dessus.MISE À JOUR: Cela répond à ma question relative au format URL. Mais la réponse de nevan king ici (voir ci-dessous) est un excellent résumé de l'API Maps actuelle.
la source
La meilleure façon de le faire est d'appeler la nouvelle méthode iOS 6 sur
MKMapItem
openInMapsWithLaunchOptions:launchOptions
Exemple:
Cela lancera la navigation pour conduire à partir de l'emplacement actuel.
la source
MKMapItem
quand tout ce que j'ai est une adresse? Cette API semble un peu compliquée pour ce cas d'utilisation simple.Je vois que vous avez trouvé le "schéma" de l'url maps.apple.com. C'est un bon choix car il redirigera automatiquement les anciens appareils vers maps.google.com. Mais pour iOS 6, il existe une nouvelle classe dont vous voudrez peut-être profiter: MKMapItem .
Deux méthodes qui vous intéressent:
la source
init
MKMapItem
avec unMKPlacemark
, ce que vous obtenez en fournissant une paire latitude / longitude et un dictionnaire d'adresses. Cela semble plus simple à ouvrirhttp://maps.apple.com/?q=1+infinite+loop+cupertino+ca
. Y a-t-il un avantage à utiliserMKMapItem
lorsque tout ce que vous voulez faire est d'afficher une adresse dans Maps?MKMapItem
si vous n'avez pas déjà une référence à celui que vous souhaitez utiliser. Il suffit d' utiliser la méthode de classe,+openMapsWithItems:launchOptions:
surMKMapItem
faire la même chose.MKMapItem
API et elle dépose un point sur la carte intitulé "Emplacement inconnu". Existe-t-il un moyen de lui faire afficher un nom pour l'emplacement? Je ne vois aucune clé pour cela dans les options du dictionnaire d'adresses ...Voici une classe utilisant la solution de nevan king réalisée dans Swift:
la source
J'ai trouvé ennuyeux d'utiliser le http://maps.apple.com?q= configuration du lien ... ouvre d'abord le navigateur Safari sur les appareils plus anciens.
Ainsi, pour un appareil iOS 5 ouvrant votre application avec une référence à maps.apple.com, les étapes ressemblent à:
Je pense que les étapes 2 et 3 (très évidentes et déroutantes) sont ennuyeuses pour les utilisateurs. Par conséquent, je vérifie la version du système d'exploitation et j'exécute maps.google.com ou maps.apple.com sur l'appareil (pour les versions du système d'exploitation respectivement ios 5 ou ios 6).
la source
Mes recherches sur cette question m'amènent aux conclusions suivantes:
la source
Si vous souhaitez plutôt ouvrir Google Maps (ou proposer une option secondaire), vous pouvez utiliser les schémas d'URL
comgooglemaps://
etcomgooglemaps-x-callback://
documentés ici .la source
Avant de lancer url, supprimez tout caractère spécial de l'url et remplacez les espaces par +. Cela vous évitera quelques maux de tête:
la source
// VKJ
la source
Mise à jour vers Swift 4 en fonction de la réponse de @ PJeremyMalouf:
la source
Ne pas utiliser de cartes, mais simplement utiliser une action UiButton par programme, cela a très bien fonctionné pour moi.
Vous pouvez diffuser un peu de ce code. Par exemple, j'ai mis la variable en tant que variable de niveau de classe, j'ai fait remplir une autre fonction, puis, lorsque j'ai appuyé sur le bouton, j'ai simplement pris ce qui se trouvait dans la variable et l'ai nettoyé pour être utilisé dans une URL.
la source