当我使用Xcode 8 GM Seed构建我的应用并在设备或模拟器下的iOS 9.2上运行它时,在应用启动期间或应用启动几秒钟后,我会感到奇怪的EXC_BAD_ACCESS崩溃。崩溃总是发生在不同的位置(添加子视图[UIImage imageNamed:]
,应用程序委托的main方法等)。当我在iOS 9.3+或10上运行它时,不会出现这些崩溃;当我使用Xcode 7构建并在iOS 9.2及以下版本上运行时,我也不会崩溃。还有其他人遇到过类似的事情吗?这是Xcode 8的已知问题吗?
当我使用Xcode 8 GM Seed构建我的应用并在设备或模拟器下的iOS 9.2上运行它时,在应用启动期间或应用启动几秒钟后,我会感到奇怪的EXC_BAD_ACCESS崩溃。崩溃总是发生在不同的位置(添加子视图[UIImage imageNamed:]
,应用程序委托的main方法等)。当我在iOS 9.3+或10上运行它时,不会出现这些崩溃;当我使用Xcode 7构建并在iOS 9.2及以下版本上运行时,我也不会崩溃。还有其他人遇到过类似的事情吗?这是Xcode 8的已知问题吗?
Answers:
请参阅接受的答案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资产。以下步骤概述了该过程:
创建一个可检查的.ipa文件。在Xcode管理器(Xcode-> Window-> Organizer)中,选择要检查的档案,单击“导出...”,然后选择“为企业或临时部署导出”,这将创建的本地副本。适用于您应用的ipa文件。
找到该.ipa文件,并将其扩展名更改为.zip。
展开.zip文件。这将产生一个包含.app捆绑包的有效负载文件夹。
打开终端,将工作目录更改为.app捆绑包的顶层cd路径/to/Payload/your.app
使用查找工具在.app捆绑包中找到Assets.car文件,如下所示:find。-名称“ Assets.car”
使用assetutil工具在应用程序具有的每个Assets.car中查找任何16位或P3资产,如下所示。:
sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
检查生成的/tmp/Assets.json并查找包含“ DisplayGamut”:“ P3”及其关联的“ Name”的所有内容。这将是包含一个或多个16位或P3资产的映像集的名称。
将这些资产替换为8位/ sRGB资产,然后重建您的应用程序。
更新:如果您的部署目标设置为8.3或8.4,并且拥有资产目录,那么即使您实际上没有16位或P3资产,您也会收到此错误消息。在这种情况下,您要么需要将部署目标降低到8.2,要么将其升级到9.x。
我希望这个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 "------------------------------"
我能够重现该问题,它似乎确实与资产目录中的图像有关。向苹果提起错误(附带示例项目)
苹果错误记者:28371396
编辑脚本以将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 "------------------------------"
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位
为其他有类似问题的人添加...
应用在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)可以修复该问题。别开玩笑了。有史以来最严重的错误。
在信息中设置iOS部署目标项目和所有的目标,以相同的值。
在我的情况下,我的项目设置为iOS 9.1,目标设置为iOS 8.0,并且在使用iOS 8.4的Simulator上崩溃
现在,它运行良好。
PS .:清理项目,然后再次运行。
尽管问题已经得到解答,但由于我没有任何16b / ch资产,因此采用的解决方案对我不起作用。
我发现使用lzfse
算法压缩的资产出现了问题(您可以使用来找到有关从Assets.car提取信息的压缩的信息assetutil
。不幸的是,Xcode IDE不允许开发人员更改压缩算法,但是您可以通过手动编译资产并降低部署目标来实现。actool
命令中的。
tl; dr;
ipa
示例命令:
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