Wie kann ich die Google Maps iPhone-Anwendung in meiner eigenen nativen Anwendung starten?

70

In der Apple Developer Documentation (Link ist jetzt tot) wird erläutert, dass die Google Maps-Anwendung, die standardmäßig mit dem iPhone geliefert wird, gestartet wird, wenn Sie einen Link auf einer Webseite platzieren und dann darauf klicken, während Sie Mobile Safari auf dem iPhone verwenden.

Wie kann ich dieselbe Google Maps-Anwendung mit einer bestimmten Adresse in meiner nativen iPhone-Anwendung (dh keine Webseite über Mobile Safari) auf dieselbe Weise starten wie durch Tippen auf eine Adresse in Kontakte die Karte?

HINWEIS: DIESES FUNKTIONIERT NUR AM GERÄT. NICHT IM SIMULATOR.

Davidmytton
quelle
Es funktioniert im Simulator und wird stattdessen nur in der mobilen Safari geöffnet.
PMKO

Antworten:

65

Verwenden Sie für iOS 5.1.1 und niedriger die openURLMethode von UIApplication. Es wird die normale magische URL-Neuinterpretation des iPhone durchführen. damit

[someUIApplication openURL:[NSURL URLWithString:@"http://maps.google.com/maps?q=London"]]

sollte die Google Maps App aufrufen.

Ab iOS 6 rufen Sie Apples eigene Maps-App auf. Konfigurieren Sie dazu ein MKMapItemObjekt mit dem Ort, den Sie anzeigen möchten, und senden Sie ihm die openInMapsWithLaunchOptionsNachricht. Versuchen Sie Folgendes, um am aktuellen Standort zu beginnen:

[[MKMapItem mapItemForCurrentLocation] openInMapsWithLaunchOptions:nil];

Sie müssen dafür mit MapKit verknüpft sein (und ich glaube, es wird zur Eingabe des Standorts aufgefordert).

Adam Wright
quelle
2
Wiki mit Beschreibung der Parameter: mapki.com/wiki/Google_Map_Parameters Apple iPhone OS-Programmierhandbuch Anhang A enthält eine Liste der unterstützten Parameter auf dem iPhone.
Carl Coryell-Martin
Dies ist undicht - anstelle von [[NSURL alloc] initWithString:]sollten Sie verwenden, [NSURL URLWithString:]da es ein automatisch freigegebenes Objekt bereitstellt.
Tim
@ Tim, behoben - danke. Fairerweise war es mir egal, wann diese Antwort zum ersten Mal veröffentlicht wurde, da die App beendet wurde, sobald der Anruf abgeschlossen war.
Adam Wright
Es ist immer wichtig! Außerdem, anstatt someUIApplicationSie könnten einfach sagen [UIApplication sharedApplication](da ich keine andere Situation kenne, in der Sie UIApplicationaußer einer machen würden)
Tim
2
Gemäß der Dokumentation von Apple ( developer.apple.com/library/ios/#featuredarticles/… ) sollten Sie maps.apple.com wie folgt verwenden : maps.apple.com/?q=London Dies würde die Notwendigkeit vermeiden, andere einzugeben Code abhängig von der Betriebssystemversion, da er in iOS 5 zu Google Maps umgeleitet wird.
Matt James
32

Genau. Der Code, den Sie benötigen, um dies zu erreichen, ist ungefähr so:

UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString: @"http://maps.google.com/maps?q=London"]];

da gemäß der Dokumentation UIApplication nur im Anwendungsdelegierten verfügbar ist, es sei denn, Sie rufen sharedApplication auf.

Davidmytton
quelle
7
Sie lecken die NSURL. Ich würde empfehlen: [app openURL: [NSURL URLWithString: @ " maps.google.com/maps?g=London"]], damit es automatisch veröffentlicht wird.
Matthew McGoogan
29

Probieren Sie diesen Code aus, um Google Maps an bestimmten Koordinaten zu öffnen:

