2017-02-16 7 views
0

私はコペンハーゲンバイカーのアプリを作成しましたが、問題があります。 Googleマップが電話で利用できないときは、アプリがAppleマップを開く必要があります。Swift:GoogleマップがインストールされていないときにアプリケーションがApple Mapsを開く必要があります

コードは、Info-ウィンドウをタップすると、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 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マップを開きます。それ以外の場合は、Appleの地図を開きます。新しいメソッドを呼び出すようにクロージャを変更するだけです(「マーカー関数」)。

もちろん、これが機能するにはimport MapKitも必要です。

+0

@nagleer ご連絡ありがとうございました。私はそれを見てきましたが、複数のInfoWindowで機能するための機能が必要なので機能しません。たとえば、InfoWindow#1をタップしてXXXXの方向をタップすると、InfoWindow#2をタップするとYYYYに向かうことになります。異なるInfoWindowタブのためにコードを書く方法を知っていますか? –

+0

私の機能を読んで理解しようとしましたか?それはすでにそれを行います。それはあなたがそれを与えるどんな場所でも座標を取り、示します。 また、あなたはあなたの質問に 'InfoWindow'について言わなかったので、それらの' InfoWindow'が何であるかは言及しませんでした。利用可能な情報に基づいて、私はあなたをさらに助けることはできません。あなたは何をしようとしているのかを明確にする必要があります。また、私の例をもう一度チェックしてください。私はそれがあなたがしたいことをすでにしていると思っています。 – naglerrr

関連する問題