To create a new private SDK xcframework like BacklightServices, follow these steps:
Command Summary
bash
# 1. Create directory structure
mkdir -p <FrameworkName>/{2024/{Sources,tbds},latest}
cd <FrameworkName>
# 2. Create tbd subdirectories for each platform
mkdir -p 2024/tbds/{ios-arm64-arm64e,ios-arm64-x86_64-simulator,xros-arm64-x86_64-simulator}
# 3. Extract tbd files from simulators
# For iOS Simulator
cp -r "/Library/Developer/CoreSimulator/Volumes/iOS_22F77/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 18.5.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/<FrameworkName>.framework" /tmp/<FrameworkName>_ios_simulator.framework
cd /tmp && xcrun tapi stubify ./<FrameworkName>_ios_simulator.framework
cp /tmp/<FrameworkName>_ios_simulator.framework/<FrameworkName>.tbd <path>/2024/tbds/ios-arm64-x86_64-simulator/
# For visionOS Simulator
cp -r "/Library/Developer/CoreSimulator/Volumes/xrOS_22O473/Library/Developer/CoreSimulator/Profiles/Runtimes/xrOS 2.5.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/<FrameworkName>.framework" /tmp/<FrameworkName>_xros_simulator.framework
cd /tmp && xcrun tapi stubify ./<FrameworkName>_xros_simulator.framework
cp /tmp/<FrameworkName>_xros_simulator.framework/<FrameworkName>.tbd <path>/2024/tbds/xros-arm64-x86_64-simulator/
# 4. Get iOS device tbd from GitHub
curl -s "https://raw.githubusercontent.com/xybp888/iOS-SDKs/master/iPhoneOS18.5.sdk/System/Library/PrivateFrameworks/<FrameworkName>.framework/<FrameworkName>.tbd" > 2024/tbds/ios-arm64-arm64e/<FrameworkName>.tbd
# 5. Set up framework-specific files
# For Swift frameworks:
mkdir -p 2024/Sources/Modules/<FrameworkName>.swiftmodule
# Create template.swiftinterface with Swift module declarations
# For Objective-C frameworks:
mkdir -p 2024/Sources/{Headers,Modules}
# Extract headers using ipsw class-dump (creates individual header files in a subdirectory)
ipsw class-dump "/Library/Developer/CoreSimulator/Volumes/iOS_22F77/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 18.5.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/<FrameworkName>.framework/<FrameworkName>" --headers --arch arm64 -o 2024/Sources/Headers
# This creates a <FrameworkName>/ subdirectory in Headers/ with all the header files
# Note: Headers are universal and can be used for all platforms (iOS, iOS Simulator, visionOS Simulator)
# Create module.modulemap in Modules/
# 6. Create Info.plist for xcframework
# 7. Create update.sh script
# 8. Run update.sh to generate xcframework
./update.sh
# 9. Create symlink to latest version
ln -s ./2024 latest
Key Files Created
- •Info.plist - Defines the xcframework structure with library identifiers for each platform
- •update.sh - Script to regenerate the xcframework from tbd files
- •README.md - Documentation for the framework
- •tbds/ - Directory containing .tbd stub files for each platform:
- •ios-arm64-arm64e (iPhone device)
- •ios-arm64-x86_64-simulator (iPhone Simulator)
- •xros-arm64-x86_64-simulator (visionOS Simulator)
- •For Swift frameworks:
- •
Sources/Modules/<FrameworkName>.swiftmodule/template.swiftinterface- Template for Swift interface generation
- •
- •For Objective-C frameworks:
- •
Sources/Headers/- Directory containing framework header files - •
Sources/Modules/module.modulemap- Module map defining the framework's module structure
- •
Platform Support
The framework supports:
- •iOS Device (arm64, arm64e)
- •iOS Simulator (arm64, x86_64)
- •visionOS Simulator (arm64, x86_64)
Notes
- •The
xcrun tapi stubifycommand is used to generate .tbd files from framework binaries - •The 2024 version corresponds to iOS 18.5, macOS 15.5, and visionOS 2.5
- •Always create a symlink named
latestpointing to the current version directory - •Swift frameworks require a
template.swiftinterfacefile for proper module interface generation (see AttributeGraph for example) - •Objective-C frameworks require a
module.modulemapand header files in the Sources directory - •The
update.shscript should handle copying these files into the generated xcframework structure
Create framework: $ARGUMENTS