NSString *latlong = @"-56.568545,1.256281";
NSString *url = [NSString stringWithFormat: @"http://maps.google.com/maps?ll=%@",
[latlong stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

Sie können die latlong-Zeichenfolge durch die aktuelle Position von CoreLocation ersetzen.

Sie können die Zoomstufe auch mit dem Flag (”z“) festlegen. Die Werte sind 1-19. Hier ist ein Beispiel:

[[UIApplication sharedApplication] openURL: [NSURL URLWithString: @ " http://maps.google.com/maps?z=8 "]];

Jane Sales
quelle
2
Irgendwie funktioniert es bei "ll" nicht richtig, ich muss stattdessen "q" verwenden. Beispielsweise verweisen maps.google.com/maps?q=48.8588054,2.3030451 und maps.google.com/maps?ll=48.8588054,2.3030451 nicht auf dieselbe Adresse.
Enzo Tran
18

Es gibt jetzt auch die App Store Google Maps-App, die unter https://developers.google.com/maps/documentation/ios/urlscheme dokumentiert ist

Sie sollten also zuerst überprüfen, ob es installiert ist:

[[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString:@"comgooglemaps://"]];

Und dann können Sie bedingt ersetzen http://maps.google.com/maps?q=mit comgooglemaps://?q=.

Michael Baltaks
quelle
13

Hier ist die Apple URL Scheme-Referenz für Kartenlinks: https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html

Die Regeln zum Erstellen eines gültigen Kartenlinks lauten wie folgt:

  • Die Domain muss google.com sein und die Subdomain muss Maps oder Ditu sein.
  • Der Pfad muss /, / maps, / local oder / m sein, wenn die Abfrage site als Schlüssel und local als Wert enthält.
  • Der Pfad kann nicht / maps / * sein.
  • Alle Parameter müssen unterstützt werden. In Tabelle 1 finden Sie eine Liste der unterstützten Parameter **.
  • Ein Parameter kann nicht q = * sein, wenn der Wert eine URL ist (daher wird KML nicht erfasst).
  • Die Parameter dürfen nicht view = text oder dirflg = r enthalten.

** Die Liste der unterstützten Parameter finden Sie unter dem obigen Link.

Harry Love
quelle
9

Wenn Sie ios 10 verwenden, vergessen Sie bitte nicht, Abfrageschemata in Info.plist hinzuzufügen

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>comgooglemaps</string>
</array>

Wenn Sie Ziel-c verwenden

if ([[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString:@"comgooglemaps:"]]) {
    NSString *urlString = [NSString stringWithFormat:@"comgooglemaps://?ll=%@,%@",destinationLatitude,destinationLongitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
    } else { 
    NSString *string = [NSString stringWithFormat:@"http://maps.google.com/maps?ll=%@,%@",destinationLatitude,destinationLongitude];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:string]];
    }

Wenn Sie Swift 2.2 verwenden

if UIApplication.sharedApplication().canOpenURL(NSURL(string: "comgooglemaps:")!) {
    var urlString = "comgooglemaps://?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.sharedApplication().openURL(NSURL(string: urlString)!)
}
else {
    var string = "http://maps.google.com/maps?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.sharedApplication().openURL(NSURL(string: string)!)
}

Wenn Sie Swift 3.0 verwenden

if UIApplication.shared.canOpenURL(URL(string: "comgooglemaps:")!) {
    var urlString = "comgooglemaps://?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.shared.openURL(URL(string: urlString)!)
}
else {
    var string = "http://maps.google.com/maps?ll=\(destinationLatitude),\(destinationLongitude)"
    UIApplication.shared.openURL(URL(string: string)!)
}
Ruchin Somal
quelle
2

Testen Sie für die Telefonfrage auf dem Simulator? Dies funktioniert nur auf dem Gerät selbst.

Außerdem gibt openURL einen Bool zurück, mit dem Sie überprüfen können, ob das Gerät, auf dem Sie ausgeführt werden, die Funktionalität unterstützt. Zum Beispiel können Sie auf einem iPod Touch nicht telefonieren :-)

Jane Sales
quelle
2

Rufen Sie einfach diese Methode auf und fügen Sie das Google Maps-URL-Schema wie in dieser Antwort zu Ihrer .plist-Datei hinzu .

Swift-4: -

func openMapApp(latitude:String, longitude:String, address:String) {

    var myAddress:String = address

    //For Apple Maps
    let testURL2 = URL.init(string: "http://maps.apple.com/")

    //For Google Maps
    let testURL = URL.init(string: "comgooglemaps-x-callback://")

    //For Google Maps
    if UIApplication.shared.canOpenURL(testURL!) {
        var direction:String = ""
        myAddress = myAddress.replacingOccurrences(of: " ", with: "+")

        direction = String(format: "comgooglemaps-x-callback://?daddr=%@,%@&x-success=sourceapp://?resume=true&x-source=AirApp", latitude, longitude)

        let directionsURL = URL.init(string: direction)
        if #available(iOS 10, *) {
            UIApplication.shared.open(directionsURL!)
        } else {
            UIApplication.shared.openURL(directionsURL!)
        }
    }
    //For Apple Maps
    else if UIApplication.shared.canOpenURL(testURL2!) {
        var direction:String = ""
        myAddress = myAddress.replacingOccurrences(of: " ", with: "+")

        var CurrentLocationLatitude:String = ""
        var CurrentLocationLongitude:String = ""

        if let latitude = USERDEFAULT.value(forKey: "CurrentLocationLatitude") as? Double {
            CurrentLocationLatitude = "\(latitude)"
            //print(myLatitude)
        }

        if let longitude = USERDEFAULT.value(forKey: "CurrentLocationLongitude") as? Double {
            CurrentLocationLongitude = "\(longitude)"
            //print(myLongitude)
        }

        direction = String(format: "http://maps.apple.com/?saddr=%@,%@&daddr=%@,%@", CurrentLocationLatitude, CurrentLocationLongitude, latitude, longitude)

        let directionsURL = URL.init(string: direction)
        if #available(iOS 10, *) {
            UIApplication.shared.open(directionsURL!)
        } else {
            UIApplication.shared.openURL(directionsURL!)
        }

    }
    //For SAFARI Browser
    else {
        var direction:String = ""
        direction = String(format: "http://maps.google.com/maps?q=%@,%@", latitude, longitude)
        direction = direction.replacingOccurrences(of: " ", with: "+")

        let directionsURL = URL.init(string: direction)
        if #available(iOS 10, *) {
            UIApplication.shared.open(directionsURL!)
        } else {
            UIApplication.shared.openURL(directionsURL!)
        }
    }
}

