图片如何使我们的APP崩溃

最近,我们的团队遇到了一个特例,这使我们发疯。 在我们发布新版本的应用程序之前,一切看起来都很不错。 但是在接下来的几个小时里,我发现我不断收到很多警告信,似乎出了点坏事……哦! 没有! 它们每个都是崩溃报告,并迫使我们进入“值班”模式。 这是细节…


在调查开始时,我们首先检查崩溃报告中的每个不同的调用堆栈线程。 它们都不容易解决,看起来每次崩溃都发生在代码的不同部分。 但是,它们具有与“ 自动布局”和“ 图像”相关的一些共同特征。 我们将继续检查这些报告,并找到另一个线索:这些用户正在使用iOS 9.2 ! 我认为这不是一个随机的崩溃案例。 我们改变了方式,并开始通过互联网发现相关问题。

我使用以下关键字搜索: iOS9.2, crash, FBSSerialQueue ,并在下面的链接中讨论了有关通过App Store和TestFlight发布后崩溃的信息。 它还引起我们的注意,只有通过App Store下载应用程序时才会发生此问题。

应用程序在启动时立即崩溃。.仅通过TestFlight或Store发行时在iOS9中崩溃…

我有一个iPhone应用程序,仅在通过TestFlight或App Store发布后才在iOS9设备上崩溃。

stackoverflow.com

“错误ITMS-90682:无效的捆绑软件-如果应用程序支持iOS 8或更早版本,则’Payload / XXXXX / Assets.car’上的资产目录不能包含16位或P3资产。”之前。 但是,将应用程序提交到iTunes Connect时,我们没有看到此错误。

详细信息是Apple允许开发人员在iOS 9.3版本之后使用具有16位或P3资产的扩展RGB颜色作为图像格式。 但是那些低于iOS 9.3版本的应用将导致无法预料的错误。 目前,我们知道应用程序中会发生什么。 我们重新检查代码中的每一行, 那些与AutoLayout相关的代码正在调整图像位置。 因此问题暴露了,使用iOS 9.0到9.2的用户将在打开我们的产品后立即崩溃。


我们必须调查以下两种不同的途径: 如何解决此问题? 以及如何防止它再次发生?

第一个问题很容易解决,后一个问题需要一些技巧。 我们可以回到链接并找到另一个讨论线程:

ITMS-90682:不能包含16位或P3资产…| | 苹果开发者论坛

嗨,我刚刚开始在testflight提交中看到此错误(资产没有更改)(我们有仅限iOS10的代码)…

forums.developer.apple.com

检测图像的基本概念是取消存档ipa文件,并找出Assets.car文件,我们应该将其转换为JSON文件。

我们将以下文件解压缩为ipa文件,并将Assets.car转换为JSON文件。

  xcrun --sdk iphoneos assetutil --info ./Assets.car> ./assets.json 

JSON文件的详细信息显示了我们在应用程序中使用的每个图像资产,JSON文件如下所示:

  [ 
{
“ StorageVersion”:14
“ CoreUIVersion”:492,
“ PlatformVersion”:“ 9.0”,
“ AuthoringTool”:“ @(#)PROGRAM:CoreThemeDefinition PROJECT:CoreThemeDefinition-338.3 \ n”,
“密钥格式”:[
“ kCRThemeScaleName”,
“ kCRThemeIdiomName”,
“ kCRThemeIdentifierName”,
“ kCRThemeElementName”,
“ kCRThemePartName”,
“ kCRThemeDimension1Name”,
“ kCRThemeDimension2Name”
],
“ DumpToolVersion”:492.2,
“ MainVersion”:“ @(#)PROGRAM:CoreUI PROJECT:CoreUI-492.2 \ n”,
“ AssetStorageVersion”:“ IBCocoaTouchImageCatalogTool-9.2”,
“ SchemaVersion”:2
“平台”:“ ios”
},
{
“身高”:12
“ Colorspace”:“ srgb”,
“ RenditionName”:“ registered_label”,
“ AssetType”:“ Vector”,
“ SizeOnDisk”:5025,
“名称”:“ Library_Registered”,
“成语”:“通用”,
“宽度”:16
},
{
“ AssetType”:“ Image”,
“ BitsPerComponent”:16
“ ColorModel”:“ RGB”,
“ Colorspace”:“扩展的SRB”,
“ Compression”:“ lzfse”,
“ DisplayGamut”:“ P3”,
“编码”:“ ARGB-16”,
“成语”:“通用”,
“图像类型”:“ kCoreThemeOnePartScale”,
“名称”:“ Intro_Background”,
“不透明”:错误,
“ PixelHeight”:812,
“ PixelWidth”:375,
“ RenditionName”:“ bg_intro_first.pdf”,
“比例”:1
“ SizeOnDisk”:388200
},...

每个字典代表图像元数据。 我们可以看到JSON词典之一具有P3 DisplayGamut属性,如果在App Store中发布此应用程序,则会导致崩溃。 适当的方法是仅用具有8位sRGB的较新图像替换该图像,然后将应用上传到App Store。 现在,一切都会好起来的!

如何防止它再次发生?

到目前为止,我们知道如何检测图像格式。 我们可以将这些代码移入我们的持续集成(CI)流程中。 这是我们在Jenkins脚本中的实现:

  #!/ bin / bash -lfunction checkImageIsValid() 
{
rm -rf ./checkImageDir/
mkdir checkImageDir
解压缩“ $ {XcodeTarget} _ $ {version} _ $ {BUILD_NUMBER} _ $ {ProductPostfix} .ipa” -d ./checkImageDir/
xcrun --sdk iphoneos assetutil --info“。/checkImageDir/Payload/${XcodeTarget}.app/Assets.car”> ./checkImageDir/Assets.json
counter =`grep -rn'“ DisplayGamut”:“ P3”'./checkImageDir/Assets.json | wc -l`
如果[[“ $ counter” -gt 0]]; 然后
回显“查找图像错误$ {counter}”。
1号出口
科幻
}

每次我们开始构建应用程序时,都会先删除临时目录,以防止Jenkins系统使用过时的数据。 然后,我们开始创建临时的,取消存档的ipa文件(之前已创建)(可以使用fastlane工具,也可以build and archive by yourself ),然后将Assets.car文件传输到Assets.json文件。

我们计算"DisplayGamut": “P3”出现时间,如果计数器大于0,则说明应用捆绑包有错误图片,应立即修复。

  counter =`grep -rn'“ DisplayGamut”:“ P3”'./checkImageDir/Assets.json |  wc -l` 

因此,如果发现错误,我们仅使用出口1退出此作业。 这非常简单,如果设计人员和开发人员没有注意到这一点,则可以防止副作用。


此问题仅在通过App Store发布后才会发生,但是我们可以通过TestFlight重现崩溃问题。 这是我们在将APP提交到App Store之前进行预检查的唯一方法。 我们的想法是,我们首先上传带有图片问题的应用,然后使用内部Beta测试模式发布它,然后修复该问题,然后再次上传以检查崩溃是否已解决。 就这样!!

总而言之,有时开发人员或质量保证人员无法在开发短语中找到每个错误或问题,但是在启动新功能后仍然需要立即做出响应。

进一步阅读:

Xcode 8在iOS 9.2及更低版本上崩溃

当我使用Xcode 8 GM Seed构建我的应用并在设备或模拟器下的iOS 9.2上运行它时,我感到很奇怪……

stackoverflow.com

DCI-P3 | 维基百科

DCI-P3或DCI / P3是美国电影业用于数字电影放映的通用RGB颜色空间。[1]

www.wikiwand.com