MKMapItem.openInMaps()恰好在50%的时间显示位置标记

Gru*_*kes 6 ios mkmapitem apple-maps

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

例如,代码每运行第1次,第3次,第5次,第7次,第n次显示地点标记,但每运行第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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

奇

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

甚至

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

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

Swi*_*ect 2

免责声明

\n

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

\n

正如@return0准确描述的

\n
\n

...我尝试了您的代码,问题在于,一旦您将位置居中并显示,如果您不关闭它并再次启动应用程序,它将不会显示...

\n
\n

更多怪事

\n
    \n
  1. 第二次,mapItem.openInMaps 确实取消了行车路线覆盖(而不是显示新位置)
  2. \n
  3. 如果用户关闭所述叠加层,地图将不再混乱(*)
  4. \n
\n

(*)这种情况的另一个奇怪之处是,一旦覆盖层关闭,该位置就会消失。

\n

漏洞?\xe2\x86\x92 解决方法!

\n

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

\n
MKMapItem.openMaps(with: [mapItem, mapItem], launchOptions: options)\n
Run Code Online (Sandbox Code Playgroud)\n

没有方向,但没有被卡住 方向但没有卡住

\n

解决方法奖金

\n

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

\n
\n

完整的 Swift 3 源代码

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

...和调用

\n
@IBAction func doApple() {\n    displayMap("1 Infinite Loop, Cupertino, California", name: "Apple", tph: "(408) 996\xe2\x80\x931010")\n}\n\n@IBAction func doMicrosoft() {\n    displayMap("One Microsoft Way, Redmond, WA", name: "Microsoft", tph: "1-800-MICROSOFT")\n}\n\n@IBAction func doIBM() {\n    displayMap("1 New Orchard Road. Armonk, New York", name: "IBM", tph: "(914) 499-1900")\n}\n
Run Code Online (Sandbox Code Playgroud)\n