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

級別:★★☆☆☆
標簽:「Xcode 10」「xcodebuild」「UseModernBuildSystem」
作者: Xs·H
審校: QiShare團隊

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

圖1 Project Settings

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

打包腳本如下:

# 合并在真機和模擬器上編譯出的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會被刪除
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# Clean兩個架構(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}"
# 打開 INSTALL_DIR
open "${INSTALL_DIR}"

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

圖2 編譯出的正常framework

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

圖3 編譯出的錯誤framework

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

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

通過檢索和試驗發(fā)現(xiàn),我們可以使用-UseModernBuildSystem=NO來指定xcodebuild命令不使用當前的編譯系統(tǒng)。所以,作者對打包腳本xcodebuild命令行進行了調(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下運行腳本,發(fā)現(xiàn)可以正常打包了,問題得以解決。

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


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

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


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 項目中遇到頁面載入時總是滑動到最底部,或中間部位,原因是焦點在頁面底部;解決方法就是在根布局設(shè)置
    呂志豪閱讀 580評論 0 1
  • 1我一直記著高中入學(xué)的那一天。那是學(xué)校歷史上學(xué)生最多的一屆,報到處直接設(shè)置在露天的操場上。九月份的夏天還是酷熱難耐...
    白橙橙閱讀 433評論 10 8
  • 春有百花秋有月,夏有涼風冬有雪。每一個季節(jié)都有一個很有代表性的事物與之對應(yīng),在老家,春天百花齊放,映山紅十幾朵形成...
    毛少伯閱讀 384評論 2 1
  • 對你而言,社群最大的價值是什么? 遇見了很多的牛人,產(chǎn)生了思想碰撞。讓我開闊眼界,知道了世界之大。開啟了學(xué)習(xí)模式,...
    A一路花開閱讀 185評論 0 0