Publishing XCFrameworks with CocoaPods
Building and distributing XCFrameworks with CocoaPods
In a previous post we went over the process of building a XCFramework and publishing it via the Swift Package Manager.
In this article we'll cover how we can do the same via CocoaPods. Although it's losing traction, CocoaPods still remains one of the main tools to distribute your libraries. If you are a maintainer of an open source library, it would be wise to keep supporting CocoaPods for the foreseeable future.
1. Building the XCFramework
Without going into much detail on how a XCFramework is built, below is the gist to build a fictitious StarWars.kit
.
# iOS devices
xcodebuild archive \
-scheme StarWarsKit \
-archivePath "archives/StarWarsKit-iOS.xcarchive" \
-destination "generic/platform=iOS" \
-sdk iphoneos \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# iOS simulators
xcodebuild archive \
-scheme StarWarsKit \
-archivePath "archives/StarWarsKit-iOS-simulator.xcarchive" \
-destination "generic/platform=iOS Simulator" \
-sdk iphonesimulator \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework \
-framework "archives/StarWarsKit-iOS.xcarchive/Products/Library/Frameworks/StarWarsKit.framework" \
-framework "archives/StarWarsKit-iOS-simulator.xcarchive/Products/Library/Frameworks/StarWarsKit.framework" \
-output "StarWarsKit.xcframework"
At this point we'll have the StarWarsKit.xcframework
at the root of our project.
2. Publicly host the XCFramework
While you can host your binary anywhere and publish that via SPM, CocoaPods is a bit more strict and requires you to keep the built binaries with the Podspec.
In this case, it's best to keep the XCFramework in your git repository and push it along.
3. Creating the Podspec
At the root of the project, create the following StarWars.podspec
. In this spec we're not publishing actual code, so we don't have to specify which files are applicable.
Instead, we must use the vendored_frameworks
property to indicate which XCFramework(s) need to be published.
Pod::Spec.new do |spec|
spec.name = "StarWars"
spec.version = "1.0.0"
spec.summary = "Star Wars Library for iOS apps"
spec.description = "..."
spec.homepage = "..."
spec.documentation_url = "..."
spec.license = { :type => "MIT" }
spec.author = { "Star Wars" => "..." }
spec.source = { :git => 'your repo here', :tag => "#{spec.version}" }
spec.swift_version = "5.3"
# Supported deployment targets
spec.ios.deployment_target = "10.0"
# Published binaries
vendored_frameworks = "StarWarsKit.xcframework"
end
Final thoughts
Even though we now have SPM, CocoaPods is still widely used and will continue to be. Providing proper support for it remains as important as ever. Bringing XCFrameworks into the mix only improves certain pain points with directly compiling distributed code.
As always, we hope you liked this article and if you have anything to add, we are available via our Support Channel.