86

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

4

8 回答 8

56

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

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

如何解决“错误 ITMS-90682:无效的捆绑包 - 如果应用支持 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

  5. 使用查找工具在您的 .app 包中查找 Assets.car 文件,如下所示:-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”及其关联的“名称”。这将是包含一个或多个 16 位或 P3 资产的图像集的名称。

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

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

于 2016-09-12T15:25:36.807 回答
32

我希望这个 bash 脚本可以帮助你。输入参数是包含项目所有 xcasset 的目录。此脚本会将 sRGB 配置文件设置为所有 png。它帮助了我:)

#!/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 "------------------------------"
于 2016-09-19T10:29:59.270 回答
16

我能够重现该问题,并且它似乎与资产目录中的图像有关。向 Apple 提交了一个错误(附有示例项目)

苹果漏洞报告者:28371396

于 2016-09-19T21:13:14.197 回答
13

编辑脚本以将 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 "------------------------------"
于 2016-10-13T11:34:50.613 回答
3

同样的问题。

我不确定这是否是一个错误,但这是我的解决方案:确保您的图像资产没有 Adob​​e RGB (1998) 色彩空间

在 xcode 中

于 2016-09-09T14:41:16.380 回答
1

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

应用程序在 iOS 9.0 - iOS 9.2 上似乎是随机的/围绕故事板转换/围绕设置 UIImage(name...).. 发现这个线程:(https://forums.developer.apple.com/thread/61643 )

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

于 2016-10-17T21:02:11.537 回答
0

尽管已经回答了问题,但接受的解决方案对我不起作用,因为我没有任何 16b/ch 资产。

我发现使用算法压缩的资产出现了该问题lzfse(您可以找到有关从 Assets.car using 压缩提取信息的信息assetutil)。不幸的是,Xcode IDE 不允许开发人员更改压缩算法,但是您可以通过手动编译资产并降低actool命令中的部署目标来做到这一点。

tl;博士;

  1. 档案
  2. 解压ipa
  3. 编译资产 - 您可以通过在Xcode 报告导航器中检查存档日志来找到由 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. 辞职
于 2017-09-18T12:42:02.023 回答
0

将项目的Info中的iOS 部署目标和所有目标设置为相同的值。

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

现在它工作得很好。

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

于 2016-09-27T16:25:07.137 回答