緣由
上一次生產(chǎn)環(huán)境我們出現(xiàn)重大bug辜荠,因ApplePay上線琼开,其中有一個(gè)宏文件我同事忘記加版本控制养交,測(cè)試也沒測(cè)試(因?yàn)槭切“姹揪悖琣pplepay還未開放),導(dǎo)致線上一天崩潰近萬次碎连,多虧了jspatch殖妇,用熱修復(fù)解決了此問題。那么問題來了破花,怎么讓開發(fā)人員提前看到編譯警告呢谦趣,以至于不犯這種低級(jí)錯(cuò)誤。
解決
1.xcodebuild
這是我第一眼想到的方法座每,寫shell腳本前鹅,用自動(dòng)編譯的形式檢測(cè)。但是這個(gè)有很大的問題:
(1)Xcode7 現(xiàn)在支持的模擬器sdk是9.2版本峭梳,其他sdk需要我們自己在網(wǎng)上下載舰绘,一般都是從Xcode老版本中拷出來才行,可用xcodebuild -showsdks 查看支持的sdk葱椭,如下圖
具體的xcodebuild使用介紹網(wǎng)上很多捂寿,我就不闡述了,劉偉的一篇文章寫得很詳細(xì)孵运,可參考:xcodebuild 命令詳解秦陋。
(2)其次是編譯其他sdk的時(shí)間會(huì)很長(zhǎng)(如果是大項(xiàng)目的話),寫一個(gè)腳本編譯也沒多大優(yōu)勢(shì)治笨。
2.更好的解決方法
更好的解決方式明顯是讓編譯器直接給出警告驳概!那么如何才能讓編譯器給出警告呢赤嚼?
上面的圖片引用自 Warn about new API Classes and Methods
對(duì)于Xcode中銷毀的方法編譯器直接給出警告,那么編譯器是如何給出這些警告和錯(cuò)誤信息的呢顺又?
具體涉及deprecated更卒,unavailable這些用法,可參考
[iOSSimulatorSDK] usr/include/Availability.h
[iOSSimulatorSDK] usr/include/AvailabilityInternal.h
我在stack overflow上搜到了一篇很受啟發(fā)的文章:Is there a way for XCode to warn about new API calls?
其中好幾個(gè)回答都很好稚照,因此找到了開源項(xiàng)目MJGAvailability,
我修改了這個(gè)頭文件蹂空,添加了ios7之后的api,但是最終在Xcode7上新建一個(gè)項(xiàng)目測(cè)試發(fā)現(xiàn)始終沒有編譯警告果录,但是對(duì)自定義標(biāo)注的屬性和方法都有警告上枕,如下圖
一開始我以為是把UIKit都系統(tǒng)控件是不是放在我自定義頭文件之前了,后面過了很長(zhǎng)時(shí)間才覺得應(yīng)該Xcode中某些編譯配置的問題雕憔,最終查到了是Enable Modules 和 Link Framwork automatically的原因姿骏,這是Xcode5之后提出的一門技術(shù),具體可參考[iOS7中Objective-C和Foundation的新特性],最終我在Debug模式設(shè)置Enable Modules 和 Link Framework automatically為NO(可能會(huì)出現(xiàn)編譯錯(cuò)誤斤彼,因?yàn)樽詣?dòng)連接取消分瘦,一些關(guān)聯(lián)的庫(kù)文件需要自己手動(dòng)添加)
注意:由于我們重定義了系統(tǒng)宏,在release下不應(yīng)該這樣做琉苇,因?yàn)檫@樣做可能會(huì)導(dǎo)致一些無法預(yù)知的問題嘲玫,所以你可以在pch文件添加debug判斷
demo
具體的demo在我的github上TestApiLevel