今天接受了一個改造舊項(xiàng)目的任務(wù),據(jù)說項(xiàng)目唯獨(dú)在iOS11上無法運(yùn)行。這很容易就讓我們想到與最近蘋果iOS11放棄支持32位應(yīng)用的事件有關(guān)。確實(shí)我在平時開發(fā)的項(xiàng)目中也沒怎么涉及這個問題,這次在升級應(yīng)用支持64位的過程中還是遇到了些問題,所以在這里總結(jié)一下,也許還會有同行的朋友遇到。
一、iOS11停止支持32位的來由
蘋果于2013年9月推出了iPhone 5S新手機(jī),采用的全新A7處理器其最大特色就是支持64位運(yùn)算。64位A7處理器的使用意味著iPhone性能會大有提高,性能和速度更加出色;而要到達(dá)到這樣的性能,開發(fā)者就要開發(fā)64位的應(yīng)用了。因?yàn)榧词?4位的處理器再出色,如果還是安裝32位的應(yīng)用,那么64位處理的性能也不能發(fā)揮出來。
2018年1月1日開始,蘋果在iOS 11系統(tǒng)上停止了32位應(yīng)用程序的服務(wù)支持,使用iOS11系統(tǒng)的用戶將無法再在Appstore中搜索到32位應(yīng)用。同時32位的應(yīng)用不順應(yīng)趨勢也會停止繼續(xù)開發(fā),所以iPhone5s以下的機(jī)型也都面臨著App停止更新的情況,因?yàn)閺膇Phone5s之后的iOS設(shè)備才是64位設(shè)備,而iPhone5以下都是32位設(shè)備,。
二、了解iOS的CPU架構(gòu)
我們說到了32位和64位的處理器,它們本質(zhì)的區(qū)別還是在于,64位多出2個寄存器,而這兩個寄存器在運(yùn)行32位應(yīng)用的時候是關(guān)閉的,只有在運(yùn)行64位應(yīng)用的時候才會激活,才會用上。
這個區(qū)別對我們開發(fā)產(chǎn)生的影響在于,如果我們在項(xiàng)目中設(shè)置了支持不同的CPU架構(gòu),那么我們使用的靜態(tài)庫,動態(tài)庫、以及打包的大小都會受到影響。關(guān)于在Xcode中設(shè)置不同CPU架構(gòu)的支持可以參考下另一篇文章:(http://www.itdecent.cn/p/441caa1138af)
三、升級32位應(yīng)用支持64位
其實(shí)升級應(yīng)用支持64位并不復(fù)雜,主要有以下兩個步驟:
1.修改ARchitectures,設(shè)置項(xiàng)目支持64位CPU
我們在Xcode中選擇將要設(shè)置的target,然后打開build setting, 可以看到有關(guān)指令集設(shè)置的Architectures選項(xiàng)。
修改Vaild Architectures選項(xiàng),增加arm64支持。

2.更換各個平臺的SDK
在經(jīng)過上面的修改之后,我們的應(yīng)用會編譯失敗。因?yàn)槲覀冊O(shè)置了項(xiàng)目需要支持arm64的架構(gòu),但是代碼中使用的各個平臺的SDK靜態(tài)庫還是只支持32位的。這就需要我們耐心的一個個更換了。這里有三個問題可能我們會遇到:
Xcode提示Build failed,但是沒有明顯的報錯
解決:打開Xcode左側(cè)導(dǎo)航欄選擇最后一項(xiàng),我們會在這里看到編譯錯誤。編譯報錯Undefined symbols for architecture x86_64
解決:這就是我們不支持64位的sdk報的錯,我們可以從這里找到它并將其更換如何判斷一個SDK靜態(tài)庫是否支持64位?
解決:我們找到這個靜態(tài)庫文件(如百度分析的靜態(tài)庫),使用命令行:lipo -info libBaiduMobStat.a ,我們就可以看到其所支持的類型
四、其他可能遇到的問題
1.XIB報錯:compiling IB documents for earlier than ios 7 is no longer supported
我們修改的這類項(xiàng)目通常也是比較舊的代碼了,如果使用最新的Xcode打開我們可能會遇到上面的報錯。我們可以進(jìn)行如下的設(shè)置來修改這個錯誤。如果我們在Target->Deployment info ->Deployment Target 設(shè)置的是8.0的話,我們對于每個XIB文件也要做如下的修改:
