級(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)。

作者所維護(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)容):

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

根據(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代碼(六)