iOS New Build System下framework打包脚本适配

级别:★★☆☆☆
标签:「Xcode 10」「xcodebuild」「UseModernBuildSystem」
作者: Xs·H
审校: QiShare团队

前言:New Build System (Preview) 最早在Xcode 9中出现。相较于之前的Legacy Build SystemNew Build System能够大幅度提升编译速度,同时更严格地检测代码质量(循环引用等)和更友好地给出提示。但在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 是导出framework的路径
# 在工程的根目录创建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两个架构的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中有内容):

图2 编译出的正常framework

编译出的错误framework(framework中无内容):

图3 编译出的错误framework

根据经验,猜测是新的编译系统导致的。果然,在将File -> Project Settings中的Build System从New Build System改为Legacy Build System后,问题就解决了。

但这样一来,会导致整个项目都无法使用New Build System,这不是作者希望的,想必也不是开发者们和Apple希望的。所以,如果能够单独指定framework打包过程不使用New Build System,将会是一个不错的解决方案。

通过检索和试验发现,我们可以使用-UseModernBuildSystem=NO来指定xcodebuild命令不使用当前的编译系统。所以,作者对打包脚本xcodebuild命令行进行了调整,如下:

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下运行脚本,发现可以正常打包了,问题得以解决。

PS:新系统升级后,QiShare总结了一些问题,但也有没总结到的。欢迎朋友们留言讨论。
1.升级Mojave后,Xcode10启动模拟器后无法运行程序了,怎么办?
2.在iOS 12中无法获取WiFi的SSID了?别慌!


了解更多iOS及相关新技术,请关注我们的公众号:

关注我们的途径有:
QiShare()
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公众号)


推荐文章:
如何假装很懂工业物联网?
iOS 编写高质量Objective-C代码(六)

你可能感兴趣的:(iOS New Build System下framework打包脚本适配)