自從iOS 8發(fā)布以來,開發(fā)人員已經(jīng)能夠利用動態(tài)庫對iOS開發(fā)的好處。對于一般開發(fā),為所有需要的架構(gòu)設(shè)置一個單一的動態(tài)庫是非常好的,所以您可以在所有設(shè)備和iOS模擬器上運行,而無需更改任何東西。然而,這種方法有一個缺點 - 因為它們在運行時鏈接,當(dāng)一個動態(tài)庫被單獨編譯到最終應(yīng)用程序時,不可能知道實際需要哪些架構(gòu)。因此,Xcode將在編譯時將整個事物復(fù)制到應(yīng)用程序包中。除了浪費的磁盤空間,理論上沒有真正的缺點。但是實際上,iTunes Connect不喜歡我們添加未使用的二進制切片:這時候,打包上傳Appstore會報如下錯誤:
那么,我們?nèi)绾谓鉀Q這個問題呢?
步驟如下:
在Build Phases中加入run script。在里面添加Shell腳本,
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
該腳本將查看您構(gòu)建的應(yīng)用程序的Frameworks文件夾,并確保只有您正在構(gòu)建的架構(gòu)存在于每個框架中。
好多了!現(xiàn)在我可以在我的項目中添加包含我所需要的所有架構(gòu)的胖動態(tài)庫,而我的構(gòu)建過程將會在任何給定的時刻處理哪些架構(gòu)。