如果应用程序支持iOS 8或更早版本,Assets.car无法包含16位或P3资源?

35

上传到iTunesConnect时,是否遇到了这个错误。上传进程到“正在验证与iTunes Store的资产”,然后我收到以下错误:

图片描述

我正在使用xCode8,在现有iOS应用程序中嵌入自定义贴纸应用程序。 我已暂时删除贴纸资产并包含苹果示例消息图标以测试是否是我的贴纸资产导致问题,但是在验证时仍然收到相同的错误。 有任何想法吗?


请不要上传文本错误消息的图像。只需在此处引用文本,并进行适当格式化。 - Martin Nyolt
14个回答

36

简而言之: 您的捆绑包中有一些图片的格式不受支持。 您可以调整这些图像的格式或增加目标最低iOS版本。请记住,后者只是一个临时解决方法,可能不是您想要做的,因为它会因为一个非常可解决的问题而减少您的潜在用户群。

第1部分将解释如何找出哪些图片是有问题的。

第2部分向您展示如何调整图片格式,以便iTunesConnect满意。如果您只有少量图像,则可以跳过第1部分并手动检查它们。

第1部分:确定有问题的图片:

苹果开发者论坛上有一个帖子讨论了这个问题: https://forums.developer.apple.com/thread/60919

被接受的解决方案如下:

如何解决“ERROR ITMS-90682: Invalid Bundle - The asset catalog at 'Payload/XXXXX/Assets.car' can't contain 16-bit or P3 assets if the app supports iOS 8 or earlier.”
使用 Xcode 8 GM,如果在面向早于 iOS 9.3 的应用程序提交中包含 16 位或 P3 资源,则会出现此错误。如果您的应用程序需要宽色功能,则必须将部署目标更改为 iOS 9.3 或更高版本 。如果您的应用程序不需要宽色功能,并且希望将其部署到较旧的 iOS 版本,则应将所有 16 位或 P3 资源替换为 8 位 sRGB 资源。
您可以通过在 iTunes Connect 中命名的资源目录上运行 "assetutil" 来查找 16 位或 P3 资源。以下是该过程的步骤: 1. 创建可检查的 .ipa 文件。 在 Xcode 组织器(Xcode->窗口->组织器)中,选择要检查的存档,单击“导出...”,然后选择“导出企业版或 Ad-Hoc 部署”。这将为您的应用程序创建一个 .ipa 文件的本地副本。 2. 找到那个 .ipa 文件并将其扩展名更改为 .zip。 3. 展开 .zip 文件。 这将产生一个包含您的 .app 包的 Payload 文件夹。 4. 打开终端并将工作目录更改为您的 .app 包的顶层 cd path/to/Payload/your.app 5. 使用 find 工具在您的 .app 包中查找 Assets.car 文件,如下所示: find . -name 'Assets.car'
6. 使用 assetutil 工具在每个应用程序 Assets.car 中查找任何 16 位或 P3 资源,如下所示: sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
7. 检查生成的 /tmp/Assets.json,并查找包含“DisplayGamut”:“P3”的任何内容及其关联的“Name”。这将是包含一个或多个 16 位或 P3 资源的图像集的名称。
8. 用 8 位 / sRGB 资产替换这些资产,然后重新构建您的应用程序。

第二部分:调整图像的色彩配置以适应iTunesConnect

打开有问题文件的“信息”(CMD+I)。 检查您的色彩配置。

Color profile that was not accepted

我不知道哪些配置文件是好的,哪些不好,但我的 "Adobe RGB (1998)" 被拒绝了。

所以我使用了 "Color Synch Utility"(随OSX附带)。 (右键单击图像,打开...)

现在在底部,您可以选择分配不同的颜色配置文件: 使用Color Synch实用程序分配不同的颜色配置文件

现在,如果您再次检查图像,它应该看起来像这样: 转换后的颜色配置文件

现在替换以前的图像并重试。 这对我有用,希望对您有所帮助。


1
戴尔某些产品...颜色空间可能也会成为一个问题。 - Teffi
对我们来说,每英寸150像素但是8位图像的图片导致了相同的错误信息,尽管这是非常误导人的。这导致这些图片被称为每样本16位的图像,即使我将它们创建为每像素8位。JSON显示它们为16位,并使用ARGB-16编码,这不是我保存它们的方式,也不是预览显示它们的方式。这就是问题所在。 - Alex Zavatone
根据ColorSync Utility应用程序的用户指南,分配配置文件只是将sRGB配置文件嵌入到图像中,实际上并没有修改图像。如果您想修改图像,则需要使用“匹配配置文件”或“应用配置文件”。因此,我认为您没有做正确的事情。 - DawnSong

26
感谢 @fancy 的答复,我明白问题出在图片的属性 "space" 上,它的值是 RGB 16 位。需要将其更改为 8 位的 sRGB。由于我需要支持 iOS7 客户端,所以不能只是将部署目标更改为 9.3。
所以我做了以下操作: 1)我使用下面的简单脚本递归地查找所有的 *.png 图片并更改属性。 2)然后重新构建了 .ipa 文件。Application Loader 没有显示任何错误。
#!/bin/sh

files=`find . -name "*.png"`

for i in ${files[@]}; do
    SOURCE_FILE=${i}
    DESTINATION_FILE=$SOURCE_FILE
    sips \
    --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc' \
    "$SOURCE_FILE" \
    --out "$DESTINATION_FILE"
done

exit 0

