如何在Xcode多Target间共享Asset Catalog且不重复拷贝资源文件
解决iOS扩展与主App共享Asset Catalog资源且避免重复拷贝的方法
当你将同一个xcassets目录添加到多个Target(主App和扩展)时,每个Target在编译阶段都会将xcassets编译为独立的.car资源包,并打包到各自的产物中,这就是你观察到产品体积增大的核心原因。以下是符合Apple开发规范的解决方案:
方法一:通过动态共享框架(Dynamic Framework)共享Asset Catalog
这是最可靠的方案,能确保资源仅被打包一次:
- 创建动态框架Target
在Xcode中选择File > New > Target,选择iOS > Framework & Library > Cocoa Touch Framework,完成命名后创建。 - 迁移资源到框架
将主App中的xcassets文件拖到新框架Target中,弹出选项里仅勾选框架Target,取消主App和扩展的勾选(后续通过依赖框架访问资源)。 - 配置主App与扩展的依赖
- 主App Target:进入
General > Frameworks, Libraries, and Embedded Content,添加该框架,设置Embed选项为Embed & Sign。 - 扩展Target:同样添加框架依赖,设置
Embed选项为Do Not Embed(扩展运行时会从主App沙盒加载框架资源)。
- 主App Target:进入
- 访问共享资源
在主App和扩展中,通过指定框架的Bundle加载资源,示例代码:// 替换为你框架中的任意类名,比如SharedAssetsKit let frameworkBundle = Bundle(for: SharedAssetsKit.self) let sharedImage = UIImage(named: "yourImageName", in: frameworkBundle, compatibleWith: nil)
方法二:App Groups共享(不推荐用于Asset Catalog)
虽然App Groups允许主App和扩展共享文件系统资源,但Asset Catalog编译后的.car是二进制打包格式,无法直接通过文件系统共享。该方法仅适合原始图片文件,而非Asset Catalog,因此不推荐作为首选方案。
内容的提问来源于stack exchange,提问作者Perry Wang
相关产品推荐
相关产品推荐

