tva
← 洞察

解决 App Store 图标拒绝问题:sRGB、Alpha 通道及其他陷阱

App Store Connect 的图标验证失败时,往往不给出具体原因。您上传了一张 1024×1024 的 PNG,在所有图像编辑器中看起来都完好无误,却收到类似“The image could not be processed.”的提示。没有提及色彩空间,也没有说明 Alpha 通道,只是让提交卡在 App Store 门外。

实际上,验证器只检查少数技术属性,其中任何一项不合格,都会产生同样笼统的错误。最常见的三个原因是:非 sRGB 的色彩配置文件(通常是现代设计工具导出的 Display P3)、商店明确禁止的 Alpha 通道,以及较少见的索引色模式。2025 年制作的图标本不应出现索引色,但经过较旧的优化流程时,仍可能产生。一旦知道要检查什么,这三个问题都能在一分钟内通过终端修复。

App Store Connect 实际要求什么

Apple 对 App Store 应用详情页图标有明确要求:文件必须是 PNG,尺寸必须为 1024×1024 像素,而且不能有 Alpha 通道。无论是部分透明的 Alpha,还是完全不透明的 Alpha,都不允许;文件中必须完全没有 Alpha 数据。色彩空间建议使用 sRGB:Apple 的 Human Interface Guidelines 也将 Display P3 和 Gray Gamma 2.2 列为应用图标支持的色彩空间,但根据我们的经验,对于 App Store 图标,sRGB 是最稳妥的选择。色彩模式也建议使用 RGB TrueColor,而非索引调色板。

禁止 Alpha 通道,是因为 App Store Connect 会自行对图标应用圆角并进行合成,Alpha 通道会干扰这一过程。要求 sRGB,则是因为商店要在显示配置各异的大量设备上渲染图标,sRGB 是通用基准。Display P3 是 Apple 的广色域色彩空间,也是 Figma、Sketch 和 Affinity Designer 等工具中常见的导出选项。根据我们的经验,带有 P3 标签的图标是本指南所述许多验证失败的原因。

使用 sips 诊断问题

macOS 自带 sips(Scriptable Image Processing System),这是一个无需第三方依赖即可检查和转换图像的命令行工具,也是查看图标文件实际包含什么的最快方法。

sips --getProperty all icon.png

输出是一份平铺的属性列表。与 App Store 验证有关的关键字段是 hasAlpha、space 和 profile。有问题的文件通常会显示类似以下内容:

hasAlpha: yes
space: RGB
profile: Display P3

这种组合会验证失败。space: RGB 无法区分普通 RGB 与 sRGB,要看 profile 字段才能判断。可上传的合格图标应显示 hasAlpha: no,配置文件则应为“sRGB IEC61966-2.1”或等效配置。

如果希望在构建脚本中更快检查,也可以查询单个属性:

sips --getProperty hasAlpha icon.png
sips --getProperty profile icon.png

色彩配置文件问题

最常见的拒绝原因是 Display P3 色彩配置文件。现代 Mac 显示器支持 P3,如果没有明确选择 sRGB,设计工具可能会使用广色域配置文件导出。Figma 已于 2023 年 8 月移除“Unmanaged”选项;现在每个文件使用 sRGB 或 Display P3,导出时会沿用文件的配置,除非在导出设置中更改。Sketch 也有类似的文档级设置。如果设计师在 MacBook Pro 上工作,导出时没有检查设置,生成的 PNG 就会是 P3。

修复方法是将文件转换为 sRGB,而非仅更改标签。这一区别很重要:sips -s profile 会在元数据中嵌入另一个配置文件,却不转换像素值。结果是像素按 P3 编码,却被标为 sRGB,标签与实际数据不符。正确参数是 --matchTo,它会真正执行色彩空间转换:

sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc'   icon.png --out icon-srgb.png

这会按 P3 读取源像素,转换为对应的 sRGB 值,并写入新文件。在大多数显示器上,色彩变化难以察觉,但对通过验证很重要。执行后,确认结果:

sips --getProperty profile icon-srgb.png

配置文件现在应显示“sRGB IEC61966-2.1”。

移除 Alpha 通道

sips 无法移除 Alpha 通道。它可以检查通道,也可以为带有 Alpha 通道的文件添加配置文件,但要剥离 Alpha 层,需要另一种工具。ImageMagick 的 convert 可以直接完成:

