You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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包的预览目标设置,让它依赖主应用目标:

  1. 打开项目导航器,找到本地SPM包
  2. 展开包的Targets,找到预览目标(命名通常是[你的包名]_Previews)
  3. 进入Build Phases > Dependencies,点击+号添加主应用的目标
  4. 这样预览时就能访问主应用的Bundle资源

注意:该方法会增加预览构建时间,因为需要编译主应用目标。

内容的提问来源于stack exchange,提问作者Szymon W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:03:33