2016-12-20 1 views
2

J'essaie d'implémenter une fonction qui ouvre l'écran de direction de conduite de l'application Apple Map en transmettant l'adresse réelle.Comment ouvrir la direction de conduite d'Apple Maps en passant l'adresse

L'adresse n'est pas seulement une adresse aléatoire, mais aussi une adresse professionnelle qui est principalement enregistrée et consultable sur les cartes Apple. Donc, en passant l'adresse, elle doit correspondre et afficher correctement la direction de cette entreprise au lieu de pointer vers une annotation inconnue sur la carte. Ce cas se produit lorsque je transmets directement la longitude et la latitude, donc je ne souhaite pas utiliser geocodeAddressString() pour convertir l'adresse en géocoordination.

Comment puis-je l'atteindre?

Répondre

4

Utilisez simplement l'API Apple Maps. Si vous pouvez trouver une entreprise en indiquant son nom dans Apple Maps, vous pouvez le trouver via les API. Dans votre cas, le paramètre correct est daddr, comme ceci:

http://maps.apple.com/?daddr=1+Infinite+Loop,+Cupertino,+CA

Vous pouvez combiner plusieurs paramètres, tels que votre position de départ:

http://maps.apple.com/?saddr=1024+Market+St,+San+Francisco,+CA&daddr=1+Infinite+Loop,+Cupertino,+CA

Vous trouverez la liste des pris en charge paramètres here.

Rappelez-vous d'ouvrir l'URL via UIApplication.shared().open(url: URL, options: [String: AnyObject], completionHandler: ((Bool) -> Void)?) - dans iOS 10 - ou UIApplication.shared.open(url: URL)

+0

Id éviter le protocole et l'utilisation MKMapItems .. ils ont été faites pour cela après tout –

+0

aussi: chaînes de construction dans le code? et urls même .. vous auriez à vous soucier de URLEncoding et tout :) –

+0

@Nicola Giancecchi Merci pour le code. ça marche bien – androisojavaswift

0

Vous pouvez appeler des cartes avec une URL (comme indiqué par Nicola) mais il y a aussi un api bon pour cela: MKMapItem

  1. essentiellement vous créer des éléments de la carte pour POIs/adresses [1 ou plus]
  2. ouvrez Google Maps avec eux [les utiliser launchOptions pour commencer avec les directions]

    func showMap() { 
        //--- 
        //create item 1 
    
        //address 
        let coords = CLLocationCoordinate(coordinateField.doubleValue!,coordinateField.doubleValue!) 
        let addressDict = 
          [CNPostalAddressStreetKey: address.text!, 
          CNPostalAddressCityKey: city.text!, 
          CNPostalAddressStateKey: state.text!, 
          CNPostalAddressPostalCodeKey: zip.text!]   
        //item 
        let place = MKPlacemark(coordinate: coords!, 
              addressDictionary: addressDict) 
        let mapItem = MKMapItem(placemark: place) 
    
        //--- 
        //create item 2 
    
        //address 
        let coords2 = CLLocationCoordinate(coordinateField2.doubleValue!,coordinateField2.doubleValue!) 
        let addressDict2 = 
          [CNPostalAddressStreetKey: address2.text!, 
          CNPostalAddressCityKey: city2.text!, 
          CNPostalAddressStateKey: state2.text!, 
          CNPostalAddressPostalCodeKey: zip2.text!] 
        //item2 
        let place2 = MKPlacemark(coordinate: coords2!, 
              addressDictionary: addressDict2) 
        let mapItem2 = MKMapItem(placemark: place2) 
    
        //----- 
        //launch it  
        let options = [MKLaunchOptionsDirectionsModeKey: 
             MKLaunchOptionsDirectionsModeDriving] 
    
        //for 1 only.  
        mapItem.openInMaps(launchOptions: options) 
        //for 1 or N items 
        var mapItems = [mapItem, mapItem2] //src to destination 
        MKMapItem.openMaps(withItems:mapItems, launchOptions: options) 
    } 
    
+1

Il y a quelques avantages avec cette approche. Mais il y a aussi des inconvénients: 1) @androisojavaswift veut trouver l'entreprise par son nom, pas seulement par son adresse ou sa ville 2) Les clés CNPostalAddress sont disponibles seulement depuis iOS 9.0; le schéma URI est utilisé depuis iOS 6 3) Vous devez importer le framework Contacts uniquement pour ce morceau de code –

+1

1) :) trouver par nom est ce que le CLGeocoder fait pour vous - il construit des marques de lieux. vous n'avez pas besoin d'une adresse pour cela - ou des coordonnées même :) –

+1

2. les clés sont identiques aux anciennes clés de carnet d'adresses donc cela fonctionne sur les versions inférieures à si vous avez besoin de construire avec l'ancienne base sdk .. 3) pas si vous voulez des endroits seulement de toute façon :) –