簡體   English   中英

無法使用使用 Xcode 10.2+ 構建的通用(胖)框架編譯模擬器構建

[英]Can't compile Simulator build with Universal (fat) Framework built with Xcode 10.2+

我無法為使用 Xcode 10.2+ 構建的通用(胖)框架的模擬器(設備編譯成功)編譯應用程序。 應用程序使用來自 Objective-C 代碼的框架。 當從為設備構建切換到為模擬器構建時,Xcode 停止識別框架中的任何類和其他實體,因此它不會編譯(但在 Swift 文件中正確識別框架類)。

我創建通用框架的腳本類似於https://gist.github.com/sundeepgupta/3ad9c6106e2cd9f51c68cf9f475191fa (通常所有此類腳本使用幾乎相同的邏輯,並且主要因變量命名而異)。

原因

此問題的真正原因在於 Xcode 編譯器。 從 Xcode 10.2 開始,Apple 更改了 Framework swift header (MyFramework.framework/Headers/MyFramework-Swift.h) 的生成器。 現在它添加了像

#elif defined(__x86_64__) && __x86_64__
#elif defined(__i386__) && __i386__

到模擬器標題和

#elif defined(__arm64__) && __arm64__
#elif defined(__ARM_ARCH_7A__) && __ARM_ARCH_7A__

到設備頭。

因此模擬器和設備的標頭變得不同。 因為通用框架構建的通用腳本從設備構建目錄復制頭文件,所以這樣的框架在設備構建中工作正常,但在模擬器構建中失敗。

Apple 在Xcode 10.2 發行說明的已知問題一章中發現了這個問題並提出了解決方案。

解決方案

解決 Apple 提到的問題的解決方案是創建組合標頭,其中應包含來自設備和模擬器的原始標頭:

#include <TargetConditionals.h>
#if TARGET_OS_SIMULATOR
<contents of original iOS Simulator/Framework.framework/Framework-Swift.h>
#else
<contents of original iOS/Framework.framework/Framework-Swift.h>
#endif

關於上面提到的制作胖框架的腳本,您可以通過以下方式對其進行修改:

# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUT_DIR}/${PRODUCT_NAME}.framework" "${RELEASE_DIR}"

# Step 6. Combine PRODUCT_NAME-Swift.h from device and simulator architectures (Xcode 10.2 issue: 48635615)
UNIVERSAL_SWIFT_HEADER=${UNIVERSAL_OUTPUT_DIR}/${PRODUCT_NAME}.framework/Headers/${PRODUCT_NAME}-Swift.h

> ${UNIVERSAL_SWIFT_HEADER}
echo "#include <TargetConditionals.h>" >> ${UNIVERSAL_SWIFT_HEADER}
echo "#if TARGET_OS_SIMULATOR" >> ${UNIVERSAL_SWIFT_HEADER}
cat ${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}.framework/Headers/${PRODUCT_NAME}-Swift.h >> ${UNIVERSAL_SWIFT_HEADER}
echo "#else" >> ${UNIVERSAL_SWIFT_HEADER}
cat ${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PRODUCT_NAME}.framework/Headers/${PRODUCT_NAME}-Swift.h >> ${UNIVERSAL_SWIFT_HEADER}
echo "#endif" >> ${UNIVERSAL_SWIFT_HEADER}    

# Step 7. Convenience step to open the project's directory in Finder
open "${RELEASE_DIR}"

Line > ${UNIVERSAL_SWIFT_HEADER}需要在合並開始之前清除步驟 2 中復制的標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM