Ich weiß, dass es möglich ist, die iPhone-Kartenanwendung zu starten, indem Sie openURL
eine Google Maps-URL mit Parametern saddr
und daddr
Standortzeichenfolgen oder Lat / Long aufrufen (siehe Beispiel unten).
Ich frage mich jedoch, ob es möglich ist, die Startadresse als Lesezeichen für die Karte "Aktueller Standort" festzulegen, damit ich den Standortbehandlungscode der Karten- App verwenden kann. Meine Google-Suche war ziemlich erfolglos.
Zum Beispiel:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@", myLatLong, latlong]]];
Außer mit etwas, um das aktuelle Standort-Lesezeichen anstelle von aufzurufen myLatLong
.
ios
objective-c
google-maps
eriaac
quelle
quelle
Antworten:
Vor iOS 6
Sie müssen Core Location verwenden, um den aktuellen Standort abzurufen. Mit diesem Lat / Long-Paar können Sie jedoch Karten erhalten, mit denen Sie von dort zu einer Adresse oder einem Standort weitergeleitet werden. Wie so:
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]];
Wenn Sie vermeiden möchten, CoreLocation zu verwenden, um den aktuellen Speicherort explizit zu finden, und
@"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"
stattdessen die URL verwenden möchten, lesen Sie diesen Link, den ich in den Kommentaren unten angegeben habe , um die Zeichenfolge Current + Location zu lokalisieren . Sie nutzen jedoch eine andere undokumentierte Funktion, und wie Jason McCreary weiter unten ausführt, funktioniert sie in zukünftigen Versionen möglicherweise nicht zuverlässig.Update für iOS 6
Ursprünglich verwendeten Maps Google Maps, jetzt haben Apple und Google separate Karten-Apps.
1) Wenn Sie mit der Google Maps-App routen möchten, verwenden Sie das URL-Schema von comgooglemaps :
NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving", [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
2) Um Apple Maps zu verwenden, können Sie die neue
MKMapItem
Klasse für iOS 6 verwenden. Weitere Informationen finden Sie in den Apple API-Dokumenten hierGrundsätzlich verwenden Sie so etwas, wenn Sie an Zielkoordinaten (
latlong
) weiterleiten :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];
Um sowohl iOS 6+ als auch vor iOS 6 im selben Code zu unterstützen, würde ich empfehlen, so etwas wie diesen Code zu verwenden, den Apple auf der
MKMapItem
API-Dokumentseite hat:Class itemClass = [MKMapItem class]; if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) { // iOS 6 MKMapItem available } else { // use pre iOS 6 technique }
Dies setzt voraus, dass Ihr Xcode Base SDK iOS 6 (oder das neueste iOS ) ist.
quelle
Current+Location
zuvor gearbeitet, scheint dies unter iOS 5.1.1 nicht mehr zu funktionieren.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];
Dies funktioniert jedoch nur, wenn die iPhone / iPod-Sprache auf Englisch eingestellt ist. Wenn Sie andere Sprachen unterstützen möchten, müssen Sie eine lokalisierte Zeichenfolge verwenden, die mit dem Namen des Maps-Lesezeichens übereinstimmt.
quelle
Dies funktioniert auf dem iPhone:
quelle
Sie können einen Präprozessor #define wie folgt verwenden:
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
um Ihre iOS-Version zu verstehen. Dann kann ich diesen Code auch zur Unterstützung von iOS 6 verwenden:
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];
quelle
Aufgrund von Sandboxing haben Sie keinen Zugriff auf die Lesezeichen der Kartenanwendung.
Verwenden Sie stattdessen Core Location, um den aktuellen Standort selbst zu bestimmen. Verwenden Sie dann diesen Speicherort (lat und long) in der URL, die Sie zum Öffnen von Maps erstellen.
quelle
Ich empfehle CMMapLauncher , eine Minibibliothek , die ich zum Starten von Apple, Google und anderen iOS-Mapping-Apps mit einer bestimmten Mapping-Anfrage erstellt habe. Mit CMMapLauncher lautet der Code zum Abrufen der Anweisungen in Ihrer Frage:
[CMMapLauncher launchMapApp:CMMapAppAppleMaps forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin" coordinate:myLatLong] to:[CMMapPoint mapPointWithName:@"Destination" coordinate:latlong]];
Wie Sie sehen können, enthält es auch die Versionsprüfung, die zwischen iOS 6 und anderen erforderlich ist.
quelle
Hey, da iOS6 raus ist!
Apple hat etwas Bemerkenswertes schlecht gemacht (aus meiner Sicht).
Apples Karten werden gestartet und für Geräte mit iOS 6 sollten Sie sie nicht verwenden,
maps.google.com/?q=
wenn das iDevice die native Plan-App öffnen soll. Jetzt wäre es somaps.apple.com/?q=
.Damit Entwickler nicht zu viel arbeiten müssen, leitet der benutzerfreundliche Server maps.apple.com alle Geräte, die nicht von Apple stammen, an maps.google.com weiter, sodass die Änderung transparent ist.
Auf diese Weise müssen wir Entwickler nur alle Google-Abfragezeichenfolgen auf Apple-Zeichenfolgen umstellen. Das mag ich nicht.
Ich musste diese Funktionalität heute implementieren, also habe ich es getan. Aber ich hatte das Gefühl, ich sollte nicht einfach jede URL auf der mobilen Website neu schreiben, um auf den Kartenserver von Apple abzuzielen, also dachte ich, ich würde iDevices nur serverseitig erkennen und Apple-URLs nur für diese bereitstellen. Ich dachte, ich würde teilen.
Ich verwende PHP, also habe ich die OpenSource Mobile Detect-Bibliothek verwendet: http://code.google.com/p/php-mobile-detect/
Verwenden Sie einfach die
isiPad
Pseudomethode als Booleschen Getter und Sie sind fertig, Sie werden Google nicht in Apple konvertieren ;-)$server=$detect->isiPad()?"apple":"google"; $href="http://maps.{$server}.com/?q=..."
Prost!
quelle
Sie können dies jetzt in HTML nur über eine URL auf Ihrem Mobilgerät tun. Hier ist ein Beispiel . Das Coole ist, wenn Sie dies in einen QR-Code umwandeln, haben Sie die Möglichkeit, dass jemand von überall eine Wegbeschreibung zu Ihnen erhält, indem Sie ihn einfach auf seinem Telefon scannen.
quelle
Die wirkliche Lösung finden Sie hier. Z5 Konzepte iOS Development Code Snippet
Es erfordert nur ein wenig Codierung.
- (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]]; }
quelle
Für iOS6 empfehlen die Apple-Dokumente die Verwendung des entsprechenden URL-Schemas für maps.apple.com
also benutze
http://maps.apple.com/maps?saddr=%f,%f&daddr=%f,%f
anstatt
http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f
abwärtskompatibel wäre der Code
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]];
Es gibt eine ganze Reihe weiterer unterstützter Parameter für das Apple Maps-URL-Schema: Apple URL Scheme Reference
Sie können diese iOS-Versionserkennungsmakros verwenden, wenn Sie in anderen Teilen Ihres Codes bedingten Code haben. Makros der iOS-Version
quelle
systemVersion
ist kein Float (z. B.5.1.1
kein Float), und dieser Vergleich kann tatsächlich zu einem falschen Ergebnis führen.Wenn Sie nicht nach Standortberechtigungen fragen möchten und nicht über lat und lng verfügen, verwenden Sie Folgendes.
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]]; }
Für ios5 muss der aktuelle Standort in der richtigen Sprache sein. Ich verwende die LocalizedCurrentLocation aus diesem Beitrag http://www.martip.net/blog/localized-current-location-string-for-iphone-apps
Für ios6 verwende ich den CLGeocoder, um die Ortsmarke zu erhalten, und öffne dann die Karte mit ihr und dem aktuellen Standort.
Denken Sie daran, CoreLocation.framework und MapKit.framework hinzuzufügen
quelle
Für die iOS6 Maps App können Sie einfach dieselbe oben angegebene URL verwenden
http://maps.google.com/maps?saddr=%f,%f&daddr=%@
Anstelle der Google Maps-URL verwenden Sie jedoch die URL mit
maps://
der folgenden URL:maps://saddr=%f,%f&daddr=%@.
Die Verwendung von 'Aktueller Standort' scheint nicht zu funktionieren, daher habe ich mich an die Koordinaten gehalten.
Eine weitere gute Sache: Es ist abwärtskompatibel: Unter iOS5 wird die Google Maps-App gestartet.
quelle
Lassen Sie bei der aktuellen Version von Google Maps einfach den
sadr
Parameter weg :https://developers.google.com/maps/documentation/ios/urlscheme
quelle
Mein Vorschlag wäre die Verwendung von OpenInGoogleMaps-iOS, da dies eine aktuelle Option ist (bis November 2015), die Installation von Kakaofrüchten unterstützt und Sie mit wenigen Klicks einsatzbereit sind.
Installieren Sie mit:
pod "OpenInGoogleMaps"
In der Header-Datei erforderlich mit:
#import "OpenInGoogleMapsController.h"
Beispielcode unten:
/*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];
quelle
Ich habe dies in einem anderen Thread beantwortet. (Der aktuelle Standort funktioniert nicht mit Apple Maps IOS 6 ). Sie müssen zuerst die Koordinaten des aktuellen Standorts abrufen und dann die Karten-URL erstellen.
quelle
Wenn Sie keinen Quellspeicherort angeben, wird der aktuelle Speicherort als Quelle verwendet. Versuchen Sie unten Code-
let urlString = " http://maps.apple.com/maps?daddr=(destinationLocation.latitude),(destinationLocation.longitude)&dirflg=d "}
UIApplication.shared.openURL (URL (Zeichenfolge: urlString)!)
quelle