web-dev-qa-db-fra.com

Comment ouvrir Google Maps pour afficher l'itinéraire à l'aide de Swift

Je lisais sur Internet mais je ne trouvais pas de réponse légitime. Je dois ouvrir Google Maps lorsque l'utilisateur clique sur un bouton pour afficher les directions. Le début et la destination doivent être remplis automatiquement.

Comment puis-je atteindre cet objectif dans Swift?

Si quelqu'un a une solution, veuillez me fournir un exemple de code. Le début sera toujours l'emplacement actuel de l'utilisateur.

28
sumesh

OK j'ai trouvé la réponse moi-même.

Si vous souhaitez afficher les directions depuis l'emplacement actuel de l'utilisateur, laissez le champ saddr vide et le champ daddr vous permet de saisir les coordonnées de destination.

Voici comment je l'ai fait

if (UIApplication.sharedApplication().canOpenURL(NSURL(string:"comgooglemaps://")!)) {
            UIApplication.sharedApplication().openURL(NSURL(string:
                "comgooglemaps://?saddr=&daddr=\(place.latitude),\(place.longitude)&directionsmode=driving")!)

        } else {
            NSLog("Can't use comgooglemaps://");
        }
    }

pour toute autre question, vous pouvez vous référer à ce lien Schéma d'URL de Google Map

44
sumesh

La réponse est déjà là, mais dans les anciennes versions de Swift 

Dans Swift 3

//Working in Swift new versions.
if (UIApplication.shared.canOpenURL(URL(string:"comgooglemaps://")!)) 
{
    UIApplication.shared.openURL(NSURL(string:
    "comgooglemaps://?saddr=&daddr=\(Float(latitude!)),\(Float(longitude!))&directionsmode=driving")! as URL)   
} else 
{
    NSLog("Can't use com.google.maps://");
}
23
user3745635

Pour ceux pour qui la solution de la réponse acceptée ne fonctionnait pas, n'oubliez pas d'ajouter comgooglemaps à LSApplicationQueriesSchemes dans le fichier info.plist.

 info.plist

13
@IBAction func NavigationTrackerPressedPressed(_ sender: UIButton){

    if let UrlNavigation = URL.init(string: "comgooglemaps://") {
        if UIApplication.shared.canOpenURL(UrlNavigation){
            if self.destinationLocation?.longitude != nil && self.destinationLocation?.latitude != nil {

                let lat =      (self.destinationLocation?.latitude)!
                let longi = (self.destinationLocation?.longitude)!

                if let urlDestination = URL.init(string: "comgooglemaps://?saddr=&daddr=\(lat),\(longi)&directionsmode=driving") {
                    UIApplication.shared.openURL(urlDestination)
                }
            }
        }
        else {
            NSLog("Can't use comgooglemaps://");
            self.openTrackerInBrowser()

        }
    }
    else
    {
        NSLog("Can't use comgooglemaps://");
       self.openTrackerInBrowser()
    }



}
func openTrackerInBrowser(){
    if self.destinationLocation?.longitude != nil && self.destinationLocation?.latitude != nil {

        let lat = (self.destinationLocation?.latitude)!
        let longi = (self.destinationLocation?.longitude)!

        if let urlDestination = URL.init(string: "https://www.google.co.in/maps/dir/?saddr=&daddr=\(lat),\(longi)&directionsmode=driving") {
            UIApplication.shared.openURL(urlDestination)
        }
    }
}
8
Anoop
  let lat = self.upcomingListArr[indexPath.item].latitude!
            let long = self.upcomingListArr[indexPath.item].longitude!
            if (UIApplication.shared.canOpenURL(NSURL(string:"comgooglemaps://")! as URL)) {
                UIApplication.shared.openURL(NSURL(string:
                    "comgooglemaps://?saddr=&daddr=\(String(describing: lat)),\(String(describing: long))")! as URL)

            } else {
                UIApplication.shared.openURL(NSURL(string:
                    "https://www.google.co.in/maps/dir/?saddr=&daddr=\(String(describing: lat)),\(String(describing: long))")! as URL)
            }
6
Sachin Kishore

