线上项目在iOS9的设备上调试,频繁crash
这个事情是发生在近期,刚上线的项目中,频繁crash,而且启动就可能crash,crash地方不唯一,点击都可能会出现crash。
根据友盟统计以及客服反馈,出现crash是iOS9.0-9.2的系统版本下的机型。而且是针对于已上线的情况,拿测试机本地运行没有发现crash。
友盟统计给的信息是“Application received signal SIGSEGV”,用dSYM定位为友盟分享的报错。经过查询资料,友盟给的解释的只是友盟插件的报错,并不会影响项目的正常运行。也就是说crash的原因不是这个。
然后就是检查问题的过程,经过查看发现。刚开始会在启动过程中频繁闪退,是由于苹果那边注册APNs频繁失败,导致JPush频繁占用主线程去重复注册,启动时间过长,然后进程被杀掉所导致的。接着就是设置僵尸对象、检查内存泄漏。因为这次是对公司的线上项目进行一次小的升级,我着重检查新添加的功能模块,并未发现问题。同时也考虑过是不是某个第三方插件更新了,也未发现问题。
于是翻墙看看别人是否也有这种情况,找到一个类似情况的文章。
大意就是:你的项目中如果包含了16位或者P3的图,那么请将项目运行在iOS9.3以上。对于那些对图像要求并不高的项目,又希望兼容老的版本的设备,那么请将这些16位或者P3的图换成8位的图。
文中给出了详细的操作步骤来找到需要替换的图片:
1、先把你的项目打出一个.ipa的包;
2、.ipa改成.zip格式;
3、解压缩之后会有一个名为“Payload”的文件夹,里面有一个.app;

4、打开终端,将当前工作路径改为“.app”之下:
$ cd path/to/Payload/your.app

5、看看你的.app是否包含了一个“Assets.car”的文件,里面就可能有导致你程序崩溃的罪魁祸首;
// 查看路径下所有文件,当然在文件非常多的情况下,可以用find命令
$ ls
$ find . -name Assets.car
6、要找出里面的P3或16位图,现将这个文件用下面命令转成JSon格式:(/tmp/Assets.json为转出后的文件路径)
$ sudo xcrun --sdk iphoneos assetutil --info Assets.car > /tmp/Assets.json

7、然后打开这个JSon文件,找出里面的P3图片,在你的工程中找到叫这个名字的图片,替换了就可以了。
