在没有网络的情况下,SwiftUI的地图视图会卡死
Map 视图在 SwiftUI 中冻结,或在没有互联网连接时停止接收触摸事件。任何交互,例如 zoom、pan 和 rotate,都将失效,但地图本身似乎仍在工作,例如我可以添加一个 MapPolyline 并更新它,但地图仍然没有响应。
为澄清,我并不介意地图本身是空的,即没有瓦片,前提是没有网络连接是预期的,但我仍然希望能够与地图互动。
这在 iOS 17和 18 上正常工作,但似乎在 iOS 26 上停止工作。
注:我注意到当没有缓存的地图瓦片时,这个问题更为显著。MapKit 有内部缓存,因此如果你在没有网络连接的情况下访问地图,你仍然可能看到一张地图,好像连接正常一样,这可能是因为你之前使用过地图并已缓存。只要加载了某些瓦片,地图视图似乎按预期工作,但地图完全为空时就会冻结。
示例

设置
- SwiftUI
- MapKit
- iOS 26
- Swift 6.3
解决方案
在尝试了各种不同的配置后,我意识到地图只有在 mapStyle 设置为 standard 时才会冻结。把它改成其他变体中的任意一个,地图就会再次工作,即使没有网络连接。
因此,使用 mapStyle、hybrid 或 imagery 就足够了。
一个在网络连接正常时支持 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
