Oto oficjalny sposób 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];
}
Jeśli chcesz uzyskać instrukcje dotyczące jazdy lub chodzenia do lokalizacji, możesz dołączyć do tablicy znak mapItemForCurrentLocation
z MKMapItem
symbolem w +openMapsWithItems:launchOptions:
i odpowiednio ustawić opcje uruchamiania.
// 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];
}
Możesz zachować swój oryginalny kod iOS 5 i niższy w else
instrukcji if
. Zwróć uwagę, że jeśli odwrócisz kolejność elementów w openMapsWithItems:
tablicy, otrzymasz wskazówki od współrzędnych do bieżącej lokalizacji. Prawdopodobnie możesz go użyć, aby uzyskać wskazówki między dowolnymi dwoma lokalizacjami, mijając skonstruowany MKMapItem
zamiast bieżącego elementu mapy. Ja tego nie próbowałem.
Wreszcie, jeśli masz adres (jako ciąg znaków), które chcesz kierować się, aby skorzystać z geocoder utworzyć MKPlacemark
drodze 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
.Znalazłem odpowiedź na moje własne pytanie. Apple dokumentuje tutaj format adresu URL map . Wygląda na to, można w zasadzie wymienić
maps.google.com
zmaps.apple.com
.Aktualizacja: Okazuje się, że to samo dotyczy MobileSafari na iOS 6; stuknięcie łącza, aby
http://maps.apple.com/?q=...
otworzyć aplikację Mapy z tym wyszukiwaniem w ten sam sposóbhttp://maps.google.com/?q=...
jak w poprzednich wersjach. To działa i jest udokumentowane na stronie, do której link znajduje się powyżej.UPDATE: To odpowiada na moje pytanie dotyczące formatu adresu URL. Ale odpowiedź Nevana Kinga tutaj (patrz poniżej) to doskonałe podsumowanie rzeczywistego interfejsu API Map.
źródło
Najlepszym sposobem na to jest wywołanie nowej metody iOS 6
MKMapItem
openInMapsWithLaunchOptions:launchOptions
Przykład:
Spowoduje to rozpoczęcie nawigacji do jazdy z bieżącej lokalizacji.
źródło
MKMapItem
gdy wszystko, co mam, to adres? Ten interfejs API wydaje się nieco skomplikowany w tym prostym przypadku użycia.Widzę, że znalazłeś „schemat” adresu URL maps.apple.com. To dobry wybór, ponieważ automatycznie przekierowuje starsze urządzenia na maps.google.com. Ale dla iOS 6 jest nowa klasa, z której możesz chcieć skorzystać: MKMapItem .
Dwie interesujące Cię metody:
źródło
init
MKMapItem
za pomocąMKPlacemark
, który otrzymujesz, dostarczając parę szerokość / długość geograficzna i słownik adresów. Wydaje się prostsze, aby po prostu otworzyćhttp://maps.apple.com/?q=1+infinite+loop+cupertino+ca
. Czy warto używać,MKMapItem
gdy wszystko, co chcesz zrobić, to pokazać adres w Mapach?MKMapItem
jeśli nie masz jeszcze odniesienia do tego, którego chcesz użyć. Wystarczy skorzystać z metody klasy,+openMapsWithItems:launchOptions:
naMKMapItem
aby zrobić to samo.MKMapItem
API i upuszcza punkt na mapie oznaczony jako „Nieznana lokalizacja”. Czy istnieje sposób, aby wyświetlić nazwę lokalizacji? Nie widzę żadnych kluczy do tego w opcjach słownika adresów ...Oto klasa wykorzystująca rozwiązanie Nevana Kinga ukończone w Swift:
źródło
Denerwowało mnie, że korzystanie z http://maps.apple.com?q= ... konfiguracji linku otwiera najpierw przeglądarkę safari na starszych urządzeniach.
W przypadku urządzenia iOS 5 otwierającego aplikację z odniesieniem do maps.apple.com kroki wyglądają następująco:
Myślę, że (bardzo oczywiste i mylące) kroki 2 i 3 są denerwujące dla użytkowników. Dlatego sprawdzam wersję systemu operacyjnego i uruchamiam na urządzeniu maps.google.com lub maps.apple.com (odpowiednio dla wersji systemu operacyjnego ios 5 lub ios 6).
źródło
Moje badania na ten temat prowadzą mnie do następujących wniosków:
źródło
Jeśli zamiast tego chcesz otworzyć Mapy Google (lub zaoferować jako opcję dodatkową), możesz skorzystać z udokumentowanych tutaj schematów adresów URL
comgooglemaps://
i .comgooglemaps-x-callback://
źródło
Przed uruchomieniem url usuń wszelkie znaki specjalne z adresu URL i zamień spacje na +. Pozwoli to zaoszczędzić trochę bólu głowy:
źródło
// VKJ
źródło
Zaktualizowano do Swift 4 na podstawie odpowiedzi @ PJeremyMalouf:
źródło
Nie używając map, tylko programowo używając akcji UiButton, to zadziałało świetnie.
Możesz trochę rozpowszechnić ten kod. Na przykład umieściłem zmienną jako zmienną na poziomie klasy, kazałem innej funkcji ją wypełnić, a następnie po naciśnięciu przycisku po prostu wziąłem to, co było w zmiennej i wyszorowałem, aby użyć go w adresie URL.
źródło