2017-02-16 7 views
0

코펜하겐 자전거 타는 사람을위한 앱을 만들었지 만 문제가 있습니다. Google지도를 휴대 전화에서 사용할 수없는 경우 앱에서 Apple지도를 열어야합니다.Swift : Google지도가 설치되지 않은 상태에서 앱을 열어야합니다.

코드는 정보 창을 탭하면 Google지도에 대한 탐색 (작동) 표시 할 필요가이

// 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지도 앱을 사용할 수없는 경우 '마커 기능'을 다시 작성하여 대신 Apple지도를 열 수 있습니까?

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

은, 기본적으로 아이폰 OS는 URL은 개인 정보 보호를 위해 열 수 있는지 여부를 확인하는 것을 허용하지 않습니다. 앱에서 comgooglemaps://에 대한 화이트리스트 검사를해야합니다. 이를 위해이 앱을 Info.plist이 추가 :

당신이 설치된 경우이 올바르게 openMaps(latitude:, logitude:) Google지도를 엽니 다했을 경우
<key>LSApplicationQueriesSchemes</key> 
<array> 
    <string>comgooglemaps</string> 
</array> 

, 그렇지 않으면 애플지도가 열립니다. 클로저 ("마커 함수")를 변경하여 새 메서드를 호출하면됩니다.

물론이 작업을 수행하려면 import MapKit해야합니다.

+0

@nagleer 빠른 응답을 보내 주셔서 감사합니다. 살펴 보았지만 여러 InfoWindow에서 작동하는 기능이 필요하기 때문에 작동하지 않습니다. 예를 들어, InfoWindow # 1을 탭하면 XXXX 방향으로 이동하지만 InfoWindow # 2를 탭하면 YYYY 방향으로 이동합니다. 다른 InfoWindow 탭에 맞게 코드를 작성하는 방법을 알고 계십니까? –

+0

내 기능을 읽고 이해하려고 시도 했습니까? 그것은 이미 그것을합니다. 그것은 좌표를 취하고 당신이 그것을주는 어떤 위치를 보여줍니다. 또한 InfoWindow에 대해 언급하지 않았으며 InfoWindow가 무엇인지 언급하지 않았습니다. 이용 가능한 정보를 바탕으로, 나는 더 이상 당신을 도울 수 없습니다. 당신이하려는 일을 명확히해야합니다. 또한, 이미 내 생각을 다시 한번 확인해보십시오. – naglerrr