iOS 9.x assets 导致的奔溃问题
2018-09-17 本文已影响18人
Show_Perry
问题描述:上周新上传的版本在
奔溃机型分布Bug
收集中发现有几个地方出现很多次奔溃问题,问题都集中在iOS 9.x中
奔溃的几个地方都有这些关键信息:
CoreUI -[CUIStructuredThemeStore _canGetRenditionWithKey:isFPO:lookForSubstitutions:] + 360
7 CoreUI +[CUICatalog _resolvedRenditionKeyFromThemeRef:withBaseKey:scaleFactor:deviceIdiom:deviceSubtype:sizeClassHorizontal:sizeClassVertical:memoryClass:graphicsClass:graphicsFallBackOrder:] + 1204
8 CoreUI -[CUICatalog namedLookupWithName:scaleFactor:deviceIdiom:deviceSubtype:sizeClassHorizontal:sizeClassVertical:] + 148
9 UIKit ___98-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:]_block_invoke + 424
10 UIKit -[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:] + 212
11 UIKit -[_UIAssetManager imageNamed:withTrait:] + 528
12 UIKit __UIImageWithNameAndTraitCollection + 96
13 UIKit +[UIImage(UIImagePrivate) _kitImageNamed:withTrait:
奔溃信息很明确是图片加载出了问题,找到对应地点查看相关图片简介后发现其格式如下所示:
而正常图片简介格式是这样的:
知道问题所在就好解决了,但是害怕工程中其他图片也会出现类似问题,所以需要全局检索一遍,但是总不能一张一张去check
吧,Google
找了下类似问题,stackoverflow
中还真有解决方案,步骤:
- 导出应用
ipa
安装包。 - 解压
ipa
包并进入Payload
文件夹。 - 打开终端进入
Payload
文件夹,并检索Assets.car
. -
assetutil
命令导出图片的信息存储到Assets.json
文件中.
sudo xcrun --sdk iphoneos assetutil --info ./xxxx.app/Assets.car > ./Assets.json
- 打开上面生成的
json
文件并检索含有"DisplayGamut" : "P3"
和"Encoding" : "ARGB-16"
,的内容。这个对应的Name
就是出现问题的图片了。
例如:
{
"AssetType" : "Image",
"BitsPerComponent" : 16,
"ColorModel" : "RGB",
"Colorspace" : "extended srgb",
"Compression" : "lzvn",
"DisplayGamut" : "P3",
"Encoding" : "ARGB-16",
"Idiom" : "universal",
"Image Type" : "kCoreThemeOnePartScale",
"Name" : "Scan_Remind1",
"Opaque" : false,
"PixelHeight" : 84,
"PixelWidth" : 244,
"RenditionName" : "RemindWiFi1.png",
"Scale" : 1,
"SizeOnDisk" : 19571
}
找出所有有问题的图片后,让UI设计人员重新给出图片。
Stackoverflow 也介绍使用脚本修改的:
- 脚本1
#!/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
#!/bin/sh
files=`find . -name "*.png"`
for i in ${files[@]}; do
SOURCE_FILE=${i}
DESTINATION_FILE=$SOURCE_FILE
sips \
--matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc' \
"$SOURCE_FILE" \
--out "$DESTINATION_FILE"
done
exit 0