在没有网络的情况下,SwiftUI的地图视图会卡死

移动开发 2026-07-08

Map 视图在 SwiftUI 中冻结,或在没有互联网连接时停止接收触摸事件。任何交互,例如 zoompanrotate,都将失效,但地图本身似乎仍在工作,例如我可以添加一个 MapPolyline 并更新它,但地图仍然没有响应。

为澄清,我并不介意地图本身是空的,即没有瓦片,前提是没有网络连接是预期的,但我仍然希望能够与地图互动。

这在 iOS 17和 18 上正常工作,但似乎在 iOS 26 上停止工作。

注:我注意到当没有缓存的地图瓦片时,这个问题更为显著。MapKit 有内部缓存,因此如果你在没有网络连接的情况下访问地图,你仍然可能看到一张地图,好像连接正常一样,这可能是因为你之前使用过地图并已缓存。只要加载了某些瓦片,地图视图似乎按预期工作,但地图完全为空时就会冻结。

示例

没有瓦片的地图视图,地图不可见

设置

  • SwiftUI
  • MapKit
  • iOS 26
  • Swift 6.3

解决方案

在尝试了各种不同的配置后,我意识到地图只有在 mapStyle 设置为 standard 时才会冻结。把它改成其他变体中的任意一个,地图就会再次工作,即使没有网络连接。

因此,使用 mapStylehybridimagery 就足够了。

一个在网络连接正常时支持 standard,在没有网络时回退到 hybrid 的方案,可能是实现 NWPathMonitor,并在网络 status 变化时更新 mapStyle

示例

import SwiftUI
import MapKit
import Network

struct MyView: View {
    @State private var isOnline = true

    var body: some View {
        Map()
            .mapStyle(isOnline ? .standard : .hybrid)
            .task {
                /// This is for illustrative purposes only
                /// a more robust implementation 
                /// of `NWPathMonitor` may be needed
                isOnline = NWPathMonitor().currentPath.status == .satisfied
            }
    }

}

When on hybrid or imagery, the Map 视图在没有互联网连接时也能对触摸事件做出响应。

没有互联网连接但仍可响应用户交互的地图视图

文档

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章