关于CUIStructuredThemeStore renditionWithKey:usingKeySignature:和UIImage(named: imagestr)的崩溃

68 篇文章 1 订阅

今天在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脚本,运行之后,输入项目所在的位置。回车
再打包编译即可

参考文章
参考文章
参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WMSmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值