iOS 9.x assets 导致的奔溃问题

问题描述:上周新上传的版本在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中还真有解决方案,步骤:

  1. 导出应用ipa安装包。
  2. 解压ipa包并进入Payload文件夹。
  3. 打开终端进入Payload文件夹,并检索Assets.car.
  4. assetutil 命令导出图片的信息存储到Assets.json文件中.
sudo xcrun --sdk iphoneos assetutil --info ./xxxx.app/Assets.car > ./Assets.json
  1. 打开上面生成的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

苹果
Stackoverflow参考一
Stackoverflow参考二

推荐阅读更多精彩内容