当我使用Xcode 8 GM Seed构建我的应用程序并在iOS 9.2下面的设备或模拟器上运行时,我在应用程序启动期间或应用程序启动后几秒钟发生奇怪的EXC_BAD_ACCESS崩溃。崩溃总是发生在不同的地方(添加子视图,[UIImage imageNamed:]
,app delegate的主要方法等)。当我在iOS 9.3+或10上运行它时,我没有得到那些崩溃,当我使用Xcode 7 构建并在iOS 9.2及更低版本上运行时,我没有得到它们。有没有其他人经历类似的事情?这是Xcode 8的已知问题吗?
答案 0 :(得分:55)
查看已接受的答案https://forums.developer.apple.com/thread/60919
您可以使用Preview.app
将16位资源保存为8位资源如何解决"错误ITMS-90682:无效的捆绑包 - 资产目录 at' Payload / XXXXX / Assets.car'如果是,则不能包含16位或P3资产 应用程序支持iOS 8或更早版本。"
使用Xcode 8 GM时,如果包含16位或P3,则会发生此错误 应用提交中的资源,其目标是早于iOS的iOS版本 9.3。如果您的应用需要广泛的颜色功能,则必须将部署目标更改为iOS 9.3或更高版本。如果您的应用没有 需要广泛的颜色功能,并希望将其部署到旧版本 iOS版本然后你应该替换所有16位或P3资产 8位sRGB资产。您可以通过运行找到16位或P3资产 来自错误消息中指定的资产目录上的“assetutil” iTunes Connect。以下步骤概述了该过程:
创建一个Inspectable .ipa文件。在Xcode Organizer(Xcode-> Window-> Organizer)中,选择要检查的存档,单击 “导出...",然后选择"导出企业版或特别部署"。 这将为您的应用创建.ipa文件的本地副本。
找到.ipa文件并将其扩展名更改为.zip。
展开.zip文件。这将生成一个包含.app包的Payload文件夹。
打开终端并将工作目录更改为.app软件包的最高级别cd path / to / Payload / your.app
使用find工具查找.app包中的Assets.car文件,如下所示:find。 -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.
答案 1 :(得分: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 "------------------------------"
答案 2 :(得分:16)
我能够重现问题,它似乎与资产目录中的图像有关。 Filed a bug with Apple(附带示例项目)
Apple Bug Reporter:28371396
答案 3 :(得分: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 "------------------------------"
答案 4 :(得分:3)
答案 5 :(得分:1)
为其他遇到类似问题的人添加......
应用程序崩溃在iOS 9.0 - iOS 9.2上似乎随机/围绕Storyboard过渡/围绕设置UIImage(名称...).. 找到这个帖子:(https://forums.developer.apple.com/thread/61643)
如果你的应用程序的目标是iOS 8.4,它将在Xcode 8中的iOS 9.0 - 9.2上崩溃..与xcassets有关。将部署目标设置为8.2或更低(我使用8.0)为我修复了它。不开玩笑。最糟糕的错误。
答案 6 :(得分:0)
将项目的信息中的 iOS部署目标和所有目标设置为相同的值。
在我的情况下,我的项目设置为 iOS 9.1 ,目标设置为 iOS 8.0 ,并且在模拟器上崩溃 iOS 8.4
现在它完美无缺。
PS:再次运行之前清理项目。
答案 7 :(得分:0)
虽然问题已经得到解答,但加入的解决方案并不适用于我,因为我没有任何16b / ch资产。
我发现使用lzfse
算法压缩的资产出现问题(您可以使用assetutil
查找有关从Assets.car压缩提取信息的信息)。不幸的是,Xcode IDE不允许开发人员更改压缩算法,但是您可以通过手动编译资产并降低actool
命令中的部署目标来实现。
TL;博士;
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