Hier ist der offizielle Apple-Weg:
// 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];
}
Wenn Sie erhalten mögen Auto fahren oder Anweisungen an den Ort zu Fuß, können Sie eine sind mapItemForCurrentLocation
mit dem MKMapItem
in der Anordnung in +openMapsWithItems:launchOptions:
und um die Startoptionen entsprechend gesetzt.
// 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];
}
Danach können Sie Ihren ursprünglichen iOS 5 und niedrigeren Code in einer else
Anweisung beibehalten if
. Beachten Sie, dass Sie beim Umkehren der Reihenfolge der Elemente im openMapsWithItems:
Array Anweisungen von der Koordinate zu Ihrem aktuellen Standort erhalten. Sie könnten es wahrscheinlich verwenden, um Wegbeschreibungen zwischen zwei beliebigen Standorten zu erhalten, indem Sie ein konstruiertes MKMapItem
anstelle des aktuellen Standortkartenelements übergeben. Das habe ich nicht versucht.
Schließlich, wenn Sie eine Adresse (als String) , dass Sie Richtungen wollen, verwenden Sie den Geocoder eine erstellen MKPlacemark
, haft 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
.Ich habe die Antwort auf meine eigene Frage gefunden. Apple - Dokumente seine Karten URL - Format hier . Es sieht aus wie Sie im Wesentlichen ersetzen
maps.google.com
mitmaps.apple.com
.Update: Es stellt sich heraus, dass dies auch in MobileSafari unter iOS 6 der Fall ist. Durch Tippen auf einen Link
http://maps.apple.com/?q=...
wird die Karten-App mit dieser Suche geöffnet,http://maps.google.com/?q=...
wie in früheren Versionen. Dies funktioniert und ist auf der oben verlinkten Seite dokumentiert.UPDATE: Dies beantwortet meine Frage zum URL-Format. Die Antwort von nevan king hier (siehe unten) ist jedoch eine hervorragende Zusammenfassung der tatsächlichen Maps-API.
quelle
Der beste Weg, dies zu tun, besteht darin, die neue iOS 6-Methode aufzurufen
MKMapItem
openInMapsWithLaunchOptions:launchOptions
Beispiel:
Dadurch wird die Navigation zum Fahren vom aktuellen Standort aus gestartet.
quelle
MKMapItem
wenn ich nur eine Adresse habe? Diese API scheint für diesen einfachen Anwendungsfall etwas kompliziert zu sein.Ich sehe, Sie haben das URL-Schema "maps.apple.com" gefunden. Dies ist eine gute Wahl, da ältere Geräte automatisch zu maps.google.com umgeleitet werden. Für iOS 6 gibt es jedoch eine neue Klasse, die Sie möglicherweise nutzen möchten: MKMapItem .
Zwei Methoden, die Sie interessieren:
quelle
init
MKMapItem
mit einemMKPlacemark
, das Sie erhalten, indem Sie ein Längen- / Breitengradpaar und ein Adresswörterbuch bereitstellen. Scheint einfacher zu öffnenhttp://maps.apple.com/?q=1+infinite+loop+cupertino+ca
. Gibt es einen Vorteil bei der Verwendung,MKMapItem
wenn Sie lediglich eine Adresse in Maps anzeigen möchten?MKMapItem
wenn Sie noch keinen Verweis auf eine haben, die Sie verwenden möchten. Verwenden Sie einfach die Klassenmethode,+openMapsWithItems:launchOptions:
aufMKMapItem
die gleiche Sache zu tun.MKMapItem
API und es wird ein Punkt auf der Karte mit der Bezeichnung "Unbekannter Ort" abgelegt. Gibt es eine Möglichkeit, einen Namen für den Standort anzuzeigen? Ich sehe keine Schlüssel dafür in den Optionen für das Adresswörterbuch ...Hier ist eine Klasse mit der in Swift abgeschlossenen Lösung von nevan king:
quelle
Ich fand es ärgerlich, dass die Verwendung des Link-Setups http://maps.apple.com?q= ... den Safari-Browser zuerst auf älteren Geräten öffnet.
Für ein iOS 5-Gerät, das Ihre App mit einem Verweis auf maps.apple.com öffnet, sehen die Schritte folgendermaßen aus:
Ich denke, dass die (sehr offensichtlichen und verwirrenden) Schritte 2 und 3 die Benutzer nerven. Daher überprüfe ich die Betriebssystemversion und führe entweder maps.google.com oder maps.apple.com auf dem Gerät aus (für die Betriebssystemversionen ios 5 bzw. ios 6).
quelle
Meine Forschung zu diesem Thema führte mich zu folgenden Schlussfolgerungen:
quelle
Wenn Sie stattdessen Google Maps öffnen möchten (oder als sekundäre Option anbieten möchten), können Sie die hier dokumentierten
comgooglemaps://
undcomgooglemaps-x-callback://
URL-Schemata verwenden .quelle
Entfernen Sie vor dem Starten der URL alle Sonderzeichen aus der URL und ersetzen Sie die Leerzeichen durch +. Dies erspart Ihnen einige Kopfschmerzen:
quelle
// VKJ
quelle
Aktualisiert auf Swift 4 basierend auf der Antwort von @ PJeremyMalouf:
quelle
Ohne Karten, nur programmgesteuert mit einer UiButton-Aktion, hat dies für mich hervorragend funktioniert.
Sie könnten einen Teil dieses Codes ein wenig verbreiten. Zum Beispiel habe ich die Variable als Variable auf Klassenebene eingefügt, sie von einer anderen Funktion ausfüllen lassen. Wenn ich dann auf die Schaltfläche drückte, nahm ich einfach das, was in der Variablen enthalten war, und bereinigte es, um es in einer URL zu verwenden.
quelle