Xcode 8在iOS 9.2及更低版本上构build崩溃

当我使用Xcode 8 GM Seed构build我的应用程序,并在设备或模拟器下面的iOS 9.2上运行应用程序时,在应用程序启动过程中或在应用程序启动后几秒钟,出现奇怪的EXC_BAD_ACCESS崩溃。 崩溃总是发生在不同的地方(添加子视图, [UIImage imageNamed:] ,应用程序委托的主要方法等)。 当我在iOS 9.3+或10上运行它时,我没有得到这些崩溃,而当我使用Xcode 7 构build并在iOS 9.2和更低版本上运行时,我没有得到它们。 有其他人有类似的经历吗? 这是Xcode 8的已知问题吗?

请参阅接受的答案https://forums.developer.apple.com/thread/60919

您可以使用Preview.app将16位资产保存为8位资产

如何解决“错误ITMS-90682:无效包 – 如果应用程序支持iOS 8或更低版本,则”Payload / XXXXX / Assets.car“的资产目录不能包含16位或P3资产。

使用Xcode 8 GM时,如果您将应用程序提交中的16位或P3资源包含在早于iOS 9.3的iOS版本中,则会发生此错误。 如果您的应用需要广泛的颜色function,则必须将您的部署目标更改为iOS 9.3或更高版本。 如果您的应用程序不需要广泛的颜色function,并且希望将其部署到较旧的iOS版本,则应该用8位sRGB资产replace所有的16位或P3资产。 您可以通过在iTunes Connect的错误消息中指定的资产目录上运行“assetutil”来find16位或P3资产。 以下步骤概述了该过程:

  1. 创build一个Inspectable .ipa文件。 在Xcode Organizer(Xcode-> Window-> Organizer)中,select要检查的档案,点击“Export …”,然后select“Export for Enterprise or Ad-Hoc Deployment”,这将创build一个本地副本。 ipa文件为您的应用程序。

  2. find.ipa文件并将其扩展名更改为.zip。

  3. 展开.zip文件。 这将产生一个包含你的.app包的Payload文件夹。

  4. 打开一个terminal,将工作目录更改为.app包cdpath/ to / Payload / your.app的顶层

  5. 使用查找工具find.app包中的Assets.car文件,如下所示:find。 名“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. 将这些资产replace为8位/ sRGB资产,然后重新构build您的应用程序。

更新:如果您的部署目标设置为8.3或8.4,并且您有资产目录,则即使您实际上没有16位或P3资产,也会收到相同的错误消息。 在这种情况下,您需要将部署目标降低到8.2,或者将其移动到9.x.

我希望这个bash脚本可以帮助你。 input参数是目录,而不是包含项目的所有xcasset。 这个脚本将sRGBconfiguration文件设置为所有的pngs。 它帮助我:)

 #!/bin/bash DIRECTORY=$1 echo "------------------------------" echo "Passed Resources with xcassets folder argument is <$DIRECTORY>" echo "------------------------------" echo "Processing asset:" XSAASSETSD="$(find "$DIRECTORY" -name '*.xcassets')" for xcasset in $XSAASSETSD do echo "---$xcasset" IMAGESETS="$(find "$xcasset" -name '*.imageset')" for imageset in $IMAGESETS do echo "------$imageset" FILES="$(find "$imageset" -name '*.png')" for file in $FILES do echo "---------$file" sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" $file --out $file done done done echo "------------------------------" echo "script successfully finished" echo "------------------------------" 

我能够重现这个问题,它似乎与资产目录中的图像有关。 苹果提交了一个bug (附带示例项目)

苹果Bug记者:28371396

编辑的脚本将png文件转换为整个项目中的正确格式,并使用空格:

 #!/bin/bash DIRECTORY=$1 echo "------------------------------" echo "Passed Resources with xcassets folder argument is <$DIRECTORY>" echo "------------------------------" echo "Processing asset:" find "$DIRECTORY" -name '*png' -print0 | while read -d $'\0' file; do echo "---------$file" sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" "$file" --out "$file" done echo "------------------------------" echo "script successfully finished" echo "------------------------------" 

同样的问题。

我不知道这是否是一个错误,但这是我的解决scheme:确保您的图像资产没有Adobe RGB(1998)色彩空间

在xcode中

为有类似问题的其他人添加…

应用程序崩溃在iOS 9.0 – iOS 9.2上似乎随机/周围故事板转换/设置UIImage(名称…)..发现此线程:( https://forums.developer.apple.com/thread/61643

如果您的应用程序的目标是iOS 8.4,它将在Xcode 8中的iOS 9.0 – 9.2上崩溃。与xcassets有关的东西。 将部署目标设置为8.2或更低(我用8.0)为我修复。 没有开玩笑 最糟糕的错误。

iOS部署目标设置为您的项目的信息 ,并将所有目标设置为相同的值。

在我的情况下,我的项目被设置为iOS 9.1 ,目标被设置为iOS 8.0 ,并在iOS 8.4的模拟器上崩溃

现在它工作完美。

PS:在再次运行之前清理项目。

虽然问题已经得到解答,但是解决scheme并不适合我,因为我没有任何16b / ch的资产。

我发现这个问题出现在使用lzfsealgorithm压缩的资产上(您可以使用assetutil从Assets.car中find关于压缩提取信息的信息)。 不幸的是,Xcode IDE不允许开发人员更改压缩algorithm,但是您可以通过手动编译资产并降低actool命令中的部署目标来actool

TL;博士;

  1. 档案
  2. 解压ipa
  3. 编译资产 – 您可以通过检查Xcode报告导航器中的存档日志来find由xcode生成的项目的资产编译器命令

示例命令:

xcrun actool --output-format human-readable-text --notices --warnings --minimum-deployment-target 8.0 --output-partial-info-plist info_partial.plist --app-icon AppIcon --launch-image LaunchImage --enable-on-demand-resources YES --sticker-pack-identifier-prefix {bundle_id}.sticker-pack --target-device iphone --target-device ipad --platform iphoneos --product-type com.apple.product-type.application --compile #{path_to_directory_containing_Assets_car} Assets/Assets.xcassets

  1. 压缩它。
  2. 辞职