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


85

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


首先,重置模拟器的内容。然后再试一次。
Mehul's

3
您能解决您的问题吗?我们也有。
animaonline

您能否在bugreport.apple.com上提交新的错误,并附加示例项目和崩溃日志,以便我们进行调查?
奎因·泰勒

@QuinnTaylor-我已在bugreport.apple.com#28371提交了一个附加项目的错误报告(在模拟器中为我复制了100%)。感谢您对此进行调查!
Evtim Georgiev

3
@EvtimGeorgiev谢谢!它是与P3 .png图像有关的iOS错误的重复,应该在今天发布的Xcode 8.1 beta中包含的iOS 10.1 beta SDK中进行修复。您可以尝试使用它进行构建吗?
奎因·泰勒

Answers:


55

请参阅接受的答案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资产,则会发生此错误。如果您的应用程序需要多种颜色功能,则必须将Deployment Target更改为iOS 9.3或更高版本。如果您的应用不需要广泛的色彩功能,并且希望将其部署到较旧的iOS版本,则应将所有16位或P3资源替换为8位sRGB资源。通过在iTunes Connect的错误消息中命名的资产目录上运行“ assetutil”,可以找到16位或P3资产。以下步骤概述了该过程:

  1. 创建一个可检查的.ipa文件。在Xcode管理器(Xcode-> Window-> Organizer)中,选择要检查的档案,单击“导出...”,然后选择“为企业或临时部署导出”,这将创建的本地副本。适用于您应用的ipa文件。

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

  3. 展开.zip文件。这将产生一个包含.app捆绑包的有效负载文件夹。

  4. 打开终端,将工作目录更改为.app捆绑包的顶层cd路径/to/Payload/your.app

  5. 使用查找工具在.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. 将这些资产替换为8位/ sRGB资产,然后重建您的应用程序。

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


2
这与EXC_BAD_ACCESS有什么关系?
animaonline

1
请不要重复答案。而是将问题标记为重复项。
2016年

谢谢你,兄弟!您用这个答案为我节省了很多时间!)
Thorax

3
在我的项目(部署目标为8.0)中,仍然没有P3资产,我在应用程序上崩溃或使用xcode 8在任何地方随机崩溃。所有资产均为8位/ sRGB。有人还会面对同样的问题

@Ankit我们面临着同样的问题。您找到解决方案了吗?
罗曼·特鲁巴

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 "------------------------------"

我们的资产不包含任何有缺陷的图像,但是我们仍然遇到这些错误。
animaonline's

@animaonline,如果应用程序确实包含16位或P3资产,则有帮助。
Aleksandr Terentev '16

2
我认为主要问题在于,实际上没有人确认此错误是由资产引起的。
animaonline's

刚开始工作,但后来却没有,它只是不会在同一个地方崩溃
CiNN 16'9

1
该脚本对我不起作用,但是使用ImageOptim可以
deej


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 "------------------------------"

1
该脚本稍微准确一些。Спасибо,Никита。
10/19

1
这就像一个魅力。简单但有效的脚本。对于不知道如何运行此脚本的用户。步骤:1)将该脚本放入txt文件中,并将其重命名为AssetsScript.sh 2)转到包含文件夹的Images.xcassets并保留脚本文件3)在命令行中转到到脚本文件所在的文件夹4)将脚本文件权限更改为可执行文件(chmod 755 AssetsScript.sh)5)在命令行本身(./AssetsScript.sh Images.xcassets)中,使用directoryName作为参数执行脚本文件。Boom会将所有资产转换为所需格式并完成。应用程序现在可以正常工作。
Srivathsa '16

在一行中,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)只会将16位图像转换为8位
DawnSong

3

同样的问题。

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

在xcode中


1
你什么意思?你能详细说明吗?
animaonline

1
在具有Xcode 8和Swift 3的设备上调试时,显示具有Adobe RGB(1998)色彩空间的图像对我来说是可行的,但在iOS 9上没有发布。更改色彩空间使其可以工作。
安德鲁

1

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

应用在iOS 9.0-iOS 9.2上崩溃,似乎是随机的/在Storyboard过渡周围/在设置UIImage(name ...)周围。.发现此线程:(https://forums.developer.apple.com/thread/61643

如果您的应用程序针对iOS 8.4,则它将在Xcode 8中的iOS 9.0-9.2上崩溃。与xcassets有关。将部署目标设置为8.2或更低(我使用8.0)可以修复该问题。别开玩笑了。有史以来最严重的错误。


你好 救命!我正在经历这样的事情,只有在AppStore中除外。当我直接在具有iOS 9.2.1的iPhone上构建应用程序时,它不会崩溃,也不会在模拟器上崩溃,但是当我从AppStore下载完全相同的版本/内部版本时,它确实崩溃了。您也是这种情况吗?
性病

@Sti不,它在调试版本中崩溃。在覆盖旧版本时,您是否正在使用核心数据或其他可能有问题的数据?只是一个想法。
karnett

好主意,是的,我在应用程序的某些部分中使用了核心数据。但是经过大量测试,我很确定这与之无关。核心数据与我的图像无关,并且几乎所有来自崩溃报告系统的堆栈跟踪都表明UIImage(imageNamed :)是坏人。哦,它也发生在全新安装上。最近两天发生了7,000多次崩溃,仅影响到9.0.2到9.2.1的iOS。不是iOS 9.3或更高版本。现在构建它时不会发生。只有AppStore。不可能调试。我刚才向Apple发送了一张TSI机票。
Sti

哦 那是一个糊涂。只是又有一个想法。应用商店版本使用的是哪个版本的Swift?我想我在Swift 2.2或2.3中经历过。不是Swift3。我想您正在使用Swift 3进行构建,并且无法复制它吗?
karnett

不,但是您说的很有趣!我们在App Store上拥有此应用已有很长时间了。App Store上的先前版本是用Swift 2.3编写的,没有遇到此错误。在App Store中这个新版本是我上传的前几天(就是那个崩溃)有极少数的,但是非常大的变化,包括被转换成斯威夫特3.另外值得一提的变化是增加了一个小部件专为iOS的10
性病

0

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

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

现在,它运行良好。

PS .:清理项目,然后再次运行。


0

尽管问题已经得到解答,但由于我没有任何16b / ch资产,因此采用的解决方案对我不起作用。

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

tl; dr;

  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. 辞职
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.