【问题标题】:App thinning without @3x images and when some images are JPGs没有@3x 图像并且某些图像是 JPG 时的应用程序细化
【发布时间】:2025-12-08 17:25:01
【问题描述】:

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

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

我不介意这种行为有两个原因:

  1. 结果对于我正在使用的图像来说已经足够好了
  2. 只有 50% 的用户使用 iOS 9。如果我添加 @3x 图像,我的应用程序的大小对于旧操作系统上的用户来说会飞涨

虽然图像在 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 的理想格式。

提前感谢您的帮助!

【问题讨论】:

  • 那么您为什么不测试并找出答案呢?您可以在您的机器上导出精简的应用程序以查看它的作用。为什么不试试呢?
  • @matt 感谢您的建议。但是,我不确定如何通过查看存档来查看哪些图像将加载到哪些设备上。你能详细说明一下吗?
  • 您导出为 iPhone 6 Plus 精简的应用程序。现在看看里面,看看它包含什么资源。现在您知道 iPhone 6 Plus 用户将在应用程序中拥有什么。所以如果有 2x 图像,你知道它们会被加载,因为当有 2x 图像而不是 3x 图像时会发生这种情况。如果 1x 图像不存在,您知道您确实从应用瘦身中受益。你问的是哪个,不是吗?
  • @matt 有道理,谢谢。但是,归档时如何将应用程序限制在特定的 iPhone 上?不幸的是,我没有 6+ 设备,因此“仅构建活动架构”似乎不是选项。对不起,如果我在这方面听起来太笨了
  • 请仔细听。存档时不限制应用程序。您在从存档导出时限制应用程序。试试看,你会看到的!停止转动你的*,去做吧。

标签: ios iphone-6-plus asset-catalog app-thinning


【解决方案1】:

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

  1. 当最小部署目标是 iOS 6 时,没有 Assets.car 生成。 [UIImage imageNamed:] 为 JPG 图像返回 nil,除非图像名称中提供了“.jpg”扩展名
  2. 当最小部署目标是 iOS 7 时,会生成 Assets.car 但 它仅包含那些在 Asset Catalog 中导入的图像 作为PNG。所有 JPG 都被复制到 Assets.car 之外。 [UIImage imageNamed:] 为 JPG 图像返回 nil,除非图像名称中提供了“.jpg”扩展名。
  3. 当最小部署目标是 iOS 8 Assets.car 包含所有 图片。它的大小为 13MB。 [UIImage imageNamed:] 即使没有指定“.jpg”扩展名,也能正确返回 JPG 图像。包含“.jpg”扩展名时,图片也能正确加载
  4. 当最小部署目标是 iOS 9 Assets.car 包含所有 图片。它的大小为 11.5MB。 [UIImage imageNamed:] 即使没有指定“.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. JPG 图像的应用瘦身仅适用于从 iOS 8 的最低部署目标开始
  3. [UIImage imageNamed:] 只有在通过资产目录正确处理 JPG 图像时才正确返回 JPG 图像而不提供“.jpg”扩展名。如前所述,只有在最低部署目标是 iOS 8 或更高版本时才会发生这种情况
  4. 如果指定了“.jpg”扩展名,[UIImage imageNamed:] 始终会加载正确的图像。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢!我不知道这是可能的。明天早上会试一试,并通过提供结果来更新问题。
    • 这种方法有问题。我试过了,我得到了所有的图像。然后我做了一个简单的测试,我从我的资产目录中删除了除了应用程序图标和启动图像之外的所有图像。这些在所有变体中都提供,包括 3x。当我将它存档然后为 iPhone 6+ 导出时,我得到了所有这些图像。显然,在后一种情况下,应用细化应该去除 1x 和 2x 图像,但它不会这样做。你知道可能出了什么问题吗?
    • 不幸的是,这并不能证明我们想要证明的东西,我提出的方法也不能证明,因为你最终会得到一个不透明的 .car 文件。我会删除我的答案。很抱歉,它不适用于此特定问题。
    • 感谢您的帮助!我真的希望有人遇到同样的问题,并且可以根据他们的经验告诉我如果我不包含 3x 图像会发生什么......
    • 虽然我不得不说,这样的导出 App Thinning 从来没有工作过,这很奇怪。作为导出过程的一部分,有一条消息“Performing App Thinning”(或类似的东西),所以人们会认为它实际上是在执行它......
    【解决方案3】:

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

    然后使用马特建议的image extractor tool

    部署目标iOS 7

    结果如下:

    【讨论】:

    • 有些图片根本没有被复制,这很奇怪。导致此结果的 ico-xxx 与其他图像之间是否存在任何差异?
    • 我应该期望没有3x的资产将被复制到iphone 6plus中吗?
    • 我不敢说实话。但是,我可以肯定的是,如果您的资产中不包含 3x 版本,则 2x 图像将被复制到 iPhone 6 plus。当某些资产具有 3x 版本时,它的工作方式可能会有所不同。
    最近更新 更多