Mac版Swift Playgrounds 4.1中AsyncImage无法加载远程图片预览

问题表现
同一份SwiftUI代码在不同端Swift Playgrounds的运行表现不一致:
- iPad版Swift Playgrounds中
AsyncImage组件可正常加载远程图片 - Mac版Swift Playgrounds 4.1中
AsyncImage始终加载失败,仅展示占位视图 - 加载项目内本地资源图片的功能不受影响,全端运行正常
可稳定复现问题的代码如下:
import SwiftUI struct ContentView: View { var body: some View { Section { VStack { AsyncImage(url: URL(string: "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/1200px-Image_created_with_a_mobile_phone.png")) { image in image .resizable() .scaledToFit() } placeholder: { Color.red.opacity(1) } .frame(width: 200, height: 200) .cornerRadius(6) } } } }
触发原因
核心原因是Mac端Swift Playgrounds 4.1的默认沙盒权限配置和iPad端存在差异:
Mac端新建的Playground App项目默认关闭了沙盒的出站客户端网络连接权限,AsyncImage底层依赖URLSession发起的网络请求会被系统直接拦截,根本无法发出,自然无法拉取到远程图片资源。本地图片不需要走网络请求,因此不受该权限限制。
另外代码中Section组件未被List/Form等容器包裹会触发UI层级警告,但该问题不会阻断图片加载,不是故障诱因。
修复方法
- 优先调整权限配置:打开Playground项目的设置面板,找到App Sandbox配置组,勾选「Outgoing Connections (Client)」(出站客户端连接)选项,重新运行项目即可正常加载远程图片,不需要修改任何业务代码。
- 若调整权限后仍存在加载失败的情况,可以给
AsyncImage传入自定义的URLSession实例,显式设置缓存策略和超时时间,规避4.1版本中AsyncImage默认会话的已知缓存bug:
// 自定义网络会话配置 let customSession: URLSession = { let config = URLSessionConfiguration.default config.requestCachePolicy = .returnCacheDataElseLoad config.timeoutIntervalForRequest = 15 return URLSession(configuration: config) }() // 调用时传入自定义会话 AsyncImage(url: imageURL, session: customSession) { phase in // 对应加载状态的UI逻辑 }
内容的提问来源于stack exchange,提问作者Liam Rogers
相关产品推荐
相关产品推荐