脚本完美运行,将其放在资产文件夹中并执行即可。 - Kasas
脚本运行得很好。还必须使用 "files=find . -name "*.jpg"" 和 "files=find . -name "*.jpeg"" 运行它,以确保所有图像文件都被正确设置。 - Blackcode
非常棒的解决方案。非常感谢! - Seliver
很好。如果有人对Mac上的脚本不熟悉,请按照以下步骤操作: 1)创建带有.sh扩展名的文件(例如fix_assets.sh) 2)将脚本粘贴到该文件中 3)将其放置在Images.xcassets文件夹中 4)在终端中cd到Images.xcassets文件夹 5)chmod +x ./fix_assets.sh(使其可以执行) 6)sudo ./fix_assets.sh(运行它) - Vladimir Shutyuk
首先,当文件路径包含空格时,for循环不准确。其次,“sips -m…”不是幂等的,这意味着再次运行时,转换后的图像将再次被修改。 - DawnSong

8
受到Ignacio的启发,我已经能够使用以下脚本将所有的AdobeRGB1998图像转换为sRGB图像。
安装imagemagick。
brew update
brew install imagemagick --with-little-cms --with-little-cms2

查找图像并将其转换为sRGB配置文件

cd path>to>Images.xcassets>folder
find . -name '*.png' -exec convert "{}" \
-profile    "/System/Library/ColorSync/Profiles/AdobeRGB1998.icc" \
-profile "/System/Library/ColorSync/Profiles/sRGB Profile.icc" \
"{}"  \;

如果您的Mac电脑上没有AdobeRGB1988.icc文件,请考虑从这里下载AdobeRGB1998文件: https://www.adobe.com/support/downloads/iccprofiles/iccprofiles_mac.html https://www.adobe.com/digitalimag/adobergb.html

4
尝试将部署目标设为iOS 8.2,对我来说有效。根据Apple的说法,“您需要将目标操作系统版本降回到8.2。这里有多个问题。您所看到的一个问题是:使用部署目标为8.3或8.4生成的Assets.car文件错误地包含了一个键,这会使iTC验证失败。与此同时,这与可能存在于父应用程序中的扩展(存在另一个问题)无关。

尽管如此,随着iOS10即将上线,我们建议将您的部署目标移动到9.x。


这就是解决我的问题的方法。所以,如果你可以将开发目标降回到8.2,一定要这样做! - Form

1
使用以下命令安装ImageMagick:
brew update
brew install imagemagick --with-little-cms --with-little-cms2

现在,请按照以下步骤检查项目中使用的16个深度资产:
1) Change the extension of .ipa to .zip. 

2) Expand the .zip file. This will produce a Payload folder containing your .app bundle. 

3) Open a terminal and change the working directory to the top level of your .app bundle cd path/to/Payload/your.app

4) find . -name "*.png" -print0 | xargs -0 identify | grep "16-bit" | awk '{print $1;}' | xargs mogrify -depth 8

  this command will show you corrupted images. Replace these images with 8 depth images.

1
我已经使用@fancy步骤找到了问题图片,但是以上解决方案无法更改我的图片颜色配置。
我尝试使用ColorSync、预览等软件,但都无法更改问题图片的颜色配置。
最终,我使用convert命令成功更改了颜色配置。
convert my_image.png -profile /path/to/AdobeRGB1998.icc -profile /path/to/sRGB_v4_ICC_preference_displayclass.icc my_image.png

在此之后,在Finder > 文件 > 获取信息中显示了适当的颜色配置文件(sRGB...),最终我能够使用Application Loader上传我的应用程序。
如果您想尝试这种方法: 1)使用brew下载ImageMagick:
brew update
brew install imagemagick --with-little-cms --with-little-cms2

2) 下载颜色配置文件:

3) 执行以下命令:

convert input_image_name.ext -profile /path/to/AdobeRGB1998.icc -profile /path/to/sRGB_v4_ICC_preference_displayclass.icc output_image_name.ext

1
一旦您将图像识别为 fancy 在他/她的回复中解释的那样,您可以使用 Preview 应用程序更改颜色配置文件(在 Preview 应用程序中,转到工具 -> 分配配置文件...),从 "Adobe RGB (1998)"(或您的配置文件图像是什么)到 "sRGB IEC61966-2.1"...然后您只需将修改后的图像导入项目并重新构建即可。

1
  1. 在您的资源目录中查找具有Adobe RGB(1998)属性的图标。
  2. 用具有sRGB IEC61966-2.1属性的图标替换它。

因为需要更改为8位sRGB。


0

将所有PNG文件复制到一个文件夹中

例如,将文件夹命名为“image”并放在桌面上

然后打开终端并更改目录到您已移动照片的文件夹中

cd desktop/image

运行以下命令

sips -g all *.png >print.txt

您会发现一个名为Print.txt的文件被创建在该文件夹中(即image文件夹内)

打开它并搜索

bitsPerSample:

如果您发现旁边的数字与8不同,则说明您得到了错误的图像

在预览应用程序中打开此图像(或图像),然后将其导出为相同格式,并确保选择8位颜色深度(请注意,如果您选择多个图像,则看不到颜色深度选择,但它仍在工作)

将新图像复制并替换旧图像。

除了我之前发布的内容外,还要执行以下操作

这个步骤适用于所有照片 在预览应用程序中打开每张或所有照片 单击工具 > 调整大小 > 然后将dpi设置为72 然后单击工具 > 分配配置文件 > 然后选择通用RGB配置文件

就这样了


0

通过以下步骤解决了问题:

  1. 使用 @fancy answer 检查所有资源,确保没有 P3。
  2. 手动查看 Xcode 资源中的非 RGB 颜色空间。
  3. 将部署目标从 8.3 设置为 8.2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接