it-swarm.com.de

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

Ich weiß, dass es möglich ist, die iPhone-Kartenanwendung zu starten, indem Sie openURL über eine Google Maps-URL mit den Parametern saddr und daddr mit Standortzeichenfolgen oder Lat/Long aufrufen (siehe Beispiel unten). 

Ich frage mich jedoch, ob es möglich ist, die Startadresse als Lesezeichen für "Current Location" Maps zu definieren, sodass ich den Code für die Standortverarbeitung der Maps - 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 myLatLong aufzurufen.

72
eriaac

Vor iOS 6

Sie müssen Core Location verwenden, um den aktuellen Standort abzurufen. Mit diesem Lat/Long-Paar können Sie jedoch Maps erhalten, um Sie von dort zu einer Straße oder einem Ort zu routen. So wie:

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 die Verwendung des CoreLocation nicht explizit suchen möchten, um den aktuellen Speicherort explizit zu finden, und stattdessen die URL @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@" verwenden möchten, dann siehe diesen Link, den ich in den Kommentaren weiter unten angegeben habe für die Lokalisierung von Current + Location string. Sie nutzen jedoch eine andere, nicht dokumentierte Funktion, und wie Jason McCreary unten erläutert, funktioniert sie in zukünftigen Versionen möglicherweise nicht zuverlässig.


Update für iOS 6

Ursprünglich verwendete Maps Google Maps, aber jetzt haben Apple und Google separate Karten-Apps. 

1) Wenn Sie mit der Google Maps-App routen möchten, verwenden Sie das URL-Schema comgooglemaps :

NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving",
                    [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

2) Zur Verwendung von Apple Maps können Sie die neue Klasse MKMapItem für iOS 6 verwenden. Siehe die Apple-API-Dokumente hier

Grundsätzlich verwenden Sie so etwas, wenn Sie zum Ziel Koordinaten (latlong) routen:

    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 gleichen Code zu unterstützen, würde ich empfehlen, den folgenden 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 Latest iOS) ist.

133
Nate
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, um mit dem Namen des Maps-Lesezeichens übereinzustimmen.

21
Tchettane
11
bob

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 verwenden, um iOS 6 zu unterstützen:

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];
10

Aufgrund der Sandbox 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 Ort (Lat und Long) in der erstellten URL, um Maps zu öffnen.

5
August

Ich empfehle das Auschecken von CMMapLauncher , einer Minibibliothek, die ich zum Starten von Apple, Google und anderen iOS-Mapping-Apps mit einer bestimmten Mapping-Anforderung erstellt habe. Mit CMMapLauncher würde der Code zum Ermitteln der Anweisungen in Ihrer Frage lauten:

[CMMapLauncher launchMapApp:CMMapAppAppleMaps
          forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin"
                                              coordinate:myLatLong]
                         to:[CMMapPoint mapPointWithName:@"Destination"
                                              coordinate:latlong]];

Wie Sie sehen, enthält es auch die erforderliche Versionsprüfung zwischen iOS 6 und anderen.

4
Joe Hughes

Hey seit iOS6 ist raus!

Apple hat etwas bemerkenswertes getan (aus meiner Sicht). 

Apples Karten werden gestartet und für Geräte mit iOS 6 sollten Sie maps.google.com/?q= nicht verwenden, wenn das iDevice die native Plan-App öffnen soll. Nun wäre es maps.Apple.com/?q=.

Damit Entwickler nicht zu viel Arbeit haben müssen, leitet der benutzerfreundliche maps.Apple.com-Server alle Nicht-Apple-Geräte auf maps.google.com um, sodass die Änderung transparent ist.

Auf diese Weise müssen wir alle Google-Abfragezeichenfolgen in Apple-Zeichenfolgen umwandeln. Dies ist, was ich nicht mag. 

Ich musste diese Funktionalität heute implementieren, also habe ich es getan. Aber ich hatte das Gefühl, ich sollte nicht jede URL, die in der mobilen Website liegt, neu schreiben, um den Karten-Server von Apple als Ziel zu verwenden. Ich dachte, ich würde nur iDevices serverseitig erkennen und Apple-URLs nur für diese Server verwenden. Ich dachte ich würde teilen.

Ich verwende PHP, also habe ich die Bibliothek von OpenSource Mobile Detect verwendet: http://code.google.com/p/php-mobile-detect/

Verwenden Sie einfach die isiPad Pseudo-Methode als booleschen Getter und Sie sind fertig, Sie konvertieren Google nicht in Apple ;-)

$server=$detect->isiPad()?"Apple":"google";
$href="http://maps.{$server}.com/?q=..."

Prost!

3
Armel Larcier

Die eigentliche Lösung finden Sie hier. Z5 - Konzepte für iOS-Entwicklungscode

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

Wenn Sie nicht nach Standortberechtigungen fragen möchten und nicht über lat und lng verfügen, verwenden Sie die folgenden Anweisungen.

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 abzurufen, und öffne dann die Karte mit der aktuellen Position.

Denken Sie daran, CoreLocation.framework und MapKit.framework hinzuzufügen

2
Roland Keesom

Für iOS6 empfehlen die Apple-Dokumente die Verwendung des entsprechenden Maps.Apple.com-URL-Schemas

also verwenden

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 URL-Schema von Apple Maps: Apple URL Scheme Reference

sie können diese iOS-Versionserkennungsmakros verwenden, wenn in anderen Teilen Ihres Codes bedingter Code vorhanden ist. iOS-Versionsmakros

2
joneswah

Sie können dies jetzt in HTML nur über eine URL auf Ihrem mobilen Gerät durchführen. Hier ist ein Beispiel . Die coole Sache ist, wenn Sie dies in einen qr-Code umwandeln, haben Sie eine Möglichkeit, dass jemand Anweisungen von einem beliebigen Ort aus zu Ihnen bekommt, indem Sie ihn einfach auf seinem Telefon scannen.

2
mal

Mein Vorschlag wäre die Verwendung von OpenInGoogleMaps-iOS , da dies eine aktuelle Wahl ist (bis November 2015). Es unterstützt die Installation von Kakao-Pods und Sie sind bereit, mit wenigen Klicks zu gehen.

Installation mit: pod "OpenInGoogleMaps"

Erfordert in der Header-Datei Folgendes: #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];       
1
SudoPlz

Lassen Sie bei der aktuellen Version von Google Maps einfach den Parameter sadr weg:

saddr:… Wenn der Wert leer bleibt, wird der aktuelle Standort des Benutzers verwendet. 

https://developers.google.com/maps/documentation/ios/urlscheme

1

Für die iOS6 Maps App können Sie einfach die 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://, die folgende URL ergibt: maps://saddr=%f,%f&daddr=%@.

Die Verwendung von 'Current Location' scheint nicht zu funktionieren, also blieb ich bei den Koordinaten.

Eine andere gute Sache: Abwärtskompatibel: Auf iOS5 wird die Google Maps-App gestartet.

1
Jacco

Ich habe dies in einem anderen Thread beantwortet. ( Current Location funktioniert nicht mit Apple Maps IOS 6 ). Sie müssen zuerst die Koordinaten des aktuellen Standorts abrufen und anschließend die Karten-URL erstellen. 

0
Xiaochen Du

Wenn Sie keinen Quellspeicherort angeben, wird der aktuelle Speicherort als Quelle verwendet. Versuchen Sie unter Code-

let urlString = " http://maps.Apple.com/maps?daddr=(destinationLocation.latitude),(destinationLocation.longitude)&dirflg=d ". }

UIApplication.shared.openURL (URL (String: urlString)!)

0
Vishwas Singh