iOS製作framework時框架重複
在製作iOS的SDK供他人使用時,我們一般採用framework靜態庫和.a靜態庫。 這裡只講framework,當framework庫打包好了之後,那麼便會出現一個問題。
問題提出:
即使是我們自己開發SDK時,也不免會用到一些第三方框架。之後如果不做任何處理,就進行framework的打包,初看是沒有問題的。但一旦他人接入我開發的SDK,就會報重複檔案的錯誤。 原因就是因為,我的SDK中用了A、B第三方框架,而需要接入我們SDK的人,他的工程中恰巧又用了A、C框架,這個時候,我們的A框架便重複了。 那麼該怎麼去解決呢?
解決:
處理的方式有兩種,各有優缺點:
1.修改類名,變成自己的私有框架。(打包之前)
在打包成framework之前,在每個第三方框架的類名的前面,加一個字首(隨便你加什麼)。並不是加完字首就可以了,加完字首當然就是把類名都修改了,肯定會報錯的,這個時候就一一細心的把所有報錯的地方看一遍,一般是類名錯了,修改過來就可以了。 可能還有一些列舉,結構體什麼的。 這是個細活,但是一勞永逸,這個框架以後就是屬於你自己的了,隨便你怎麼去修改。跟其他工程中的類,也不會有任何衝突。
優點:一勞永逸,不會有任何衝突,並且可以任意去修改類裡面的方法。需要接入SDK的專案工程也是一樣,第三方庫也可以任意修改,井水不犯河水。
缺點:很明顯。 如果第三方庫比較大的話,SDK會比較大。如果專案需要接的SDK過多,主專案會更大。
2.剝離第三方庫。 (打包之後)
在打包好之後,我們再把framework分解,將第三方庫一一剝離,就是刪除,再合併,就可以了。因為內容比較多,所以優缺點先提出來:
優點:這樣,你所用的第三方庫都被剝離出去了,framework所佔的空間就會比較小。一般來說,framework所用第三方框架都會是比較常見的,所以第三方庫大家都大同小異,這樣剝離出去,大家共用同一份,工程就不會太大。
缺點:一,這樣公用一份第三方庫,就不能隨意去修改第三方庫裡面的程式碼了,會影響到所有的framework。 二,因為每次修修改了SDK,都需要重新打包,當然也需要重新分離一次第三方庫,比較繁瑣。
剝離的過程是非常繁瑣的,大概分為 分解成5個步驟:拆分為5個構建版本——分解為.o檔案(*5)——刪除第三方庫(*5)——.o檔案合成(*5)——合成相容版本。
現在我們需要做一下準備工作,一般,framework分有真機版和模擬器版,因為工程中我們需要真機和模擬器分別除錯。其實這兩個framework是可以合二為一的,這樣一個framework就可以相容不同的架構,並且在打包上架時,只會呼叫真機的framework的架構,不會造成ipa包過大,這點不用擔心。
生成framework之後,右鍵點選show in finder,可以看到目錄下有2個framework,2個framework下都存在著YR_webChat檔案,我們現在要將這兩個檔案合併。開啟終端:
1.先CD到一個目錄,我一般會選擇products目錄。
2.再把模擬器和真機的framework下的YR_webChat合併。(檔案拖一下就顯示出路徑了)
sudo lipo -create A檔案 B檔案 -output 重新命名
3.得到了一個相容的YR_webchat,看一下有什麼架構模式。(一般是5個)
lipo -info 檔案
這下面有5個架構模式。i386 x86_64(模擬器) armv7 armv7s arm64 (真機)
4.建立5個空資料夾,並把YR_webChat的架構模式一一分解到檔案中。
YR_webChat是我取的名字,YR_webChat_i386同理。
5.進入到每個目錄中,一一分解。 (跟4一樣,要5次)
再cd .. 出來,再繼續下一個。
6.檢視資料夾中的.o檔案,把第三方類刪除掉。(這個應該要仔細)
7.5個不同的架構,都要刪一次,然後再合併。(同4,要5次)
8.最後,把5個架構,合成一個YR_webChat。(先把之前的YR_webChat刪掉,以防重名報錯)
9.最後,把新生成的YR_webChat,替換掉Release-iphoneos中的framework下的YR_webChat。
10.大功告成,這個Release-iphoneos下的framework就是你要的,分離了第三方庫,並且支援所有架構模式的。