convert icon-srgb.png -background white -alpha remove -alpha off icon-final.png

这些参数按顺序生效。-background white 设置替换透明像素的背景色。-alpha remove 将图像与背景合成,消除透明度。-alpha off 则从输出中彻底移除 Alpha 通道。结果是一张完全不透明的 PNG,可通过 App Store 验证器的检查。

如果图标实际上没有透明度,即所有像素都完全不透明,但文件结构仍包含 Alpha 通道,可以改用 pngcrush。它的无损色彩类型缩减功能自 pngcrush 1.8.0 起默认启用,可将完全不透明的 RGBA 图像重写为 RGB,而不改变任何像素值:

pngcrush -ow -rem alla icon.png

Alpha 通道是像素数据,并非元数据块,因此 -rem alla 参数不会移除它。该参数会移除除 tRNS 以外的所有已知辅助块,包括任何嵌入的色彩配置文件,因此操作后应重新检查配置文件;-ow 则会覆盖原文件。这种方式更快且无损,但只有在不存在实际透明度、无需合成背景时,才会进行色彩类型缩减。如果 identify -verbose icon.png | grep Alpha 显示存在非完全不透明的像素,应使用 ImageMagick 方案。

索引色模式这一少见情况

RGB TrueColor 将每个像素存储为三个独立的 8 位(或 16 位)通道值。索引色模式则存储一个调色板,并通过整数索引引用颜色。这是一种为 1989 年的小型 GIF 设计的格式,而非为应用图标设计的格式。大多数设计工具不会生成索引色 PNG,但某些 Web 优化流程,尤其是大量使用 pngquant 等工具的较旧流程,可能在调色板量化过程中顺带将 TrueColor 图标转换为索引色。

使用 ImageMagick 检查色彩模式:

identify -verbose icon.png | grep -E "^  Type"

TrueColor 文件会显示 Type: TrueColor 或 Type: TrueColorAlpha,索引色文件则显示 Type: Palette。如果看到 Palette,就进行转换:

convert icon.png -type TrueColor icon-truecolor.png

实际中,这是最少见的拒绝原因。但在图标曾经经过资源优化脚本处理的代码库中,它仍会反复出现。

合并修复流程

当图标同时存在 P3 配置文件、Alpha 通道以及可能残留的旧元数据这三个问题时,最简洁的办法是使用一个简短的处理流水线:先用 sips 转换色彩,再用一条 ImageMagick 命令处理其余问题:

sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc'   icon.png --out /tmp/icon-srgb.png   && convert /tmp/icon-srgb.png     -type TrueColor     -background white     -alpha remove     -alpha off     -strip     icon-final.png

末尾的 -strip 参数会从输出中移除所有嵌入的配置文件、注释和辅助元数据块,此时像素已转换为 sRGB,因此能生成小巧、干净的 PNG;如果希望按前文建议保留明确的 sRGB 标签,请省略 -strip。执行后,最后运行一次 sips --getProperty all icon-final.png,应能确认 hasAlpha: no、space: RGB,以及没有配置文件或明确嵌入了 sRGB 配置文件。

从源头修复问题

命令行修复有效,但真正的解决办法是配置设计工具,让它第一次导出就符合要求。在 Figma 中,导出任何资源前先将文件的色彩配置设为 sRGB,或在导出设置中选择 sRGB。在 Sketch 中,点击画布空白处,在 Inspector 中设置 Color Profile。在 Affinity Designer 中,打开 File → Document Setup,进入 Color 标签页,确保配置文件设为 sRGB IEC61966-2.1。

对于 App Store 图标,导出应使用 PNG 格式、1024×1024 尺寸,不进行缩放,并启用 sRGB 配置文件。如果 CI/CD 流程通过 xcrun altool 或直接调用 App Store Connect API 上传,应在上传前加入验证步骤,运行 sips --getProperty hasAlpha,发现 Alpha 通道就让构建失败。在 API 调用前发现问题,可以省去往返等待和人工调查的时间。

这里的核心教训是:App Store Connect 的验证正是按照 Apple 文档中的要求执行。问题在于,上传流程没有呈现这些文档,错误消息也没有对应到具体的不合格条件。一旦了解所检查的三个属性,验证就不再神秘,而成为一份清晰的检查清单。

相关洞察

延伸阅读