真机调试 “Could not launch 'app name'”引发的things

  最近一直用ip6sp作为公司项目的测试机,突然有天,某人拿着5c来让往上build一个测试版,于是直接打开项目,数据线脸上5c,build,就在快要完成的时候出现了个这个提示: "Could not launch 'app name'"

  What?难道是没插好数据线?重新插了一下build还是不行。什么鬼。。然后重启Xcode,重启电脑都不行。。重新接入6sp,build,一切正常。。这是什么原因呢。。。

  开始从各个方面查找原因。。。(找歪的就不说了。。。)

  进入Xcode的DerivedData缓存文件

真机调试 “Could not launch 'app name'”引发的things_第1张图片

    尝试把缓存全部删除掉试一试。。。

这里提下这个DerivedData文件夹,可以直接删掉这个文件夹,这样就不用一个一个清除里面的子文件夹了。不用担心,删除后系统会马上自动再次生成这个文件夹,并且里面包含系统所需要的基本文件,其他的数据缓存就被清除了,放心大胆的直接删,定期删除还可以释放很多mac的空间哦。

    怀着忐忑的心情,再次插上5c,build。。。

    结果竟然成功了。。。好神奇   但是究竟是为什么呢。。。

    想到了从两者的处理器方面分析:

  • armv7|armv7s|arm64都是ARM处理器的指令集
arm64:iPhone6s | iphone6s plus|iPhone6| iPhone6 plus|iPhone5S | iPad Air| iPad mini2(iPad mini with Retina Display)
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4

    可以看出5c(32位)是armv7s的 6sp(64位)是arm64的

    难道是缓存影响了Xcode的判断? 初步猜测是Xcode在给手机build的时候调用了缓存,从而成了错误的二进制代码?

查看项目的Build Settings



Architectures
工程被编译成可支持哪些指令集类型,支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是说ipa包会变大。

Valid Architectures限制可能被支持的指令集的范围,也就是Xcode编译出来的二进制包类型最终从这些类型产生,而编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定

     可以看出项目生成的是含有多个指令集的,应该是没有问题的。接着往下看:


指定是否仅仅对当前连接设备所支持的指令集编译
当值设置为YES,只编译当前的architecture版本,而设置为no时,会编译所有的版本。 
我在这里设置为了YES,因此项目build的时候会只生成目标手机的版本。

猜想:因为刚才的缓存文件干扰了Xcode对当前手机的判断,因此换了32位手机的时候,Xcode还是仅仅生成的64位的版本,所以无法通过build。

清空DervicedData之后,给5cbuild完成之后,直接给6spbuild,还是发现有最开始的问题 “Could not launch 'app name'”。这时候只生成32位版本,但是64位的手机不是可以兼容32位的吗,为什么又无法build了呢。。。

问题是解决了,但是因此也发现了我的好多的知识空洞。。越来越觉得自己什么都不会了。。。

你可能感兴趣的:(iOS,真机调试,心路历程)