今天在fabric上发现iOS9.3以下出现异常EXC_BAD_ACCESS KERN_INVALID_ADDRESS
有的出现在
self.imageView?.image = UIImage(named: imagestr);
明明取得是本地图片的地址,怎么会崩溃。
崩溃日志:
#0
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000028
0
libsystem_malloc.dylib
szone_free + 2944
2
CoreFoundation
CFRelease + 1088
3 CoreUI
-[CUIStructuredThemeStore renditionWithKey:usingKeySignature:] + 1600
4
CoreUI
-[CUICatalog _storageRefForRendition:representsODRContent:] + 104
36
UIKit
UIApplicationMain + 204
37 xxxxapp
AppDelegate.swift line 26
main
38 libdyld.dylib
start + 4
崩溃行: CUIStructuredThemeStore renditionWithKey:usingKeySignature找到了原因
原因:
如果你的图片资源文件里有16位图或者图片显示模式为P3,并且Deployment Target是iOS9.3以下的就会出现这个问题。(话说我公司的项目里面就出现了一个小按钮,导致了这次崩溃,不知道设计师是怎么弄出来的这个特殊图片…)如果你的App需要支持wide color functionality,那你就必须设置Deployment Target为iOS9.3以上。如果你的APP不需要支持wide color functionality并且你希望兼容iOS老版本,那么你需要将所有16-bit or P3 assets的图片转换为8-bit sRGB assets
苹果官display3和16位图片iOS9.3+
解决方法:定位到问题图片
1.打一个ipa包,解压你的应用的ipa包,进入到你应用的Playload文件夹。
2.用find命令定位到Assets.car文件
find . -name 'Assets.car'
3.使用 assetutil 命令导出图片的信息存储到Assets.json文件中
sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
注:/path/to/a/Assets.car改为你的Assets.car所在的位置
4.打开刚才生成的Assets.json文件,查找含有”DisplayGamut” : “P3”, “Encoding” : “ARGB-16″的内容。这个对应的Name就是出现问题的图片了。
{
"SizeClass Vertical" : "universal",
"Graphics" : "GLES2,0",
"Name" : "ianisme.com",
"Scale" : 2,
"Idiom" : "universal",
"Memory" : "512MB",
"LayoutDirection" : "0 - Horizontal",
"DisplayGamut" : "P3",
"Encoding" : "ARGB-16",
"SizeClass Horizontal" : "universal",
"Image Type" : "kCoreThemeOnePartScale",
"AssetType" : "Image",
"Subtype" : 0,
"EdgeInsets" : "top:0 left:0 bottom:0 right:0"
},
附录:
全局替换为srgb脚本
#!/bin/bash
#当前工作路径
# DIRECTORY=$(cd "$(dirname "$0")";pwd)
printf "input project filepath:"
read input
DIRECTORY=$input
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 "------------------------------"
保存为.sh脚本,运行之后,输入项目所在的位置。回车
再打包编译即可