2017-02-16 1 views
0

J'ai construit une application pour les motards de Copenhague, mais j'ai quelques problèmes. L'application doit ouvrir les cartes Apple lorsque Google Maps n'est pas disponible sur le téléphone.Swift: App doit ouvrir Apple Maps lorsque Google Maps n'est pas installé

Le code ressemble à ceci

// OUTLETS! 
@IBOutlet weak var googleMapsView: GMSMapView! 

// VARIABLES! 
var locationManager = CLLocationManager() 
var M1: GMSMarker! 
var M2: GMSMarker! 

    //Marker funtioncs 
var markerFunctions: [GMSMarker: (() -> Void)]! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // GET LOCATION WHILE USING APP 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
    locationManager.startMonitoringSignificantLocationChanges() 

    initGoogleMaps() 
} 

// START GOOGLE MAPS! 
func initGoogleMaps() { 

    // MARKERS 
    M1 = GMSMarker() 
    M1.position = CLLocationCoordinate2D(latitude: 55.65208178045790, longitude: 12.527047696518300) 
    M1.title = "Sjælør St." 
    M1.snippet = "Press for navigation" 
    M1.map = self.googleMapsView 

    M2 = GMSMarker() 
    M2.position = CLLocationCoordinate2D(latitude: 55.67530850095370, longitude: 12.583165039072400) 
    M2.title = "Børsen (Slotsholmsgade)" 
    M2.snippet = "Press for navigation" 
    M2.map = self.googleMapsView 

     // Marker functions 
    markerFunctions = [ 
     M1: { UIApplication.shared.open(NSURL(string: "comgooglemaps-x-callback://" + 
      "?daddr=55.65208178045790,12.527047696518300&directionsmode=bicycling&zoom=17")! as URL)}, 

     M2: { UIApplication.shared.open(NSURL(string: "comgooglemaps-x-callback://" + 
      "?daddr=55.67530850095370,12.583165039072400&directionsmode=bicycling&zoom=17")! as URL)}, 

Lorsque vous tapez sur la ligne Info-fenêtre, navigation Google Maps doit apparaître (cela fonctionne). Cependant, si l'application Google Maps n'est pas disponible, comment puis-je réécrire les "Fonctions de marqueurs" afin de les ouvrir à la place?

+0

https://developer.apple.com/library/prerelease/content/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html? Cochez "canOpenURL()" pour savoir lequel est disponible. – Larme

Répondre

4

Pour ce faire, vous devez vérifier si Google Maps est installé. Cela peut être fait assez facilement:

func openMaps(latitude: CLLocationDegrees, longitude: CLLocationDegrees) { 
    let googleMapsInstalled = UIApplication.shared.canOpenURL(URL(string: "comgooglemaps://")!) 
    if googleMapsInstalled { 
     UIApplication.shared.open(URL(string: "comgooglemaps-x-callback://" + 
      "?daddr=\(latitude),\(longitude)&directionsmode=bicycling&zoom=17")!) 
    } else { 
     let coordinates = CLLocationCoordinate2DMake(latitude, longitude) 
     let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil) 
     let mapItem = MKMapItem(placemark: placemark) 
     mapItem.openInMaps(launchOptions: nil) 
    } 
} 

Par défaut, iOS ne permet pas de vérifier si une URL peut être ouverte pour des raisons de confidentialité. Vous devez faire la liste blanche pour comgooglemaps:// dans votre application. Pour ce faire, ajoutez ceci à vos applications Info.plist:

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

Si vous avez fait ceci correctement openMaps(latitude:, logitude:) ouvrira Google Maps si elle est installée, sinon il ouvrira d'Apple Maps. Changez simplement vos fermetures ("Marker Functions") pour appeler la nouvelle méthode. Bien sûr, vous aurez également besoin de import MapKit pour que cela fonctionne.

+0

@nagleer Merci beaucoup pour votre réponse rapide. Je l'ai regardé mais cela ne fonctionne pas parce que j'ai besoin de la fonction pour travailler sur plusieurs InfoWindows. Par exemple, si vous utilisez l'onglet InfoWindow # 1, indiquez les directions vers XXXX, mais si vous utilisez l'onglet InfoWindow # 2, vous devez indiquer YYYY. Savez-vous comment écrire votre code pour fonctionner avec différents onglets InfoWindow? –

+0

Avez-vous essayé de lire et de comprendre ma fonction? Cela fait déjà ça. Il prend des coordonnées et montre n'importe quel endroit que vous lui donnez. En outre, vous n'avez pas dit à propos de 'InfoWindow' dans votre question et n'avez pas mentionné ce que sont ces' InfoWindow'. Sur la base des informations disponibles, je ne peux pas vous aider davantage. Vous devrez clarifier ce que vous essayez de faire. Aussi, veuillez vérifier mon exemple encore car je suspecte qu'il fait déjà ce que vous voulez qu'il fasse. – naglerrr