如果应用支持 iOS 8 或更早版本,Assets.car 不能包含 16 位或 P3 资产?

Posted

技术标签:

【中文标题】如果应用支持 iOS 8 或更早版本,Assets.car 不能包含 16 位或 P3 资产?【英文标题】:Assets.car can't contain 16-bit or P3 assets if the app supports iOS 8 or earlier? 【发布时间】:2017-01-06 19:17:53 【问题描述】:

有没有人在上传到 iTunesConnect 时遇到此错误。上传过程到“使用 iTunes 商店验证资产”时出现以下错误:

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

【问题讨论】:

请不要上传文本错误信息的图片。只需在此处引用文本,格式正确。 【参考方案1】:

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

第 1 部分将解释如何找出哪些图片是违规的。

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

第 1 部分:识别违规图片:

Apple 开发者论坛对此有一个主题: https://forums.developer.apple.com/thread/60919

接受的解决方案如下:

如何解决“错误 ITMS-90682: Invalid Bundle - 如果应用支持 iOS 8 或更早版本,'Payload/XXXXX/Assets.car' 的资产目录不能包含 16 位或 P3 资产。”

对于 Xcode 8 GM,如果您在针对 iOS 9.3 之前的 iOS 版本的应用提交中包含 16 位或 P3 资产,则会出现此错误。如果您的应用需要广色域功能,您必须将您的部署目标更改为 iOS 9.3 或更高版本。如果您的应用不需要广色域功能,并且您希望将其部署到较旧的 iOS 版本,那么您应该将所有 16 位或 P3 资源替换为 8 位 sRGB 资源。

您可以通过在来自 iTunes Connect 的错误消息中命名的资产目录上运行“assetutil”来查找 16 位或 P3 资产。以下步骤概述了该过程: 1. 创建一个可检查的 .ipa 文件。在 Xcode Organizer(Xcode->Window->Organizer)中,选择要检查的存档,单击“Export...”,然后选择“Export for Enterprise or Ad-Hoc Deployment”。这将创建 .应用程序的 ipa 文件。 2. 找到该 .ipa 文件并将其扩展名更改为 .zip。 3. 展开 .zip 文件。这将生成一个包含您的 .app 包的 Payload 文件夹。 4. 打开终端并将工作目录更改为 .app 包的顶层 cd path/to/Payload/your.app

    使用查找工具在您的 .app 包中查找 Assets.car 文件,如下所示: 找 。 -name 'Assets.car'

    使用assetutil 工具在您的应用程序具有的每个Assets.car 中查找任何16 位或P3 资产,如下所示。 : sudo xcrun --sdk iphoneosassetutil --info /path/to/a/Assets.car > /tmp/Assets.json

    检查生成的 /tmp/Assets.json 并查找包含“DisplayGamut”的任何内容:“P3”及其关联的“名称”。这将是包含一个或多个 16 位或 P3 资产的图像集的名称。

    将这些资源替换为 8 位/sRGB 资源,然后重新构建您的应用。

第 2 部分:调整图像的颜色配置文件以与 iTunesConnect 配合使用

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

我不知道哪些配置文件正确,哪些不是,但我的“Adobe RGB (1998)”肯定被拒绝了。 所以我使用了“颜色同步实用程序”(OSX 自带)。 (右击图片,打开方式...)

现在您可以在底部指定不同的颜色配置文件:

现在,如果您再次检查图像,它应该如下所示:

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

【讨论】:

DELL-something...色彩空间也是一个问题。 对我们来说,每英寸 150 像素但为 8 位图像的图像会导致相同的错误消息,即使它相当具有误导性。这导致图像被称为每个样本图像 16 位,即使我将它们创建为每个像素 8 位。 JSON 将它们显示为 16 位,编码为 ARGB-16,这不是我保存它们的方式,也不是预览显示它们的方式。这就是问题所在 根据 ColorSync Utility 应用程序的用户指南,分配配置文件只是将 sRGB 配置文件嵌入到图像中,实际上并没有修改图像。如果您想修改图像,“匹配到配置文件”或“应用配置文件”就是您想要的。所以我认为你做的不对。【参考方案2】:

感谢@fancy 的回答,我了解到问题出在图像的属性“空间”中,其值为 RGB 16 位。需要改成8bit sRGB。我必须支持 iOS7 客户端,所以我不能只将部署目标更改为 9.3。

所以我做了什么: 1)我使用简单的脚本(见下文)递归查找所有 *.png 图像并更改属性。 2)然后我重建了 .ipa 文件。应用程序加载器没有显示任何错误。

#!/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

【讨论】:

脚本运行良好,只需将其放在 Assets 文件夹中并执行即可 脚本效果很好。还必须使用 "files=find . -name "*.jpg"" 和 "files=find . -name "*.jpeg" 运行它,以确保正确设置所有图像文件。 很好的解决方案。非常感谢! 太棒了。如果有人不熟悉 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(运行它) 首先,文件路径包含空格时for循环不准确。其次,sips -m ... 不是幂等的,也就是说再次运行时,转换后的图像会被再次修改。【参考方案3】:

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

考虑在这里下载 Adob​​eRGB1998 https://www.adobe.com/support/downloads/iccprofiles/iccprofiles_mac.html https://www.adobe.com/digitalimag/adobergb.html

【讨论】:

【参考方案4】:

