xcframework不包含内部框架

时间:2019-11-11 17:12:17

标签: frameworks xcodebuild

我正在尝试为我正在使用的一些第三方库创建一个.xcframework文件。按照https://appspector.com/blog/xcframeworks的指示,我

  1. 创建特定于平台的framework文件:
# Archive for device
xcodebuild archive -scheme TestFramework -destination="iOS" -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

# Archive for simulator
xcodebuild archive -scheme TestFramework -destination="iOS Simulator" -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

至此,我已经获得了两个带有.swiftmodule文件的框架。一切看起来都很好。框架没有.swiftinterface文件附带的 ,但是我认为没关系,因为这些都是objc项目。然后,我

  1. 将各个framework合并为一个xcframework文件:
# Build xcframework with two archives
xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/TestFramework.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/TestFramework.framework -output /tmp/xcf/TestFramework.xcframework

在这里,xcodebuild不会失败,但是会发出一个奇怪的错误:

No 'swiftinterface' files found within '/Users/user/git/ReactiveObjC/output/xcf/ios.xcarchive/Products/Products/Library/TestFramework.framework/Modules/TestFramework.swiftmodule'.

至关重要的是,.xcframework软件包不包含framework文件中指定的各个Info.plist文件夹。显然,当我尝试在这种状态下链接到xcframework时,会遇到一堆“缺少符号”的链接器错误。

这是为什么?我该怎么做才能使xcodebuild完全创建xcframework

注意:手动创建文件夹目前似乎可以使用,但是这感觉很差而且很脆弱– Apple可以随时更改xcodebuild的工作方式。

2 个答案:

答案 0 :(得分:1)

结果发现,在BUILD_LIBRARY_FOR_DISTRIBUTION = YES命令的末尾添加xcodebuild是不够的/不能用所需的swiftinterface文件生成框架。我必须进入实际项目的设置,然后手动将BUILD_LIBRARY_FOR_DISTRIBUTION设置为YES,就像this answer所建议的那样。在获得带有swiftinterface文件的框架之后,我便可以使用xcframework创建xcodebuild文件而没有任何问题。

答案 1 :(得分:0)

创建 XCFramework

XCFramework 替换 Fat/Universal 框架。它是一个 .*confirmation.* ,其中包含每个架构/平台的多个 .framewok。我们不需要手动使用 bundle[About] 来统一和分离框架

XCFramework 支持带有头文件和 Objective-C 的库

  1. 为您的框架启用 lipo。 XCFramework 仅适用于启用的 [BUILD_LIBRARY_FOR_DISTRIBUTION]。如果不是,当您运行第 3 步 Build Libraries for Distribution(BUILD_LIBRARY_FOR_DISTRIBUTION) 时,您会得到

    xcodebuild -create-xcframework
  2. 为不同的架构/平台构建/归档 .framework

    No 'swiftinterface' files found within '<some_path>/<some_name>.xcarchive/Products/Library/Frameworks/<some_name>.framework/Modules/<some_name>.swiftmodule'
    

    xcodebuild archive \ -workspace ModuleName.xcworkspace \ -scheme "schemaName" \ -sdk "iphoneos" \ -arch arm64 \ -archivePath "<some_path>/ArchiveName1.xcarchive" \ SKIP_INSTALL=NO \ xcodebuild archive \ -workspace ModuleName.xcworkspace \ -scheme "schemaName" \ -sdk "iphonesimulator" \ -arch x86_64 \ -archivePath "<some_path>/ArchiveName2.xcarchive" \ SKIP_INSTALL=NO \ [About] 在归档中包含框架的关键点之一

  3. 使用 SKIP_INSTALL

    创建 XCFramework
    xcodebuild -create-xcframework

xcodebuild -create-xcframework \ -framework "<some_path>/ArchiveName1.xcarchive/Products/Library/Frameworks/ModuleName.framework" \ -debug-symbols "<some_path>/ArchiveName1.xcarchive/dSYMs/${schemes[$n]}.ModuleName.dSYM" \ -framework "<some_path>/ArchiveName2.xcarchive/Products/Library/Frameworks/ModuleName.framework" 允许添加 -debug-symbols[About].dSYM[About]