引用资产目录和从框架中包含它是否会产生重复?

Does Both Referencing an Asset Catalogue and Including it from a Framework Create Duplication?

正如所讨论的 here & here,唯一明显的方法是在框架的 .xcassets 文件中托管可重复使用的图像,然后在 故事板 / XIB 的应用程序,是直接在应用程序的项目中手动创建对该目录文件的引用。这会将资产放入应用程序的主包中,并在尝试通过 Interface Builder 使用它们时避免此错误:

Could not load the "ImageName" image referenced from a nib in the bundle with identifier "BundleName"

不过,我的问题是:这是否会导致在构建时重复资产? iOS 是否足够聪明,不会将资产加倍都是:

如果这确实会导致重复,还有什么其他方法可以更有效地实现相同的结果?该框架需要嵌入到应用程序中,因为它包含其他可重用代码,并且资产需要在框架的目录中,因为它们也在其他应用程序中使用。

Apple 的目标是最大限度地减少资产所需的 space,因此将资产组合并压缩到一个名为 'Assets.car'.

的文件中

然而,正如评论中正确指出的那样,图像在最终的 .ipa 中包含两次,一次在应用程序的 Assets.car 文件中,一次在框架的 Assets.car 文件中。

当您提交到应用商店时,会启动一个名为 App Thinning 的过程,该过程会为不同的实际设备创建变体。

您可以在本地模拟该过程,并使用 third-party 工具甚至查看 'Asset.car' 文件内部。

我在这个回答中详细描述了整个过程: Pixelated images on iOS10 when building with Xcode 10

为了自己测试,我做了以下操作:

  • 我创作了作品space
  • 我添加了一个框架
  • 我添加了一个应用程序
  • 在框架里面我添加了一个'Media.xcassets'
  • 我从应用中引用了这个Media.xcassets
  • 我添加了一张名为 'Regensburg.jpg' 的图片到 Media.xcassets
  • 我在故事板中使用此图像

有两个 Assets.car 文件,一个在应用程序的基本文件夹中,一个在框架中。如果您使用 third-party 工具查看,您可以看到两个 Assets.car 文件包含相同的图像。

所以最后图片在.ipa文件中保存了两次

结论

不幸的是,如果你想避免这种重复,你不能直接在故事板中引用它,而是必须以编程方式从框架中检索图像。

截图

在截图中可以看到:

  • Xcode 包含框架和应用程序以及后台 .xcassets 的项目结构

  • 故事板中唯一一张图片的使用

  • 解压出来的两个Assets.car文件在右下区域的Finder中(一个在应用文件夹,一个在框架)

  • 最后提到的 third-party 左下方区域的工具显示了嵌入的图像

结论 不幸的是,如果您想避免这种重复,您就不能使用 Interface Builder,而是必须以编程方式从框架中检索图像。

更多信息

就像我的其他回答一样,我建议您观看这个 WWDC 2018 视频:第 227 节,优化应用程序资产,https://developer.apple.com/videos/play/wwdc2018/227/