2017-02-16 12 views
0

Я создал приложение для байкеров в Копенгагене, но у вас есть проблемы. Приложение должно открывать карты Apple, когда Карты Google недоступны на телефоне.Swift: приложение должно открыть Карты Apple, когда Google Maps не установлен

код выглядит следующим образом

// 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)}, 

При сливе окна информации, навигации для Google Maps должен появиться (он работает). Однако, если приложение Google Maps недоступно, как мне переписать «Функции маркера», чтобы он вместо этого открывал Apple Maps?

+0

https://developer.apple.com/library/prerelease/content/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html? Проверьте «canOpenURL()», чтобы узнать, какой из них доступен. – Larme

ответ

4

Для этого вам необходимо будет проверить, установлены ли Карты Google. Это можно сделать довольно легко:

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) 
    } 
} 

По-умолчанию IOS не позволяет проверить, может ли быть открыт URL по причинам конфиденциальности. Вам нужно выполнить белый список для comgooglemaps:// в вашем приложении. Для этого добавьте в свои приложения Info.plist:

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

Если вы сделали это правильно openMaps(latitude:, logitude:) откроет Google Maps, если он установлен, в противном случае она будет открыта компании Apple Maps. Просто измените свои блокировки («Функции маркера»), чтобы вызвать новый метод.

Конечно, для этого вам также понадобится import MapKit.

+0

@nagleer Большое спасибо за ваш быстрый ответ. Я посмотрел на него, но он не работает, потому что мне нужна функция для работы с несколькими InfoWindows. Например, если вы нажмете InfoWindow # 1, то направления на XXXX, но если вы введете вкладку InfoWindow # 2, то направьте ее на YYYY. Вы знаете, как написать свой код для работы с различными вкладками InfoWindow? –

+0

Вы пытались прочитать и понять мою функцию? Это уже сделано. Он принимает координаты и показывает любое местоположение, которое вы ему даете. Кроме того, вы не рассказали о 'InfoWindow' в своем вопросе и не упомянули, что такое' 'InfoWindow''ы. Основываясь на имеющейся информации, я не могу вам помочь. Вам нужно будет уточнить, что вы пытаетесь сделать. Кроме того, повторите мой пример, поскольку я подозреваю, что он уже делает то, что вы хотите. – naglerrr