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

Lin*_*ang 85 crash ios ios9.2 xcode8

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

Kos*_*sky 55

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

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

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

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

  1. 创建一个Inspectable .ipa文件.在Xcode Organizer(Xcode-> Window-> Organizer)中,选择要检查的存档,单击"Export ...",然后选择"Export for Enterprise或Ad-Hoc Deployment".这将创建一个本地副本.适用于您的应用的ipa文件.

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

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

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

  5. 使用find工具在.app包中找到Assets.car文件,如下所示:find.-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.

  • 将部署目标降低到8.2对我有用 (4认同)
  • 在我的项目中(部署目标是8.0)没有P3资产,我仍然在应用程序上崩溃或随机在xcode 8的任何地方.所有资产都是8位/ sRGB.还有人还面临同样的问题 (3认同)
  • 这与EXC_BAD_ACCESS有什么关系? (2认同)

Ale*_*tev 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 "------------------------------"
Run Code Online (Sandbox Code Playgroud)

  • 我认为主要问题是没有人确实证实这个错误是由资产引起的. (2认同)

Evt*_*iev 16

我能够重现问题,它似乎与资产目录中的图像有关.提起Apple的一个错误(附带示例项目)

Apple Bug Reporter:28371396


小智 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 "------------------------------"
Run Code Online (Sandbox Code Playgroud)