美文网首页待学习iOS扩展iOS 开发
iOS开发:让Xcode给出比deployment target

iOS开发:让Xcode给出比deployment target

作者: 青花瓷的平方 | 来源:发表于2016-01-18 16:33 被阅读3290次

    缘由

    上一次生产环境我们出现重大bug,因ApplePay上线,其中有一个宏文件我同事忘记加版本控制,测试也没测试(因为是小版本,applepay还未开放),导致线上一天崩溃近万次,多亏了jspatch,用热修复解决了此问题。那么问题来了,怎么让开发人员提前看到编译警告呢,以至于不犯这种低级错误。

    解决

    1.xcodebuild

    这是我第一眼想到的方法,写shell脚本,用自动编译的形式检测。但是这个有很大的问题:
    (1)Xcode7 现在支持的模拟器sdk是9.2版本,其他sdk需要我们自己在网上下载,一般都是从Xcode老版本中拷出来才行,可用xcodebuild -showsdks 查看支持的sdk,如下图

    201601181.png
    具体的xcodebuild使用介绍网上很多,我就不阐述了,刘伟的一篇文章写得很详细,可参考:xcodebuild 命令详解
    (2)其次是编译其他sdk的时间会很长(如果是大项目的话),写一个脚本编译也没多大优势。

    2.更好的解决方法

    更好的解决方式明显是让编译器直接给出警告!那么如何才能让编译器给出警告呢?

    201601182.png
    上面的图片引用自 Warn about new API Classes and Methods
    对于Xcode中销毁的方法编译器直接给出警告,那么编译器是如何给出这些警告和错误信息的呢?
    具体涉及deprecated,unavailable这些用法,可参考

    [iOSSimulatorSDK] usr/include/Availability.h
    [iOSSimulatorSDK] usr/include/AvailabilityInternal.h

    我在stack overflow上搜到了一篇很受启发的文章:Is there a way for XCode to warn about new API calls?
    其中好几个回答都很好,因此找到了开源项目MJGAvailability,
    我修改了这个头文件,添加了ios7之后的api,但是最终在Xcode7上新建一个项目测试发现始终没有编译警告,但是对自定义标注的属性和方法都有警告,如下图

    201601184.png

    一开始我以为是把UIKit都系统控件是不是放在我自定义头文件之前了,后面过了很长时间才觉得应该Xcode中某些编译配置的问题,最终查到了是Enable Modules 和 Link Framwork automatically的原因,这是Xcode5之后提出的一门技术,具体可参考[iOS7中Objective-C和Foundation的新特性],最终我在Debug模式设置Enable Modules 和 Link Framework automatically为NO(可能会出现编译错误,因为自动连接取消,一些关联的库文件需要自己手动添加)

    201601185.png

    注意:由于我们重定义了系统宏,在release下不应该这样做,因为这样做可能会导致一些无法预知的问题,所以你可以在pch文件添加debug判断

    demo

    具体的demo在我的github上TestApiLevel

    相关文章

      网友评论

      • tom510230:好厉害,在2年前我已经在试用这个黑科技,当时也遇到了编译没效果的问题,没想到是Enable Modules 和 Link Framwork automatically的原因,太厉害了~~~
      • huangxiongbiao:有没有其他方法解决 ,看到的话请回复下,我研究了下感觉,应该是在编译重定义文件之前编译了UIKit等系统框架,所以重定义的文件对系统类没产生影响。应该只要让重定义的头文件在这之前编译但是我没找到方法,让prefix内的重定义文件先编译
        青花瓷的平方:@c9932bbc1bc9 目前我也没发现比较好的方法,的确是在会修改系统宏,所以最好还是配置debug环境下
      • huangxiongbiao:大神好,除了下面这种方法还有没其他的方法解决这个问题,下面的还要添加库文件感觉乱
        在Debug模式设置Enable Modules 和 Link Framework automatically为NO(可能会出现编译错误,因为自动连接取消,一些关联的库文件需要自己手动添加)
      • 喃哗:大神,你们已经加了Apple Pay了吗?
      • 93d45d365eeb:版本兼容
        青花瓷的平方:@93d45d365eeb ?

      本文标题:iOS开发:让Xcode给出比deployment target

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