文/青花瓷的平方(简书作者)
原文链接:http://www.jianshu.com/p/b2e30cad2a0d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

缘由

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

最新文章

  1. nw.js FrameLess Window下的窗口拖拽与窗口大小控制
  2. apache+php+mysql的配置(转载)
  3. Android 之 Activity的生命周期
  4. js 实现各种排序
  5. POJ 2386
  6. Java基础之创建窗口——向窗口中添加菜单(Sketcher)
  7. windows8.1 plsql连接oracle
  8. jqueryIFrame框架内元素操作
  9. python Django 学习笔记(四)—— 使用MySQL数据库
  10. 对ArrayList 进行深拷贝
  11. 解决backbone url请求中参数有中文,存入数据库是乱码
  12. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
  13. 使用 EPUB 制作数字图书
  14. leetcode面试准备: CountPrimes
  15. AndroidManifest.xml解释说明和android的启动过程
  16. apache下配置虚拟主机案例详解
  17. 用三或四个个div标签实现工字效果
  18. Scala学习笔记--特质trait
  19. HDU 3829 Cat VS Dog
  20. 修改apache的默认www目录

热门文章

  1. Oracle:exp导出exp-00091问题
  2. [Selenium] Selenium 疑难杂症
  3. Watir: 如何处理简单的网页弹出警告框?
  4. ORA-01152: 文件 1 没有从过旧的备份中还原
  5. qq截图原理
  6. 各浏览器的userAgent对照表
  7. Divide the Sequence
  8. E20180408-hm
  9. hdoj1027【STL系列。。。?】
  10. NGUI Tween几种用法随手记