当我使用 Xcode 8 GM Seed 构建我的应用程序并在低于设备或模拟器的 iOS 9.2 上运行它时,在应用程序启动期间或应用程序启动后几秒钟,我会遇到奇怪的 EXC_BAD_ACCESS 崩溃。崩溃总是发生在不同的地方(添加子视图[UIImage imageNamed:]
、应用程序委托的主要方法等)。当我在 iOS 9.3+ 或 10 上运行它时,我没有遇到这些崩溃,当我使用 Xcode 7构建并在 iOS 9.2 及更低版本上运行时,我也没有遇到这些崩溃。有没有其他人经历过类似的事情?这是 Xcode 8 的一个已知问题吗?
8 回答
请参阅已接受的答案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 资产,则会出现此错误。如果您的应用需要广色域功能,您必须将您的部署目标更改为 iOS 9.3 或更高版本。如果您的应用不需要广色域功能并且您希望将其部署到较旧的 iOS 版本,那么您应该将所有 16 位或 P3 资源替换为 8 位 sRGB 资源。您可以通过在来自 iTunes Connect 的错误消息中命名的资产目录上运行“assetutil”来查找 16 位或 P3 资产。以下步骤概述了该过程:
创建一个可检查的 .ipa 文件。在 Xcode Organizer(Xcode->Window->Organizer)中,选择要检查的存档,单击“Export...”,然后选择“Export for Enterprise or Ad-Hoc Deployment”。这将创建 .应用程序的 ipa 文件。
找到该 .ipa 文件并将其扩展名更改为 .zip。
展开 .zip 文件。这将生成一个包含您的 .app 包的 Payload 文件夹。
打开终端并将工作目录更改为 .app 包的顶层 cd path/to/Payload/your.app
使用查找工具在您的 .app 包中查找 Assets.car 文件,如下所示:-name '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”及其关联的“名称”。这将是包含一个或多个 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 "------------------------------"
我能够重现该问题,并且它似乎与资产目录中的图像有关。向 Apple 提交了一个错误(附有示例项目)
苹果漏洞报告者: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 "------------------------------"
为其他有类似问题的人添加...
应用程序在 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)为我修复了它。不开玩笑。有史以来最糟糕的错误。
尽管已经回答了问题,但接受的解决方案对我不起作用,因为我没有任何 16b/ch 资产。
我发现使用算法压缩的资产出现了该问题lzfse
(您可以找到有关从 Assets.car using 压缩提取信息的信息assetutil
)。不幸的是,Xcode IDE 不允许开发人员更改压缩算法,但是您可以通过手动编译资产并降低actool
命令中的部署目标来做到这一点。
tl;博士;
- 档案
- 解压
ipa
- 编译资产 - 您可以通过在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
- 压缩它。
- 辞职
将项目的Info中的iOS 部署目标和所有目标设置为相同的值。
在我的情况下,我的项目设置为iOS 9.1,目标设置为iOS 8.0 ,并且在使用iOS 8.4的模拟器上崩溃
现在它工作得很好。
PS.:在再次运行之前清理项目。