尝试部署目标 iOS 8.2 对我有用。 根据苹果 “您需要将目标操作系统移回 8.2。这里存在多个问题。您看到的是使用 8.3 或 8.4 的部署目标生成的 Assets.car 错误地包含了一个会跳闸的密钥iTC 验证。这与父应用中可能存在或不存在的扩展无关(存在单独的问题)。

话虽如此,随着 iOS 10 即将上线,我们的建议是将您的部署目标移至 9.x。”

【讨论】:

这就是为我做的。因此,如果您有能力将开发目标降回 8.2,那么一定要这样做!【参考方案5】:

我使用@fancy 步骤找到了有问题的图像,但我无法使用上述解决方案更改图像的颜色配置文件。

我已尝试使用 ColorSync、Preview,但无法更改违规图像的颜色配置文件。

最后我可以使用 convert 命令更改颜色配置文件。

convert my_image.png -profile /path/to/AdobeRGB1998.icc -profile /path/to/sRGB_v4_ICC_preference_displayclass.icc my_image.png

在此之后,在 Finder > File > Get Info 上显示了适用的颜色配置文件 (sRGB...),最后我能够使用 Application Loader 上传我的应用程序。

如果你想试试这个方法:

1) 使用 brew 下载 ImageMagick:

brew update
brew install imagemagick --with-little-cms --with-little-cms2

2) 下载颜色配置文件:

AdobeRGB1998 > https://www.adobe.com/digitalimag/adobergb.html sRGB_v4_ICC_preference_displayclass.icc > http://www.color.org/srgbprofiles.xalter

3) 执行以下命令:

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

【讨论】:

【参考方案6】:
    在您的资产目录中查找具有 Adob​​e RGB (1998) 属性的图标。 将其替换为具有属性 sRGB IEC61966-2.1 的图标

因为需要改成8bit sRGB

【讨论】:

【参考方案7】:

一旦您按照他/她的回复中的解释确定图像,您可以使用预览应用程序从“Adobe RGB (1998) 更改颜色配置文件(在预览应用程序中,转到工具 -> 分配配置文件...) )”(或您的个人资料图像)转换为“sRGB IEC61966-2.1”...然后您只需在项目中导入修改后的图像并重建它。

【讨论】:

【参考方案8】:

使用这些命令安装 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.

【讨论】:

【参考方案9】:

如果您需要临时解决问题,只需将其最低开发目标提高到 iOS 9.0 即可解决此问题。

【讨论】:

还要检查“部署信息”下的目标部署目标(不仅是“项目”部署目标) 请确保您在应用程序中使用的所有图像资源都必须支持 8 位。转到资产目录选择资产并在 Adob​​e Photoshop 中打开 --> 选择图像 --> 选择模式 --> 如果其 16 位将其更改为 8 位 --> 保存图像并继续【参考方案10】:

能够使用 ff 步骤解决:

    使用@fancy answer仔细检查了我的所有资产并确保没有 P3。 手动查看 Xcode 资源中的非 RGB 颜色空间。 将部署目标从 8.3 设置为 8.2

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

在文件夹中收集所有 PNG 的副本

例如。命名文件夹图像并将其放在桌面上

然后转到终端并将目录更改为您将照片移入的文件夹

cd 桌面/图像

运行这个

sips -g all *.png >print.txt

您会发现文件夹中创建了一个名为 Print.txt 的文件(内图)

打开它并在其中搜索

bitsPerSample:

如果你发现它旁边的数字不是 8,那么你得到了错误的图像

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

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

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

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

就是这样

【讨论】:

【参考方案13】:

通过终端一个命令修复:

find . -type f -name '*.png' -print0 | while IFS= read -r -d '' file; do sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc' "$file" --out "$file"; done

【讨论】:

【参考方案14】:

我的答案很简单,找到 16 位彩色图像并转换为 8 位深度彩色图像。如果不是 16 位,则不会再次转换,因为sips -m ... 不是幂等,这意味着转换后的图像在同一个图像文件上再次执行时会再次被修改。

# before run the commands, cd to the folder which includes all suspicious images.
while IFS= read -d '' -r file; do if [ $(file "$file" | grep -c '16-bit') -eq 1 ]; then sips -m '/System/Library/Colorsync/Profiles/sRGB Profile.icc' "$file"; fi done < <(find . -print0)

再清楚一点,保存为bash shell文件如下,

#/bin/bash

# Before run the shell script, 
# cd to the folder which includes all suspicious images

while IFS= read -d '' -r file; do 
  if [ $(file "$file" | grep -c '16-bit') -eq 1 ]; then
    sips -m '/System/Library/Colorsync/Profiles/sRGB Profile.icc' "$file"; 
  fi 
done < <(find . -print0)

【讨论】:

以上是关于如果应用支持 iOS 8 或更早版本,Assets.car 不能包含 16 位或 P3 资产?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CarPlay 框架的 CarPlay 应用在 iOS 13 或更早版本上崩溃

为 iOS 6 或更早版本构建的应用程序能否在 iOS 7 上正常运行?

gcc 4.8 或更早版本对正则表达式有问题吗?

gcc 4.8 或更早版本对正则表达式有问题吗?

08001 - SQL Server Native Client 11.0 不支持连接到SQL Server 2000或更早的版本。

如果浏览器不是 Internet Explorer 9 或更高版本,则显示一条消息