Section 8/181 menit
8. Binary Targets & XCFramework Distribution
8. Binary Targets & XCFramework Distribution
Membuat XCFramework dari Package
swift
# Build untuk setiap platform dan architecture
xcodebuild archive \
-scheme MyLib \
-destination "generic/platform=iOS" \
-archivePath ./Archives/iOS \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-scheme MyLib \
-destination "generic/platform=iOS Simulator" \
-archivePath ./Archives/iOS-Simulator \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-scheme MyLib \
-destination "generic/platform=macOS" \
-archivePath ./Archives/macOS \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# Gabungkan menjadi satu XCFramework
xcodebuild -create-xcframework \
-framework ./Archives/iOS.xcarchive/Products/Library/Frameworks/MyLib.framework \
-framework ./Archives/iOS-Simulator.xcarchive/Products/Library/Frameworks/MyLib.framework \
-framework ./Archives/macOS.xcarchive/Products/Library/Frameworks/MyLib.framework \
-output ./MyLib.xcframework
Package.swift untuk Binary Distribution
swift
// Package.swift — distribusi binary via URL (CDN/GitHub Releases)
import PackageDescription
let package = Package(
name: "MyLib",
products: [
.library(name: "MyLib", targets: ["MyLib"])
],
targets: [
// Binary dari URL remote
.binaryTarget(
name: "MyLib",
url: "https://github.com/example/MyLib/releases/download/1.2.3/MyLib.xcframework.zip",
checksum: "e3b0c44298fc1c149afb..." // SHA-256 dari ZIP file
)
]
)
swift
// Package.swift — binary dari path lokal (untuk development)
targets: [
.binaryTarget(
name: "MyLibLocal",
path: "./LocalBinaries/MyLib.xcframework"
)
]
Menghitung Checksum
swift
# Hitung checksum SHA-256 dari ZIP file
swift package compute-checksum MyLib.xcframework.zip
# Output: e3b0c44298fc1c149afb4c8996fb92427ae41e4649b934ca495991b7852b855
Automasi Release dengan GitHub Actions
swift
# .github/workflows/release-xcframework.yml
name: Release XCFramework
on:
push:
tags: ['v*']
jobs:
build-xcframework:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Build XCFramework
run: |
xcodebuild archive \
-scheme MyLib \
-destination "generic/platform=iOS" \
-archivePath $RUNNER_TEMP/iOS \
SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-scheme MyLib \
-destination "generic/platform=iOS Simulator" \
-archivePath $RUNNER_TEMP/iOS-Simulator \
SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework \
-framework $RUNNER_TEMP/iOS.xcarchive/Products/Library/Frameworks/MyLib.framework \
-framework "$RUNNER_TEMP/iOS-Simulator.xcarchive/Products/Library/Frameworks/MyLib.framework" \
-output $RUNNER_TEMP/MyLib.xcframework
- name: Package & Compute Checksum
run: |
cd $RUNNER_TEMP
zip -r MyLib.xcframework.zip MyLib.xcframework
echo "CHECKSUM=$(swift package compute-checksum MyLib.xcframework.zip)" >> $GITHUB_ENV
- name: Update Package.swift checksum
run: |
sed -i '' "s/checksum: \".*\"/checksum: \"${{ env.CHECKSUM }}\"/" Package.swift
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"
git add Package.swift
git commit -m "Update checksum for ${{ github.ref_name }}"
git push
- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: |
${{ runner.temp }}/MyLib.xcframework.zip