美文网首页iOS开发技能iOS进阶之路 黑科技
Xcode8编译包在iOS8中运行异常闪退问题

Xcode8编译包在iOS8中运行异常闪退问题

作者: jezong | 来源:发表于2016-09-22 14:50 被阅读6272次

    升级Xcode8后,编译的app在iOS8中出现�崩溃的情况
    异常�断点停留在加载图片的时候:

    [UIImage imageNamed:@"icon"];
    

    当然,更多时候断点是随机的,真机运行时控制台输出以下log:

    "malloc: *** error for object 0x17415d0c0: Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug";

    无论怎么调试怎么改代码,动用Instruments依然找不出问题。奇怪的是, Xcode7打出来的包并没有出现这种问题。
    后来在苹果的开发者论坛找到了回答

    ERROR ITMS-90682: Invalid Bundle - The asset catalog at 'Payload/XXXXX/Assets.car' can't contain 16-bit or P3 assets if the app supports iOS 8 or earlier

    原来是图片出了问题,其实就是使用了16位或P3图,什么意思呢?P3是指图片的色域范围,正常图片都是sRGB的,但是用16位或P3并没有警告和报错。Xcode8编译打包的app中,含有16位P3在iOS9.3以下的系统都会出现奔溃现象。那么怎么把工程中的P3图片找出来呢?原帖给出了方法。

    解决方法

    xcode命令行提供了一个检索图片属性的工具,我们只需要把打包的所有图片资源传给工具执行就可以了:

    1. 运行工程后一般在Products分组下面都会有.app后缀的app包生成,对着它右键 -> Show in Finder,然后在Finder打开的文件夹中,对着.app文件右键,按住option键,然后就可以看到『将xxx拷贝为路径名称』,我们主要是为了拷贝文件的路径。
      2 .打开终端,然后用cd命令进入拷贝的目录,执行以下命令找到Asset.car文件:
    find . -name 'Assets.car'
    
    1. 用工具生成图片资源的属性表:
     xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
    

    /path/to/a/Assets.car指第2步搜索到Asset.car文件目录。
    /tmp/Assets.json指属性表保存的目录

    1. 打开Assets.json,在文件里搜索"DisplayGamut"字段为"P3"的即为要找的图片,"Name"字段就是图片�资源名。
    2. 把这些有问题的图片整理出来,麻烦切图的同事切色域为sRGB的图替换掉就可以了。

    相关文章

      网友评论

      • 新地球说着一口陌生腔调:兄弟 能否具体点 都不知道Asset.car文件在哪 一脸懵逼啊
        jezong:@新地球说着一口陌生腔调 按照文章中`解决办法->1`描述的方式试一下
        新地球说着一口陌生腔调:@jezong 图片我是放在 xcassets里面了
        jezong:首先要确定你工程中是否使用了`*.xcassets`文件。查找`Asset.car`可以在Finder中搜索,或者在终端中使用find命令搜索。
      • 大树下的方丈:我也遇到同样的问题了,所有的图片都查过,没有问题,target也换了,8.2 8.3 9.1都试过还是不行,感觉还是xcode的bug吧。不定时崩溃,随机的,instrument查不出,僵尸对象打开后就不会崩溃了,所以也查不出来。坑爹的苹果,天天想着钱,想着怎么抽成30%。
        devileatapple:同样的问题。
        纯阳子_:解决了嘛,我没有P3的
      • devileatapple:对着.app文件右键,按住option键,然后就可以看到『将xxx拷贝为路径名称』 并没有这个选项。。。
        jezong:@devileatapple 把'/path/to/a/Assets.car'替换成你的Assets.car路径
        devileatapple:@jezong xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
        终端执行这个报错。Error: CUICommonAssetStorage -initWithPath: Unable to read file at at '/path/to/a/Assets.car'
        jezong:@devileatapple 右键菜单出来之后,按住option键就能看到了
      • e4b6f17a53c8:为什么我设置了Deployment Target为10.0 也在Assets.car转化的Assets.json中也没发现P3字段的图片,可还是奔溃。
        jezong:@e4b6f17a53c8 办法很多,主要是找出哪些是P3图片,如果bundle里面图片很多的话,可以把它们复制到一个新的工程,导入到Assets中,然后按文中所说的方法测试
        e4b6f17a53c8:只有1个assets资源,确实在一些第三方中的bundle含有图片,那需要将他们移动到assets中再导Assets.json文件吗?担心移动会使得这些第三方失效。
        jezong:@e4b6f17a53c8 是不是还有其他的assets资源,或者其他的bundle中有P3的图片?
      • wkw0913:感觉没啥用
      • kuazi:assets文件里的图片可以这么解决,对于没放在assets里的图片呢
        jezong:@kuazi 这种情况也是可以的,主要是确认图片不要用sRGB就可以了,你可以查看PNG图片的简介,或者用工具来批量测试。
        kuazi:@jezong 因为我们项目是模块化的,都在bundle里面。
        jezong:@kuazi 使用`Assets.xcassets`或者创建一个`xcassets`文件,然后把那些散乱的图片放到xcassets文件中,好管理。
      • e8dcdfd23c1b:Update: If your Deployment Target is set to either 8.3 or 8.4 and you have an asset catalog then you will receive this same error message, even if you do not actually have 16-bit or P3 assets. In this case you will either need to lower your Deployment Target to 8.2, or move it up to 9.x.
        e8dcdfd23c1b:@jezong 并不是,我的工程下没有P3图,但是依旧有问题,改了target就好了。。
        jezong:@Kirito有毒 不改也可以了,把P3图片换了就行
        e8dcdfd23c1b:@e8dcdfd23c1b 这水果真尼玛坑,还要我改target。。

      本文标题:Xcode8编译包在iOS8中运行异常闪退问题

      本文链接:https://www.haomeiwen.com/subject/xzszettx.html