So rufen Sie iPhone Maps für Wegbeschreibungen mit dem aktuellen Standort als Startadresse auf

72

Ich weiß, dass es möglich ist, die iPhone-Kartenanwendung zu starten, indem Sie openURLeine Google Maps-URL mit Parametern saddrund daddrStandortzeichenfolgen 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.

eriaac
quelle
Ich versuche, genau diese Funktion auszuführen, und ich habe Karten, die gut mit dem Ziel geladen werden können. Wenn ich jedoch Google Maps lade, erhalte ich den letzten bekannten GPS-Wert, selbst wenn die Stunden oder Tage veraltet sind. Manchmal gibt es mir Standortwerte, die eine Meile oder mehr entfernt sind ... Wie erhalte ich genaue aktuelle Standortwerte? Vermisse ich etwas mit der Genauigkeit von CoreLocation? thx

Antworten:

133

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 MKMapItemKlasse für iOS 6 verwenden. Weitere Informationen finden Sie in den Apple API-Dokumenten hier

Grundsä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 MKMapItemAPI-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.

Nate
quelle
2
Dies ist komplizierter als nötig. Siehe die Antwort von @bob unten, wo Sie "Current + Location" als Parameter übergeben
Willster
1
@Willster: Wenn jemand herausfinden kann, wie der aktuelle Standort als Parameter auf dem iPad funktioniert, bin ich verkauft !!
Joe D'Andrea
2
Eigentlich, Willster ... es ist nicht komplizierter als nötig. Schauen Sie sich das Datum dieses Threads an. Es gab kein OS 4.0. In 3.x mussten Sie die Koordinaten übergeben. Wie Joe anspielt, gibt es immer noch viele iPads auf 3.2, ganz zu schweigen von iPod Touches oder iPhones, bei denen Benutzer einfach nicht zum Upgrade kommen. Außerdem gibt es das Problem der Lokalisierung. Wenn der Benutzer kein Englisch verwendet, funktioniert Current + Location nicht. Wenn Sie also möchten, dass Ihre Lösung robust ist, müssen Sie die Koordinaten übergeben.
Nate
1
"Weißt du, ich glaube ich habe heute etwas gelernt." Umfassen Sie die Koordinaten. :)
Joe D'Andrea
4
Obwohl Current+Locationzuvor gearbeitet, scheint dies unter iOS 5.1.1 nicht mehr zu funktionieren.
Jason McCreary
21
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.

Tchettane
quelle
2
Funktioniert für mich auf dem iPhone, aber nicht auf dem iPad. Im letzteren Fall beginne ich bei Current, MO. :(
Joe D'Andrea
Ich habe kein iPad, um das zu testen, aber wie heißt das Lesezeichen für die aktuelle Position in der iPad Map-App?
Tchettane
In US-Englisch (zumindest) wird es als "Aktueller Standort" angezeigt ... es sei denn, dies ist bereits als Start- / Endpunkt festgelegt ... dann fehlt es in der Lesezeichenliste.
Joe D'Andrea
Was für eine Schande, dass wir es übersetzen müssen ... Ich bin sicher, es gibt einen speziellen Code, aber welcher ...
Thomas Decaux
Obwohl es vorher funktioniert hat, scheint dies unter iOS 5.1.1 nicht mehr zu funktionieren.
Jason McCreary
11

Dies funktioniert auf dem iPhone:

http://maps.google.com/maps?saddr=Current Location & daddr = 123 Main St, Ottawa, ON

Bob
quelle
Sie müssen die Leerzeichen codieren, aber ja, das funktioniert. siehe hier: stackoverflow.com/questions/4590972/…
Jerph
1
Funktioniert sehr gut auf dem iPhone! Auf dem iPad lande ich auf - ich mache dir nichts vor - Current, MO. : -o
Joe D'Andrea
das funktioniert nicht Ich habe es gerade auf meinem iPhone (4.2.6) versucht. Docs sagen, es sollte, aber es tut nicht
JohnO
1
Verwenden Sie stattdessen "Aktuell + Standort". Hat für mich gearbeitet.
Nevan König
1
Diese Lösung funktioniert nur, wenn der Benutzer seine Telefonsprache auf Englisch eingestellt hat.
Sixstatesaway
10

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];
TheInterestedOne
quelle
5

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.

August
quelle
2
Ich kann nicht sehen, wie wichtig Sandboxing ist, um Maps zu bitten, den aktuellen Standort zu verwenden. Dies ist eine unsinnige Antwort.
Grahamparks
3
Ich glaube, die Antwort bezieht sich auf die Tatsache, dass "Aktueller Speicherort" zu den Lesezeichen in der Kartenanwendung gehört und dass Apps keinen Zugriff auf diese Lesezeichen haben. Kein Unsinn, nur diese Verbindung fehlt.
James J
Ich vermute, dass die Verwendung von "Current Location" (oder der URI-codierten Variante) nur auf dem iPhone / iPod touch einen "glücklichen Unfall" darstellt, da es nur trotz allem funktioniert. (Dass es I18N zu berücksichtigen gibt, reicht aus, um mich zu überzeugen - bleiben Sie bei den Koordinaten!)
Joe D'Andrea
4

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.

Joe Hughes
quelle
3

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 so maps.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 isiPadPseudomethode 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!

Armel Larcier
quelle
2

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.

mal
quelle
2

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]];
}
Deege
quelle
2

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

Joneswah
quelle
1
Guter Beitrag im Karten-URL-Schema, aber Sie sollten die Versionsnummer des Betriebssystems im Allgemeinen nicht auf diese Weise testen. systemVersionist kein Float (z. B. 5.1.1kein Float), und dieser Vergleich kann tatsächlich zu einem falschen Ergebnis führen.
Nate
2

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

Roland Keesom
quelle
1

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.

Jacco
quelle
1

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];       
SudoPlz
quelle