MKMapItem.openInMaps()正好显示50%的时间

时间:2016-12-28 21:13:36

标签: ios apple-maps mkmapitem

我发现运行一些代码以在地图视图MKMapItem.openInMaps()中显示位置只能在50%的时间内正常工作。
实际上,它恰好在显示的MKPlacemark之间交替显示。

例如,每经过第1次,第3次,第5次,第7次,代码运行,然后显示地点标记,但每运行第2次,第4次,第6次,第8次,地点标记不是显示。

这是100%可重复运行下面发布的代码。
这似乎是一个错误,但如果是这样,那么我很惊讶它以前没有报道也没有修复过。但鉴于失败恰恰在成功和失败之间交替,我会认为还有其他事情发生,所以我在这里发帖,看看是否有人熟悉这个问题,或者有什么是应该做的代码中缺少哪些,或者有一个解决方法:

override func viewDidAppear(_ animated: Bool) {
    displayMap()
}

func displayMap()
{
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString("1 Infinite Loop, Cupertino,California") { (placemark: [CLPlacemark]?, error: Error?) -> Void in
        if error == nil
        {
            if let placemark = placemark, placemark.count > 0
            {
                let location            = placemark.first
                let latitude            = (location?.location?.coordinate.latitude)!
                let longitude           = (location?.location?.coordinate.longitude)!
                let coordinates         = CLLocationCoordinate2DMake(latitude, longitude)

                let regionDistance:CLLocationDistance = 100000
                let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)

                let options = [
                    MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
                    MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span)
                ]
                let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
                let mapItem = MKMapItem(placemark: placemark)

                mapItem.name = "Apple"
                mapItem.phoneNumber = "(405) 123-4567"
                mapItem.openInMaps(launchOptions: options)
            }
        }
        else
        {
            assert(false, "Unable to geocode")
        }
    }
}

这是代码运行第一,第三,第五,第七......时间的结果

Odd

这是代码运行第二,第四,第六,第八......时间的结果

Even

请注意,在失败屏幕截图中,不仅地图标记未在地图上显示,而且向上滑动也是空的。

(目前在10.2中观察到这一点,但也在其他版本上看过它)

2 个答案:

答案 0 :(得分:2)

声明

是的,似乎mapItem.openInMaps中的一个错误,它会将行车路线打开为叠加层。

@return0准确描述:

  

...我尝试了您的代码,问题在于,一旦您将位置置于中心并显示,如果您不解除它并再次启动应用程序,它将无法显示...

更多奇怪

  1. 第二次,mapItem.openInMaps 解除行车路线覆盖(代替显示新位置)
  2. 如果用户关闭所述叠加层,则Map不再混淆(*)
  3. (*)这种情况的另一个奇怪之处是,一旦覆盖关闭,位置就会消失。

    错误? →解决方法!

    通过请求多个位置强制方向叠加消失。实际上,它意味着调用两次相同位置的地图:

    MKMapItem.openMaps(with: [mapItem, mapItem], launchOptions: options)
    

    no directions, but not stuck directions but not stuck

    解决方法奖金

    即使用户点击锚点并请求行车方向,随后从您的应用程序调用地图到该地点或其他位置将其挂起。换句话说,它按预期工作。

    完整的Swift 3源代码

    func displayMap(_ address:String, name:String, tph:String)
    {
        let geoCoder = CLGeocoder()
        geoCoder.geocodeAddressString(address) { (placemark: [CLPlacemark]?, error: Error?) -> Void in
            assert(nil == error,  "Unable to geocode \(error)")
            if error == nil
            {
                if let placemark = placemark, placemark.count > 0
                {
                    let location            = placemark.first
                    let latitude            = (location?.location?.coordinate.latitude)!
                    let longitude           = (location?.location?.coordinate.longitude)!
                    let coordinates         = CLLocationCoordinate2DMake(latitude, longitude)
    
                    let regionDistance:CLLocationDistance = 10000
                    let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
    
                    let options = [
                        MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
                        MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span)
                    ]
                    let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
                    let mapItem = MKMapItem(placemark: placemark)
    
                    mapItem.name = name
                    mapItem.phoneNumber = tph
                    MKMapItem.openMaps(with: [mapItem, mapItem], launchOptions: options)
                } else {
                    print("Something wrong with \(placemark)")
                }
            }
        }
    }
    

    ...和调用

    @IBAction func doApple() {
        displayMap("1 Infinite Loop, Cupertino, California", name: "Apple", tph: "(408) 996–1010")
    }
    
    @IBAction func doMicrosoft() {
        displayMap("One Microsoft Way, Redmond, WA", name: "Microsoft", tph: "1-800-MICROSOFT")
    }
    
    @IBAction func doIBM() {
        displayMap("1 New Orchard Road. Armonk, New York", name: "IBM", tph: "(914) 499-1900")
    }
    

答案 1 :(得分:0)

在iOS 10.3.2上,这个问题仍然存在。但是,此解决方法使mapItem不会消失:

MKMapItem.openMaps(with: [mapItem], launchOptions: options)