如何让Swift Package中的SwiftUI预览加载主Bundle资源?
解决本地SPM包SwiftUI预览加载主Bundle资源的问题
你的项目是主应用集成本地SPM包,真机和模拟器运行时资源加载正常,但SPM包内的SwiftUI预览无法读取主Bundle里的图片资源,以下是几种可行的解决办法:
方案1:在预览中显式指定主应用Bundle
在SPM包的视图预览代码里,直接指定主应用的Bundle ID来加载资源,同时通过环境变量传递给视图:
首先定义一个Bundle环境键:
private struct BundleEnvironmentKey: EnvironmentKey { static let defaultValue: Bundle = Bundle.main } extension EnvironmentValues { var bundle: Bundle { get { self[BundleEnvironmentKey.self] } set { self[BundleEnvironmentKey.self] = newValue } } }
然后在SPM包的视图中,使用环境变量的Bundle加载图片:
struct YourSPMView: View { @Environment(\.bundle) private var bundle var body: some View { Image("your-image-name", bundle: bundle) } }
最后在预览代码里指定主应用的Bundle:
struct YourSPMView_Previews: PreviewProvider { static var previews: some View { YourSPMView() .environment(\.bundle, Bundle(identifier: "com.yourcompany.yourapp") ?? Bundle.main) } }
替换com.yourcompany.yourapp为你的主应用实际Bundle ID。
方案2:创建共享资源Bundle
把需要共享的图片资源单独放到一个独立的资源Bundle中,让主应用和SPM包共同依赖它:
- 新建一个资源Bundle目标(Xcode中:
File > New > Target > 选择iOS/macOS的Bundle) - 将共享图片拖入这个Bundle目标
- 在SPM包的
Package.swift中添加该资源Bundle的本地依赖 - 加载图片时通过Bundle类获取实例:
// 假设资源Bundle里有个空类SharedMarker Image("your-image-name", bundle: Bundle(for: SharedMarker.self))
方案3:给SPM预览目标添加主应用依赖
在Xcode中调整SPM包的预览目标设置,让它依赖主应用目标:
- 打开项目导航器,找到本地SPM包
- 展开包的Targets,找到预览目标(命名通常是
[你的包名]_Previews) - 进入Build Phases > Dependencies,点击+号添加主应用的目标
- 这样预览时就能访问主应用的Bundle资源
注意:该方法会增加预览构建时间,因为需要编译主应用目标。
内容的提问来源于stack exchange,提问作者Szymon W
相关产品推荐
相关产品推荐

