iOS开发:让Xcode给出比deployment target 高的Api 给出警告

缘由

上一次生产环境我们出现重大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

推荐阅读更多精彩内容

  • 小朋友食欲很好,中午两碗饭还有很多菜,但是吃才比较单一,海鲜类的根本不动。像是个山西人,喜欢吃面,吃饺子。 也不知...
    athenaliang阅读 61评论 0 0
  • 横竖撇捺,勾连交错间,记忆了历史,传承了文明。汉字,一个个奇妙的组合,展现了无穷的魅力与神奇的力量。每一个...
    海风江语阅读 272评论 0 1
  • (一) 乌青毓秀客熙熙, 小桥流水燕喃呢。 竹径通幽杨傍柳, 茶酒缱绻醉人归。 (二) 撑舟划水惊鱼闹, 青阶黛瓦...
    扛上步枪阅读 60评论 0 0
  • 招聘在人力资源中是一个比较大的模块,同时也是入门相对来说较低的模块,我依稀记得刚刚从事人事的时候就是从招聘开始的,...
    forestzhu阅读 284评论 0 1