I am trying to create an .xcframework
file for a few third party libraries I'm using. Following the instructions from https://appspector.com/blog/xcframeworks, I
framework
files:# 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
At this point, I've gotten two frameworks with .swiftmodule
files; everything looks good. The frameworks do not come with .swiftinterface
files, but I think that is alright as these are objc projects. Then, I
framework
s to form a single xcframework
file:# 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
Here, xcodebuild
doesn't fail, but it emits a curious error:
No 'swiftinterface' files found within '/Users/user/git/ReactiveObjC/output/xcf/ios.xcarchive/Products/Products/Library/TestFramework.framework/Modules/TestFramework.swiftmodule'.
Crucially, the .xcframework
package does not contain the individual framework
s or folders specified in the Info.plist
file. Obviously, when I try to link to the xcframework
in this state, I get a bunch of "missing symbols" linker errors.
Why is this? What must I do to get xcodebuild
to create the xcframework
completely?
NB: Manually creating the folders seems to work for now, but this feels wrong and is brittle – Apple can change the way xcodebuild
works anytime.
What is XCFramework? Apple defines XCFrameworks as a distributable binary package created by Xcode that contains variants of a framework or library so that it can be used on multiple platforms (iOS, macOS, tvOS, and watchOS), including Simulator builds.
swiftinterface , which is the compiler's representation of the public interfaces of a framework. This includes API declarations and inlineable code. The module file is used by the compiler for performing necessary tasks such as type checking and code generation when compiling client code using a framework.
Turns out that adding BUILD_LIBRARY_FOR_DISTRIBUTION = YES
to the end of the xcodebuild
command was not enough / not working to produce a framework with the required swiftinterface
files. I had to go in the settings for the actual project and manually set BUILD_LIBRARY_FOR_DISTRIBUTION
to YES
, like this answer suggests. After I got the frameworks with the swiftinterface
files, I was then able to create the xcframework
file using xcodebuild
without any problems.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With