Je souhaite que l'utilisateur puisse ouvrir Google Maps via un navigateur (ne fonctionne que si l'utilisateur n'a pas l'application Google Maps) Google fournit une documentation à ce sujet ici . Depuis iOS 9, vous devez définir un schéma. Ceci vous trouverez ici .

Pour moi la solution google ne fonctionne pas. Peut-être êtes-vous plus intelligent et trouvez-vous une solution (poste s'il vous plaît!).

Quoi qu'il en soit, j'ai fait un simple appel Web:

let lat = 37.7
let lon = -122.4
if (UIApplication.sharedApplication().canOpenURL(NSURL(string:"https://maps.google.com")!)) 
{
     UIApplication.sharedApplication().openURL(NSURL(string:
     "https://maps.google.com/?q=@\(lat),\(lon)")!)
}

Cela pourrait être utilisé comme une sorte de solution de rechange à partir de la réponse de sumeshs. 

6
kuzdu

1) Méthode: vous pouvez passer la seule adresse de destination. L’adresse actuelle sera automatiquement récupérée par l’application Google Map.

let strLat : String = "23.035007"
let strLong : String = "72.529324"

override func viewDidLoad() {
        super.viewDidLoad()
        if (UIApplication.shared.canOpenURL(URL(string:"comgooglemaps://")!)) {
            UIApplication.shared.openURL(URL(string:"comgooglemaps://?saddr=&daddr=\(strLat),\(strLong)&directionsmode=driving")!)
        }
        else {
            print("Can't use comgooglemaps://");
        }
    }

2) Vous pouvez indiquer l'adresse de départ et l'adresse de destination

let strLat : String = "23.035007"
let strLong : String = "72.529324"

let strLat1 : String = "23.033331"
let strLong2 : String = "72.524510"

override func viewDidLoad() {
        super.viewDidLoad()
        if (UIApplication.shared.canOpenURL(URL(string:"comgooglemaps://")!)) {
            UIApplication.shared.openURL(URL(string:"comgooglemaps://?saddr=\(strLat),\(strLong)&daddr=\(strLat1),\(strLong2)&directionsmode=driving&zoom=14&views=traffic")!)
        }
        else {
            print("Can't use comgooglemaps://");
        }
    }
5
Hardik Thakkar

Voici la mise à jour de Swift 3

Tout d’abord, vous avez besoin de deux éléments pour LSApplicationQueriesSchemes dans info.plist.

 enter image description here

Ensuite, vous pouvez utiliser cette fonction pour charger une adresse sur Google Maps.

 let primaryContactFullAddress = "No 28/A, Kadalana, Moratuwa, Sri Lanka"

 @IBAction func showLocaionOnMaps(_ sender: Any) {
        let testURL: NSURL = NSURL(string: "comgooglemaps-x-callback://")!
        if UIApplication.shared.canOpenURL(testURL as URL) {
            if let address = primaryContactFullAddress.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) {
                let directionsRequest: String = "comgooglemaps-x-callback://" + "?daddr=\(address)" + "&x-success=sourceapp://?resume=true&x-source=AirApp"
                let directionsURL: NSURL = NSURL(string: directionsRequest)!
                let application:UIApplication = UIApplication.shared
                if (application.canOpenURL(directionsURL as URL)) {
                    application.open(directionsURL as URL, options: [:], completionHandler: nil)
                }
            }
        } else {
            NSLog("Can't use comgooglemaps-x-callback:// on this device.")
        }
}
3
Chathuranga Silva

Code de travail Swift 4

if let url = URL(string: "comgooglemaps://?saddr=&daddr=\(location.coordinate.latitude),\(location.coordinate.longitude)&directionsmode=driving") {
        UIApplication.shared.open(url, options: [:])
    }

ce code fonctionne pour moi. Et je n'ai pas inséré 

* LSApplicationQueriesSchemes

Si vous utilisez émulateur ne peut pas voir les résultats. N'oubliez pas de travailler votre projet sur le téléphone.

2
Haktan Enes Biçer

La réponse existe déjà, mais dans les anciennes versions de Swift, et ce code peut ouvrir Google Map dans le navigateur si votre iPhone n’a pas installé Google Map Application.

Dans Swift 4

import MapKit

