iOS New Build System下framework打包腳本適配

級(jí)別:★★☆☆☆
標(biāo)簽:「Xcode 10」「xcodebuild」「UseModernBuildSystem」
作者: Xs·H
審校: QiShare團(tuán)隊(duì)

前言:New Build System (Preview) 最早在Xcode 9中出現(xiàn)。相較于之前的Legacy Build System,New Build System能夠大幅度提升編譯速度,同時(shí)更嚴(yán)格地檢測(cè)代碼質(zhì)量(循環(huán)引用等)和更友好地給出提示。但在Xcode 9中,New Build System還不是默認(rèn)項(xiàng),沒(méi)有被廣泛使用。升級(jí)到Xcode 10后,New Build System替換Legacy Build System成為了默認(rèn)項(xiàng)(通過(guò)File -> Project Settings可查看,如圖1)。

圖1 Project Settings

作者所維護(hù)的項(xiàng)目中有打包framework的功能,在升級(jí)到Xcode 10之前,打包腳本可以正常使用(如圖2),而在升級(jí)到Xcode 10之后,打包腳本失效了(如圖3)。

打包腳本如下:

# 合并在真機(jī)和模擬器上編譯出的QiShareSDK
# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME
FMK_NAME="QiShareSDK"
# INSTALL_DIR 是導(dǎo)出framework的路徑
# 在工程的根目錄創(chuàng)建framework的文件夾.
INSTALL_DIR=${SRCROOT}/QiShareFrameworks/${FMK_NAME}.framework
# 合成framework后,WRK_DIR會(huì)被刪除
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# Clean兩個(gè)架構(gòu)的framework
xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# 刪除之前生成的framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 合成
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
# 刪除 WRK_DIR
rm -r "${WRK_DIR}"
# 打開(kāi) INSTALL_DIR
open "${INSTALL_DIR}"

編譯出的正常framework(framework中有內(nèi)容):

圖2 編譯出的正常framework

編譯出的錯(cuò)誤framework(framework中無(wú)內(nèi)容):

圖3 編譯出的錯(cuò)誤framework

根據(jù)經(jīng)驗(yàn),猜測(cè)是新的編譯系統(tǒng)導(dǎo)致的。果然,在將File -> Project Settings中的Build System從New Build System改為Legacy Build System后,問(wèn)題就解決了。

但這樣一來(lái),會(huì)導(dǎo)致整個(gè)項(xiàng)目都無(wú)法使用New Build System,這不是作者希望的,想必也不是開(kāi)發(fā)者們和Apple希望的。所以,如果能夠單獨(dú)指定framework打包過(guò)程不使用New Build System,將會(huì)是一個(gè)不錯(cuò)的解決方案。

通過(guò)檢索和試驗(yàn)發(fā)現(xiàn),我們可以使用-UseModernBuildSystem=NO來(lái)指定xcodebuild命令不使用當(dāng)前的編譯系統(tǒng)。所以,作者對(duì)打包腳本xcodebuild命令行進(jìn)行了調(diào)整,如下:

xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build -UseModernBuildSystem=NO
xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build -UseModernBuildSystem=NO

然后,在New Build System下運(yùn)行腳本,發(fā)現(xiàn)可以正常打包了,問(wèn)題得以解決。

PS:新系統(tǒng)升級(jí)后,QiShare總結(jié)了一些問(wèn)題,但也有沒(méi)總結(jié)到的。歡迎朋友們留言討論。
1.升級(jí)Mojave后,Xcode10啟動(dòng)模擬器后無(wú)法運(yùn)行程序了,怎么辦?
2.在iOS 12中無(wú)法獲取WiFi的SSID了?別慌!


了解更多iOS及相關(guān)新技術(shù),請(qǐng)關(guān)注我們的公眾號(hào):

關(guān)注我們的途徑有:
QiShare(簡(jiǎn)書(shū))
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號(hào))


推薦文章:
如何假裝很懂工業(yè)物聯(lián)網(wǎng)?
iOS 編寫(xiě)高質(zhì)量Objective-C代碼(六)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容