没有@3x 图像和某些图像为 JPG 时的应用程序细化

App thinning without @3x images and when some images are JPGs

为了即将对我的一个应用程序进行更新,我已将所有图像资源打包到资产目录中。

但是,目前我的大部分图像都没有@3x 版本。我已经检查过模拟器并使用 iPhone 6 Plus @2x 版本。

我不介意这种行为,原因有二:

  1. 对于我正在使用的图像来说,结果已经足够好了
  2. 只有 50% 的用户在使用 iOS 9. 如果我添加 @3x 图片,我的应用程序的大小对于旧 OS

虽然图像在 iPhone 6 plus 的模拟器中正确加载,但我有点担心我存档我的应​​用程序时会发生什么。特别是,恐怕使用 App Thinning iPhone 6 Plus 用户将获得没有任何图像的应用程序:)

所以,我有两个问题:

  1. 如果我不提供@3x 图片,@2x 将加载到 iPhone 6 plus 我的更新在 App Store 上线后?
  2. 我还会从 App Thinning 中受益吗,因为 @2x 和 @3x 显示不会下载@1x 图像(反之亦然)?还是 App Thinning 在这种情况下不起作用,用户将获得相同的资产,而不管他们的设备屏幕如何?

这些都是微不足道的问题,但我无法在网上任何地方找到有关当您不遵循 Apple 的指导方针不在资产目录中提供 @3x 图像但您的应用程序仍可用于 iPhone 6+。此外,我的一些图片是 JPG 格式,这增加了额外的不确定性,因为它不是 iPhone.

的理想格式

在此先感谢您的帮助!

回答你自己的问题。存档应用程序。为您感兴趣的目标设备导出应用:

现在查看导出的应用内部,看看它包含哪些资源。 .ipa 只是另一个名称的 .zip 文件;通过更改后缀可以很容易地查看它的内部。现在您知道 iPhone 6 Plus 用户将从 App Store 下载哪些资源了。

我使用 Matt 提出的程序执行了几个额外的测试:

  1. 当最小部署目标是 iOS 6 没有 Assets.car 产生。 [UIImage imageNamed:] returns nil 对于 JPG 图片,除非“.jpg”扩展名作为图片名称的一部分提供
  2. 当最小部署目标为iOS 7 Assets.car 生成但 它仅包含那些导入到资产目录中的图像 作为PNG。所有 JPG 都在 Assets.car 之外复制。 [UIImage imageNamed:] returns nil 用于 JPG 图片,除非“.jpg”扩展名作为图片名称的一部分提供。
  3. 当最小部署目标是 iOS 8 Assets.car 包含所有 图片。它的大小是 13MB。 [UIImage imageNamed:] returns 即使未指定“.jpg”扩展名,JPG 图像也能正确显示。当包含“.jpg”扩展名时,图像也能正确加载
  4. 当最小部署目标是 iOS 9 Assets.car 包含所有 图片。它的大小是 11.5MB。 [UIImage imageNamed:] returns 即使未指定“.jpg”扩展名,JPG 图像也能正确显示。当包含“.jpg”扩展名时,图像也能正确加载

我使用了 Matt 建议的 image extractor tool 从这些资产中提取图像。我只能从配备 Retina 的设备的档案中导出,我可以确认所有图像都具有正确的分辨率(即只有视网膜尺寸,忽略 iPad 特定图像)。然而,该工具将所有这些都保存为 PNG 格式,因此文件夹的最终大小总是大于 Assets.car。

最令人惊讶的是案例3和案例4的文件夹大小相同(39.4MB)。而且,图像似乎完全相同。所以,我真的很想知道那里发生了什么,因为在这些情况下 Assets.car 的大小相差 2MB。

总而言之,我们仍然不确定这种测试方法是否可以用于准确模拟 App Thinning 行为。所以,如果有人对此有亲身经历,那么如果他们能分享它就太棒了。

但是,假设为 AdHoc 导出特定设备产生的结果与 App Store 执行的实际 App Thinning 产生的结果相同,我们可以得出结论:

  1. 仅当部署目标为 iOS 7 或更高版本
  2. 时应用程序精简才会启动
  3. JPG 图像的应用程序瘦化仅适用于从 iOS 8
  4. 的最小部署目标开始
  5. [UIImage imageNamed:] returns JPG 图像仅在通过资产目录正确处理 JPG 图像时才不提供“.jpg”扩展名。如前所述,只有在最低部署目标为 iOS 8 或更高版本
  6. 时才会发生
  7. [UIImage imageNamed:] 如果指定了“.jpg”扩展名,则始终加载正确的图像。

最后两个结论似乎与这个问题无关,但我在 Stack Overflow 上发现了几个关于如何使用 Asset Catalogs 正确加载 JPG 图像的相互矛盾的观点。有些人声称您可以在不提供“.jpg”扩展名的情况下加载它们,而其他人则抱怨这种方法不起作用。我认为上面的 3 和 4 详细解释了这种情况下发生的情况以及人们得到不同结果的原因。

从缺少 3x 图像的项目中获取 iPhone4s 和 iPhone 6SPlus 存档后

然后使用 Matt 建议的 image extractor tool

部署目标iOS7

结果如下: