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

时间:2016-09-09 05:15:49

标签: ios crash xcode8 ios9.2

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

8 个答案:

答案 0 :(得分:55)

查看已接受的答案https://forums.developer.apple.com/thread/60919

您可以使用Preview.app

将16位资源保存为8位资源
  

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

     

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

     
      
  1. 创建一个Inspectable .ipa文件。在Xcode Organizer(Xcode-> Window-> Organizer)中,选择要检查的存档,单击   “导出...",然后选择"导出企业版或特别部署"。   这将为您的应用创建.ipa文件的本地副本。

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

  4.   
  5. 展开.zip文件。这将生成一个包含.app包的Payload文件夹。

  6.   
  7. 打开终端并将工作目录更改为.app软件包的最高级别cd path / to / Payload / your.app

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

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

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

  14.   
  15. 用8位/ sRGB资产替换这些资产,然后重建您的应用。

  16.         

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

答案 1 :(得分:32)

我希望这个bash脚本可以帮到你。 输入参数是包含项目的所有xcassets的目录。 此脚本将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 "------------------------------"

答案 2 :(得分:16)

我能够重现问题,它似乎与资产目录中的图像有关。 Filed a bug with Apple(附带示例项目)

Apple Bug Reporter:28371396

答案 3 :(得分: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 "------------------------------"

答案 4 :(得分:3)

同样的问题。

我不确定这是不是错误,但这是我的解决方案:确保没有Adobe RGB(1998)色彩空间的图像资源

in xcode

答案 5 :(得分:1)

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

应用程序崩溃在iOS 9.0 - iOS 9.2上似乎随机/围绕Storyboard过渡/围绕设置UIImage(名称...).. 找到这个帖子:(https://forums.developer.apple.com/thread/61643

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

答案 6 :(得分:0)

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

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

现在它完美无缺。

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

答案 7 :(得分:0)

虽然问题已经得到解答,但加入的解决方案并不适用于我,因为我没有任何16b / ch资产。

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

TL;博士;

  1. 存档
  2. 解压缩ipa
  3. 编译资产 - 您可以通过检查Xcode report navigator
  4. 中的存档日志,找到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. Resign