Swift:未安装 Google Maps 时,应用程序需要打开 Apple Maps

Posted

技术标签:

【中文标题】Swift:未安装 Google Maps 时,应用程序需要打开 Apple Maps【英文标题】:Swift: App needs to open Apple Maps when Google Maps not installed 【发布时间】:2017-02-16 16:10:51 【问题描述】:

我为哥本哈根骑自行车的人构建了一个应用程序,但遇到了一些问题。 当手机上没有谷歌地图时,应用需要打开苹果地图。

代码如下所示

// 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 应用程序不可用,我该如何重新编写“标记功能”以便它可以在 Apple Maps 中打开?

【问题讨论】:

developer.apple.com/library/prerelease/content/featuredarticles/… ?检查“canOpenURL()”以了解哪个可用。 【参考方案1】:

为此,您需要检查是否安装了 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 才能使用。

【讨论】:

@nagleer 非常感谢您的快速回复。我看过它,但它不起作用,因为我需要该功能才能为多个 InfoWindows 工作。例如,如果您选择 InfoWindow#1,则指向 XXXX,但如果您选择 InfoWindow#2,则指向 YYYY。您知道如何编写代码以适用于不同的 InfoWindow 选项卡吗? 您是否尝试阅读并理解我的功能?它已经这样做了。它需要坐标并显示您给它的任何位置。此外,您在问题中没有提及InfoWindow,也没有提及InfoWindows 是什么。根据现有信息,我无法再为您提供任何帮助。您将需要澄清您正在尝试做什么。另外,请再次检查我的示例,因为我怀疑它已经完成了您希望它执行的操作。

以上是关于Swift:未安装 Google Maps 时,应用程序需要打开 Apple Maps的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps v2 - 应用程序未安装在 2.3 设备上

拖动时标记未添加 - Google Maps iOS 应用

iOS 单元测试在 CocoaPods Google Maps SDK 上失败

在“src”上使用 javascript 变量时未加载 Google Maps iFrame

“未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'iterator'。”当我在颤振中使用 google_maps_polyline 插件时抛出

使用 Google Maps API v2 时,签名的 APK 崩溃,未签名的 APK