【问题标题】:Xcode 8 build crash on iOS 9.2 and belowXcode 8 在 iOS 9.2 及更低版本上构建崩溃
【发布时间】:2017-01-17 04:11:01
【问题描述】:

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

【问题讨论】:

  • 首先,重置模拟器的内容。然后再试一次。
  • 您能解决您的问题吗?我们也有。
  • 您能否在 bugreport.apple.com 上提交一个新错误,并附上示例项目和崩溃日志以便我们进行调查?
  • @QuinnTaylor - 我已在 bugreport.apple.com #28371396 提交了一份带有附加项目的错误报告(在模拟器中为我 100% 复制)。感谢您对此进行调查!
  • @EvtimGeorgiev 谢谢!它是与 P3 .png 图像相关的 iOS 错误的副本,应该在今天发布的 Xcode 8.1 beta 中包含的 iOS 10.1 beta SDK 中修复。你可以尝试用它来构建吗?

标签: ios crash xcode8 ios9.2


【解决方案1】:

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

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

如何解决“错误 ITMS-90682:无效的捆绑包 - 资产目录 在“Payload/XXXXX/Assets.car”中,如果 应用支持 iOS 8 或更早版本。”

使用 Xcode 8 GM,如果您包含 16 位或 P3,则会出现此错误 应用程序提交中针对 iOS 版本早于 iOS 的资产 9.3.如果您的应用需要广色域功能,您必须将您的部署目标更改为 iOS 9.3 或更高版本。如果您的应用没有 需要广泛的颜色功能,并且您希望将其部署到较旧的 iOS 版本,那么您应该将所有 16 位或 P3 资产替换为 8 位 sRGB 资源。您可以通过运行找到 16 位或 P3 资产 错误消息中命名的资产目录上的“assetutil”来自 iTunes 连接。以下步骤概述了该过程:

  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。

【讨论】:

  • 这与 EXC_BAD_ACCESS 有什么关系?
  • 请不要重复答案。相反,将问题标记为重复问题。
  • 谢谢你!你用这个答案为我节省了大量时间! )
  • 在我的项目中(部署目标是 8.0),仍然没有 P3 资产,我仍然在应用程序上崩溃,或者在任何使用 xcode 8 的地方随机崩溃。所有资产都是 8 位/sRGB。有没有人仍然面临同样的问题
  • @Ankit 我们面临同样的问题。你找到解决办法了吗?
【解决方案2】:

我希望这个 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,如果应用程序确实包含 16 位或 P3 资产,它会有所帮助。
  • 我认为主要的问题是没有人真正确认这个错误是由资产引起的。
  • 一开始工作,但后来没有,它只是不会在同一个地方崩溃
  • 该脚本对我不起作用,但使用 ImageOptim 可以
【解决方案3】:

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

Apple 错误报告者:28371396

【讨论】:

  • 我无法下载示例项目。你能分享项目来重现崩溃吗
  • 谢谢。与资产目录相关的问题,只需将颜色空间从 Adob​​e RGB (1998) 更改为 sRGB。
【解决方案4】:

编辑脚本以将 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)将此脚本放入 txt 文件并将其重命名为 AssetsScript.sh 2)转到 Images.xcassets 封闭文件夹并保留脚本文件 3)在命令行中转到到您的脚本文件所在的文件夹 4) 将脚本文件权限更改为可执行文件 (chmod 755 AssetsScript.sh) 5) 在命令行本身 (./AssetsScript.sh Images.xcassets) 中使用 directoryName 作为参数执行脚本文件。繁荣这将您的所有资产转换为所需的格式并完成。应用程序现在可以正常工作了。
  • 一行,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 &lt; &lt;(find . -print0),将16位图像转换为8位
【解决方案5】:

同样的问题。

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

in xcode

【讨论】:

  • 什么意思?你能详细说明一下吗?
  • 显示具有 Adob​​e RGB (1998) 颜色空间的图像在使用 Xcode 8 和 Swift 3 的设备上进行调试时对我有用,但在 iOS 9 上没有发布。更改颜色空间使其成功工作。
【解决方案6】:

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

应用程序在 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)为我修复了它。不开玩笑。有史以来最糟糕的错误。

【讨论】:

  • 嗨。帮助!我正在经历类似的事情,除了仅在 AppStore 中。当我直接在装有 iOS 9.2.1 的 iPhone 上构建我的应用程序时,它不会崩溃,也不会在模拟器上崩溃,但是当我从 AppStore 下载完全相同的版本/构建时,它确实会崩溃。你也是这样吗?
  • @Sti 不,它在调试版本中崩溃了。您是否使用核心数据或其他在覆盖旧版本时可能出现问题的东西?只是一个想法。
  • 好主意,是的,我在应用程序的某些部分使用核心数据。但是经过大量测试后,我很确定这与此无关。核心数据与我的图像无关,而且我的崩溃报告系统中的几乎所有堆栈跟踪都表明 UIImage(imageNamed:) 是坏人。哦,它也发生在全新安装上。过去两天超过 7000 次崩溃,仅影响 iOS 9.0.2 到 9.2.1.. 不影响 iOS 9.3 或更高版本.. 太奇怪了。当我现在构建它时不会发生。只有应用商店。无法调试。我刚刚向 Apple 发送了 TSI-ticket。
  • 哦。那是一个粘糊糊的。刚刚有了另一个想法.. 应用商店版本使用的是什么版本的 Swift?我想我在 Swift 2.2 或 2.3 中经历过这种情况。不是 Swift 3。我想您现在正在使用 Swift 3 构建并且无法重现它?
  • 不,但你这么说很有趣!我们在 App Store 上已经有这个应用程序很长时间了。 App Store 上的早期版本是用 Swift 2.3 编写的,没有遇到这个错误。我几天前在 App Store 上上传的这个新版本(崩溃的那个)有很少但非常大的变化,包括转换为 Swift 3。另一个值得一提的变化是添加了一个专门用于 iOS 10 的小部件。跨度>
【解决方案7】:

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

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

现在它运行良好。

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

【讨论】:

    【解决方案8】:

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

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

    tl;博士;

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

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多