如何通过传递地址打开 Apple Maps 行车路线

How to open Apple Maps driving direction by passing address

我正在尝试实现一个通过传递实际地址来打开 Apple Map 应用程序的行车路线屏幕的功能。

地址不仅仅是随机地址,而是大部分在 Apple 地图上注册和搜索的公司地址。因此,通过传递地址,它应该匹配并正确显示该企业的方向,而不是指向地图上的未知注释。当我直接传递经度和纬度时会发生这种情况,所以我不想使用 geocodeAddressString() 将地址转换为地理坐标。

如何实现?

只需使用 Apple 地图 API。如果您可以通过在 Apple 地图中输入商家名称找到商家,则可以通过 API 找到它。在你的例子中,正确的参数是 daddr,像这样:

http://maps.apple.com/?daddr=1+Infinite+Loop,+Cupertino,+CA

您可以组合多个参数,例如您的起始位置:

http://maps.apple.com/?saddr=1024+Market+St,+San+Francisco,+CA&daddr=1+Infinite+Loop,+Cupertino,+CA

您可以找到支持的参数列表 here

记得打开 URL 通过 UIApplication.shared().open(url: URL, options: [String: AnyObject], completionHandler: ((Bool) -> Void)?) - 在 iOS 10 - 或 UIApplication.shared.open(url: URL)

您可以使用 url 调用地图(如 Nicola 所详述),但也有一个合适的 api :MKMapItem

  1. 基本上,您为兴趣点/地址创建地图项目 [1 个或更多]
  2. 与他们一起打开地图[使用启动选项开始导航]

    func showMap() {
        //---
        //create item 1
    
        //address
        let coords = CLLocationCoordinate(coordinateField.doubleValue!,coordinateField.doubleValue!)
        let addressDict =
               [CNPostalAddressStreetKey: address.text!,
                CNPostalAddressCityKey: city.text!,
                CNPostalAddressStateKey: state.text!,
                CNPostalAddressPostalCodeKey: zip.text!]        
        //item
        let place = MKPlacemark(coordinate: coords!,
                                 addressDictionary: addressDict)
        let mapItem = MKMapItem(placemark: place)
    
        //---
        //create item 2
    
        //address
        let coords2 = CLLocationCoordinate(coordinateField2.doubleValue!,coordinateField2.doubleValue!)
        let addressDict2 =
               [CNPostalAddressStreetKey: address2.text!,
                CNPostalAddressCityKey: city2.text!,
                CNPostalAddressStateKey: state2.text!,
                CNPostalAddressPostalCodeKey: zip2.text!]
        //item2
        let place2 = MKPlacemark(coordinate: coords2!,
                                 addressDictionary: addressDict2)
        let mapItem2 = MKMapItem(placemark: place2)
    
        //-----
        //launch it     
        let options = [MKLaunchOptionsDirectionsModeKey:
                            MKLaunchOptionsDirectionsModeDriving]
    
        //for 1 only.       
        mapItem.openInMaps(launchOptions: options)
        //for 1 or N items 
        var mapItems = [mapItem, mapItem2] //src to destination
        MKMapItem.openMaps(withItems:mapItems, launchOptions: options)
    }