Hoffe, das ist was du suchst. Alle Bedenken melden sich bei mir. :) :)

Treffen Sie Doshi
quelle
Es hat nicht funktioniert. Ich erzähle das Szenario. Beim Klicken auf die Schaltfläche übergebe ich die URL mit saddr und daddr und rufe UIApplication.shared.canOpenURL (unwrappedURL) auf . Jede Hilfe
iSrinivasan27
In Simulator haben Sie keine Google Maps-Anwendung. Ihre else-Bedingung wird also ausgeführt. Die URL wird im SAFARI-Browser geöffnet. Bitte deinstallieren Sie die Google Maps-Anwendung auf dem Gerät und überprüfen Sie sie. Es wird genauso funktionieren wie der Simulator.
Treffen Sie Doshi
Danke, man fragt das Thema ab. Wie kann ich überprüfen, ob Gmap auf dem iPhone installiert ist oder nicht
iSrinivasan27
Sieht so aus, als hätten Sie das iPhone noch nicht benutzt. Öffnen Sie einfach den Appstore und suchen Sie in Google Maps. Und überprüfen Sie, ob es eine Installationsoption oder eine offene Anwendungsoption gibt. Eine weitere Option ist die Suche in der Google Maps-App direkt in Ihrem Open, indem Sie die Geste auf dem iPhone-Startbildschirm drücken.
Treffen Sie Doshi
Ja, ich bin aber kein besserer Android User. Ich glaube, ich habe die Frage nicht richtig gestellt. Wie kann ich überprüfen, ob die Google Map App per Code auf dem iPhone installiert ist? um es zu öffnen oder zur Verwendung im App Store umzuleiten
iSrinivasan27
1

"g" wechselt zu "q"

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://maps.google.com/maps?q=London"]]
Pavel Kurta
quelle
1

Wenn Sie immer noch Probleme haben, zeigt dieses Video, wie Sie "Meine Karten" von Google auf dem iPhone anzeigen lassen können. Sie können dann den Link nehmen und an jeden senden, und es funktioniert.

http://www.youtube.com/watch?v=Xo5tPjsFBX4

Tex
quelle
1

Verwenden Sie diese API, um zur Google-Karte zu wechseln, und senden Sie den Längen- und Breitengrad des Ziels

NSString* addr = nil;
     addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", destinationLat,destinationLong];

NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
DURGESH
quelle
0

Wenn Sie mehr Flexibilität benötigen, als das Google-URL-Format Ihnen bietet, oder wenn Sie eine Karte in Ihre Anwendung einbetten möchten, anstatt die Karten-App zu starten, finden Sie ein Beispiel unter https://sourceforge.net/projects/quickconnect .

RAVI
quelle
0

Wenn Sie mehr Flexibilität benötigen, als das Google-URL-Format Ihnen bietet, oder wenn Sie eine Karte in Ihre Anwendung einbetten möchten, anstatt die Karten-App zu starten, finden Sie hier ein Beispiel .

Sie erhalten sogar den Quellcode für die gesamte Einbettung.

Lee
quelle
0

iPhone4 iOS 6.0.1 (10A523)

Für Safari und Chrome. Beide neueste Version bis jetzt (2013-Jun-10).

Das folgende URL-Schema funktioniert ebenfalls. Aber wenn Chrome nur innerhalb der Seite funktioniert, funktioniert es nicht über die Adressleiste.

Karten: q = GivenTitle @ Breite, Länge

3shmaoy
quelle
0
**Getting Directions between 2 locations**

        NSString *googleMapUrlString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%@,%@&daddr=%@,%@", @"30.7046", @"76.7179", @"30.4414", @"76.1617"];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapUrlString]];
Mannam Brahmam
quelle
0

Arbeitscode wie bei Swift 4:

Schritt 1 - Fügen Sie Folgendes zur info.plist hinzu

<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
</array>

Schritt 2 - Verwenden Sie den folgenden Code, um Google Maps anzuzeigen

    let destinationLatitude = "40.7128"
    let destinationLongitude = "74.0060"

    if UIApplication.shared.canOpenURL(URL(string: "comgooglemaps:")!) {
        if let url = URL(string: "comgooglemaps://?ll=\(destinationLatitude),\(destinationLongitude)"), !url.absoluteString.isEmpty {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }else{
        if let url = URL(string: "http://maps.google.com/maps?ll=\(destinationLatitude),\(destinationLongitude)"), !url.absoluteString.isEmpty {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
Abhirajsinh Thakore
quelle