Ios 如何通过传递地址打开Apple Maps行驶方向

Ios 如何通过传递地址打开Apple Maps行驶方向,ios,swift,mapkit,apple-maps,Ios,Swift,Mapkit,Apple Maps,我正在尝试实现一个功能,通过传递实际地址打开Apple Map应用程序的驾驶方向屏幕 地址不仅是随机地址,而且是业务地址,这些地址大多在苹果地图上注册和搜索。因此,通过传递地址,它应该是匹配的,并正确地显示该业务的方向,而不是指向地图上的未知注释。这种情况发生在我直接传递经度和纬度时,因此我不想使用geocodeAddressString()将地址转换为geocoordination 如何实现它?只需使用Apple Maps API即可。如果你可以通过在苹果地图上显示一个企业的名称来找到它,你可

我正在尝试实现一个功能,通过传递实际地址打开Apple Map应用程序的驾驶方向屏幕

地址不仅是随机地址,而且是业务地址,这些地址大多在苹果地图上注册和搜索。因此,通过传递地址,它应该是匹配的,并正确地显示该业务的方向,而不是指向地图上的未知注释。这种情况发生在我直接传递经度和纬度时,因此我不想使用geocodeAddressString()将地址转换为geocoordination


如何实现它?

只需使用Apple Maps API即可。如果你可以通过在苹果地图上显示一个企业的名称来找到它,你可以通过API找到它。在您的情况下,正确的参数是
daddr
,如下所示:

http://maps.apple.com/?daddr=1+无限+循环,+Cupertino,+CA

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

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

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


请记住通过iOS 10中的
UIApplication.shared().open(URL:URL,options:[String:AnyObject],completionHandler:((Bool)->Void)?
-或
UIApplication.shared.open(URL:URL)

可以使用URL调用映射(如Nicola所述),但也有一个合适的api:
MKMapItem

  • 基本上,您可以为POI/地址[1个或多个]创建映射项
  • 使用它们打开地图[使用启动选项从方向开始]

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

  • Id避免使用协议并使用MKMapItems。。它们是在allalso之后制作的:在代码中构建字符串?甚至。。你必须担心URL编码和一切:)@Nicola Giantecchi谢谢你的代码。它起作用了well@NicolaGiancecchi忘记了在上面的评论中提到,我最终使用了q和sll参数,而不是仅使用daddr。(也就是说,way给了我正确的位置这个答案对我很有用。如果你想知道如何将空格改为+,你可以检查这个答案来帮助解决这个问题。希望这对将来的人有所帮助。这种方法有一些优点。但也有一些缺点:1)@androisojavaswift想通过它的名字找到这个企业,不仅是地址或城市2)CNPOstaladAddress密钥仅在iOS 9.0之后才可用;URI模式的使用是因为iOS 6 3)您只需要为这段代码导入Contacts框架1:)按名称查找是CLGeocoder为您所做的工作-它构建位置标记。你不需要地址,甚至不需要坐标:)2。这些密钥与旧的地址簿密钥相同,因此如果需要使用旧的基本sdk进行构建,则可以在较低版本上使用。。3) 如果你只想要位置,就不要:)我的代码没有使用地理编码器,就像在他的问题中@androisojavaswift想要的一样。这是一个有争议的选择。。。显然,您的实现更加清晰和详细@daijdjan感谢您的代码。这非常有帮助,我有机会玩mapkit。但我最终还是使用了Nicola Giancecchi提供的解决方案