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