func openGoogleDirectionMap(_ destinationLat: String, _ destinationLng: String) {

    let LocationManager = CLLocationManager()

    if let myLat = LocationManager.location?.coordinate.latitude, let myLng = LocationManager.location?.coordinate.longitude {

        if let tempURL = URL(string: "comgooglemaps://?saddr=&daddr=\(destinationLat),\(destinationLng)&directionsmode=driving") {

            UIApplication.shared.open(tempURL, options: [:], completionHandler: { (isSuccess) in

                if !isSuccess {

                    if UIApplication.shared.canOpenURL(URL(string: "https://www.google.co.th/maps/dir///")!) {

                        UIApplication.shared.open(URL(string: "https://www.google.co.th/maps/dir/\(myLat),\(myLng)/\(destinationLat),\(destinationLng)/")!, options: [:], completionHandler: nil)

                    } else {

                         print("Can't open URL.")

                    }

                }

            })

        } else {

            print("Can't open GoogleMap Application.")

        }

    } else {

        print("Prease allow permission.")

    }

}
0
Saharat Sittipanya
func openTrackerInBrowser(lat: String, long: String, dlat: String, dlong: String){

    if let urlDestination = URL.init(string: "https://www.google.co.in/maps/dir/?saddr=\(lat),\(long)&daddr=\(dlat),\(dlong)&directionsmode=driving") {
        UIApplication.shared.open(urlDestination, options: [:], completionHandler: nil)

    }
}
0
samuel samer

Dans Swift 4:  

 if (UIApplication.shared.canOpenURL(NSURL(string:"comgooglemaps://")! as URL)) {
       UIApplication.shared.open((NSURL(string:
            "comgooglemaps://?saddr=&daddr=\(trashDictionarySorted[indexPath.section][0])&directionsmode=driving")! as URL), options: [:], completionHandler: nil)

        } else {
            NSLog("Can't use comgooglemaps://");
        }
    }
0
Erik Peruzzi

// J'espère que cela fonctionnera parfaitement.

let googleURL = NSURL(string: "comgooglemaps://?q=")

if(UIApplication.shared.canOpenURL(googleURL! as URL)) {
     UIApplication.shared.open(URL(string:"comgooglemaps://?saddr=\(DEVICE_LAT),\(DEVICE_LONG)&daddr=\(addressLat),\(addressLng)&directionsmode=driving")!, options: [:], completionHandler: nil)
}

// Définit également l'autorisation de info.plist en fonction de l'image jointe.

entrez la description de l'image ici

0
syed aurangzaib

Tout d’abord, merci pour vos réponses plus loin. Mais lorsque je travaillais, je ne trouvais pas de solution satisfaisante. Et comme résultat, j'ai créé du code de travail avec deux cas: quand l'utilisateur a l'application Google Maps et si ce n'est pas le cas ... Voici ma version du code Xcode 10, Swift 4.2. J'espère que ça va aider.

Étape 1: Recherchez votre info.plist et ouvrez en tant que -> Code source

 First you should find your info.plist and open it as Source Code.

Étape 2: Ajoutez ces lignes entre <dict> et </dict>

 enter image description here

Étape 3: Dans votre action, ajoutez ce code. N'oubliez pas de définir votre latitude et votre longitude.

        let latitude = 44.987781
        let longitude = 88.987781
        let appDomen: String = "comgooglemaps://"
        let browserDomen: String = "https://www.google.co.in/maps/dir/"
        let directionBody: String = "?saddr=&daddr=\(latitude),\(longitude)&directionsmode=driving"

        // Make route with google maps application
        if let appUrl = URL(string: appDomen), UIApplication.shared.canOpenURL(appUrl) {
            guard let appFullPathUrl = URL(string: appDomen + directionBody) else { return }
            UIApplication.shared.openURL(appFullPathUrl)

        // If user don't have an application make route in browser
        } else if let browserUrl = URL(string: browserDomen), UIApplication.shared.canOpenURL(browserUrl) {
            guard let browserFullPathUrl = URL(string: browserDomen + directionBody) else { return }
            UIApplication.shared.openURL(browserFullPathUrl)
        }
0
Alex Kolovatov