XCFramework: τι είναι, μορφή δυαδικής παράδοσης και εφαρμογή

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-06-05 Χρόνος ανάγνωσης: 7 λεπ

XCFramework — μια δυαδική μορφή της Apple που συνδυάζει βιβλιοθήκες για iOS, macOS, tvOS και watchOS σε ένα πακέτο. Σχεδιάστηκε για να αντικαταστήσει το .framework και να εξαλείψει τα προβλήματα των fat binaries κατά τη μεταγλώττιση για διαφορετικές αρχιτεκτονικές προσομοιωτή και συσκευής. Σύμφωνα με το Apple WWDC 2019, το XCFramework έγινε υποχρεωτική μορφή για την παράδοση SDK που υποστηρίζουν πολλές πλατφόρμες και αντικατέστησε πλήρως την παρωχημένη προσέγγιση με καθολικά δυαδικά αρχεία.

Κύρια σημεία

  • XCFramework — καθολική μορφή Apple για παράδοση βιβλιοθηκών, υποστηρίζει πολλές πλατφόρμες και αρχιτεκτονικές σε ένα bundle
  • Η προσέγγιση fat binary αντικαταστάθηκε με ξεχωριστά τμήματα για κάθε πλατφόρμα, εξαλείφοντας προβλήματα μεταγλώττισης με αρχιτεκτονικές προσομοιωτή
  • Η δημιουργία γίνεται μέσω xcodebuild -create-xcframework χωρίς ανάγκη χειροκίνητης συγχώνευσης δυαδικών αρχείων με lipo
  • Η σύνδεση στο Xcode γίνεται μέσω Embed & Sign χωρίς επιπλέον σενάρια για αφαίρεση αρχιτεκτονικών προσομοιωτή
  • Το Swift Package Manager δεν αντικαθιστά πλήρως το XCFramework — οι δυαδικές εξαρτήσεις στο SPM παραδίδονται ακριβώς σε αυτή τη μορφή

Τι είναι το XCFramework;

XCFramework — μια μορφή συσκευασίας δυαδικών βιβλιοθηκών και frameworks, που παρουσιάστηκε από την Apple στο WWDC 2019. Ο κύριος στόχος είναι η δημιουργία ενός bundle που περιέχει μεταγλωττισμένες εκδόσεις της βιβλιοθήκης για όλες τις πλατφόρμες και αρχιτεκτονικές στόχους.

Πριν από την εμφάνιση του XCFramework, οι προγραμματιστές χρησιμοποιούσαν .framework με fat binary, που συνδύαζε πολλές αρχιτεκτονικές μέσω του βοηθήματος lipo. Αυτή η προσέγγιση δημιουργούσε προβλήματα: κατά τη μεταγλώττιση του έργου για προσομοιωτή, το fat binary περιείχε τόσο την αρχιτεκτονική του προσομοιωτή όσο και της συσκευής, οδηγώντας σε σφάλματα κατά την αποστολή του build στο App Store. Οι προγραμματιστές έπρεπε να γράφουν φάσεις Run Script για την αφαίρεση περιττών αρχιτεκτονικών.

Σύμφωνα με το Apple Developer Documentation (2024), το XCFramework υποστηρίζει όλες τις πλατφόρμες του οικοσυστήματος Apple: iOS, iPadOS, macOS, tvOS, watchOS, visionOS και εφαρμογές καταλύτη. Κάθε πλατφόρμα λαμβάνει ένα ξεχωριστό τμήμα μέσα στο πακέτο, εξαλείφοντας τις συγκρούσεις αρχιτεκτονικής και απλοποιώντας τη διανομή SDK.

Πότε χρειάζεται το XCFramework;

XCFramework εφαρμόζεται σε τρία κύρια σενάρια: παράδοση κλειστών SDK σε προγραμματιστές τρίτων, διανομή εγγενών μονάδων για Flutter και React Native, και δημοσίευση βιβλιοθηκών που απαιτούν προηγούμενη μεταγλώττιση. Η μορφή είναι υποχρεωτική για όλα τα νέα SDK που δημοσιεύονται στο οικοσύστημα Apple.

Οι προγραμματιστές επιλέγουν XCFramework όταν ο πηγαίος κώδικας δεν μπορεί να αποκαλυφθεί, όταν η βιβλιοθήκη χρησιμοποιεί ιδιόκτητους αλγόριθμους ή όταν απαιτείται προστασία άδειας χρήσης. Σε αντίθεση με το Swift Package Manager που λειτουργεί με πηγαίο κώδικα, το XCFramework παραδίδει ήδη μεταγλωττισμένα δυαδικά αρχεία.

Πώς λύνει το XCFramework το πρόβλημα fat binary;

Το πρόβλημα fat binary ήταν ότι το καθολικό δυαδικό αρχείο περιείχε πολλές αρχιτεκτονικές σε ένα αρχείο Mach-O. Κατά τη μεταγλώττιση της εφαρμογής για προσομοιωτή, το Xcode συμπεριλάμβανε στο δυαδικό την αρχιτεκτονική arm64 της συσκευής και x86_64 του προσομοιωτή — το App Store δεχόταν μόνο την αρχιτεκτονική της συσκευής.

Η παραδοσιακή λύση περιλάμβανε την προσθήκη φάσης Run Script με κλήση lipo για αφαίρεση αρχιτεκτονικών προσομοιωτή από το τελικό build. Αυτή η προσέγγιση ήταν εύθραυστη και χαλούσε με ενημερώσεις του Xcode ή με προσθήκη νέων αρχιτεκτονικών (π.χ. arm64 για προσομοιωτή σε Apple Silicon).

Σύμφωνα με το Swift.org (2023), η ομάδα του Swift Package Manager αρχικά αντιμετώπισε αυτό το πρόβλημα κατά την προσπάθεια υποστήριξης δυαδικών εξαρτήσεων. Το XCFramework το έλυσε σε επίπεδο μορφής: κάθε τμήμα είναι ένας ξεχωριστός φάκελος με Info.plist που περιγράφει την πλατφόρμα και αρχιτεκτονική στόχο. Το Xcode επιλέγει αυτόματα το κατάλληλο τμήμα κατά τη μεταγλώττιση, χωρίς να απαιτείται μετα-επεξεργασία.

Πλεονεκτήματα της προσέγγισης με ξεχωριστά τμήματα

Κάθε τμήμα στο XCFramework περιέχει μόνο έναν συνδυασμό πλατφόρμας και αρχιτεκτονικής. Για παράδειγμα, το ios-arm64 περιέχει δυαδικό μόνο για συσκευές iOS, και το ios-x86_64-simulator μόνο για προσομοιωτή Intel Mac. Το Xcode επιλέγει αυτόματα το σωστό τμήμα, εξαλείφοντας την ανάγκη για σενάρια αφαίρεσης αρχιτεκτονικών και μειώνοντας τον κίνδυνο σφαλμάτων μεταγλώττισης.

Το τμήμα ios-arm64-x86_64-simulator εμφανίστηκε για υποστήριξη Apple Silicon Mac. Προηγουμένως, ο προσομοιωτής απαιτούσε ξεχωριστό δυαδικό για arm64 (Apple Silicon) και x86_64 (Intel). Το XCFramework επιτρέπει fat binary μέσα σε ένα τμήμα για προσομοιωτή — αυτή είναι η μόνη εξαίρεση όπου το fat binary δικαιολογείται.

Δομή του πακέτου XCFramework

Το πακέτο XCFramework είναι ένας κατάλογος με επέκταση .xcframework, που περιέχει Info.plist στο ανώτερο επίπεδο και φακέλους με δυαδικά τμήματα. Κάθε τμήμα περιέχει μια βιβλιοθήκη .framework ή .a για μια συγκεκριμένη πλατφόρμα.

bash
MyLibrary.xcframework/
  Info.plist
  ios-arm64/
    MyLibrary.framework/
      Info.plist
      MyLibrary
  ios-x86_64-simulator/
    MyLibrary.framework/
      Info.plist
      MyLibrary
  macos-arm64-x86_64/
    MyLibrary.framework/
      Info.plist
      MyLibrary

Το Info.plist του πακέτου περιέχει το κλειδί AvailableLibraries, που απαριθμεί τα αναγνωριστικά LibraryIdentifier, LibraryPath και SupportedPlatform για κάθε τμήμα. Το Xcode διαβάζει αυτό το αρχείο κατά την προσθήκη XCFramework στο έργο και διαμορφώνει αυτόματα τις διαδρομές αναζήτησης και τη φάση Embed Frameworks.

Κάθε τμήμα αποτελεί ένα πλήρες .framework ή στατική βιβλιοθήκη με δικό του Info.plist. Αυτό επιτρέπει στο XCFramework να υποστηρίζει μικτούς τύπους: στατικές βιβλιοθήκες για ορισμένες πλατφόρμες και δυναμικά frameworks για άλλες, αν και στην πράξη χρησιμοποιείται συχνότερα ένας τύπος για όλα τα τμήματα.

Δημιουργία XCFramework από τη γραμμή εντολών

Η δημιουργία XCFramework γίνεται μέσω xcodebuild -create-xcframework. Η εντολή δέχεται ήδη μεταγλωττισμένες βιβλιοθήκες .framework ή .a για κάθε πλατφόρμα και τις συνδυάζει σε ένα ενιαίο πακέτο.

Η διαδικασία αποτελείται από δύο βήματα: πρώτα μεταγλωττίζονται τα δυαδικά για κάθε πλατφόρμα στόχο, στη συνέχεια συσκευάζονται σε XCFramework. Για τη μεταγλώττιση χρησιμοποιούνται τυπικές σημαίες destination του Xcode.

bash
# Βήμα 1: δημιουργήστε frameworks για κάθε πλατφόρμα
xcodebuild archive -scheme MyLibrary -destination "generic/platform=iOS Simulator"
xcodebuild archive -scheme MyLibrary -destination "generic/platform=iOS"
xcodebuild archive -scheme MyLibrary -destination "generic/platform=macOS"

# Βήμα 2: δημιουργήστε XCFramework
xcodebuild -create-xcframework -framework ./iOS/MyLibrary.framework -framework ./iOSSim/MyLibrary.framework -framework ./macOS/MyLibrary.framework -output ./MyLibrary.xcframework

Η σημαία -create-xcframework εμφανίστηκε στο Xcode 11. Η εντολή δημιουργεί αυτόματα τη σωστή δομή καταλόγου και παράγει Info.plist με περιγραφή όλων των πλατφορμών. Αν ένα από τα .framework είναι κατεστραμμένο ή μεταγλωττισμένο με λάθος αρχιτεκτονική, το xcodebuild δίνει σφάλμα στο στάδιο επικύρωσης.

Αυτοματισμός μέσω σεναρίων μεταγλώττισης

Για CI/CD χρησιμοποιείται ένα σενάριο κελύφους που αυτοματοποιεί τη μεταγλώττιση για όλες τις πλατφόρμες και τη δημιουργία XCFramework. Μια δημοφιλής προσέγγιση είναι ένα περιτύλιγμα σε μορφή Makefile ή Fastlane lane με παραμετροποίηση scheme και output path.

bash
# build_xcframework.sh — σενάριο αυτοματισμού
set -e
SCHEME="MyLibrary"
OUTPUT="./build"

xcodebuild archive -scheme "$SCHEME" -sdk iphonesimulator -archivePath "$OUTPUT/sim.xcarchive"
xcodebuild archive -scheme "$SCHEME" -sdk iphoneos -archivePath "$OUTPUT/dev.xcarchive"
xcodebuild -create-xcframework -framework "$OUTPUT/dev.xcarchive/Products/Library/Frameworks/MyLibrary.framework" -framework "$OUTPUT/sim.xcarchive/Products/Library/Frameworks/MyLibrary.framework" -output "$OUTPUT/MyLibrary.xcframework"

Ένα τέτοιο σενάριο εκτελείται στο pipeline CI (GitHub Actions, Bitrise, Jenkins) μετά την εκτέλεση δοκιμών. Το προκύπτον XCFramework αρχειοθετείται και μεταφορτώνεται ως τεχνούργημα έκδοσης ή δημοσιεύεται μέσω διαχειριστή εξαρτήσεων όπως το CocoaPods με τη βοήθεια του pod spec.

Σύνδεση XCFramework σε έργο Xcode

Η σύνδεση XCFramework σε έργο Xcode δεν απαιτεί χειροκίνητη διαμόρφωση διαδρομών αναζήτησης. Αρκεί να σύρετε το .xcframework στην ενότητα Frameworks, Libraries, and Embedded Content στις ρυθμίσεις General του target.

Σε αντίθεση με το .framework, το XCFramework δεν απαιτεί προσθήκη φάσης Run Script για αφαίρεση αρχιτεκτονικών προσομοιωτή. Το Xcode καθορίζει αυτόματα τα διαθέσιμα τμήματα και περιλαμβάνει μόνο τα απαραίτητα για το τρέχον σχήμα μεταγλώττισης. Για φυσική συσκευή χρησιμοποιείται το τμήμα ios-arm64, για προσομοιωτή — ios-arm64-x86_64-simulator ή ios-x86_64-simulator.

swift
import MyLibrary

func processData() {
    // Το XCFramework επιλύει το σωστό τμήμα κατά τη μεταγλώττιση
    let processor = DataProcessor()
    let result = processor.analyze(input: "sample")
    print(result)
}

Για CocoaPods η ενσωμάτωση γίνεται μέσω podspec με καθορισμό vendored_frameworks και λίστας υποστηριζόμενων πλατφορμών. Ο διαχειριστής εξαρτήσεων καθορίζει αυτόματα ποια τμήματα χρειάζονται για το έργο. Πολλά εμπορικά SDK — Firebase, Adjust, AppsFlyer — έχουν μεταβεί στο XCFramework για απλοποίηση της εγκατάστασης.

Σύγκριση XCFramework και Swift Package Manager

Swift Package Manager και XCFramework δεν ανταγωνίζονται, αλλά αλληλοσυμπληρώνονται. Το SPM λειτουργεί με πηγαίο κώδικα και μεταγλωττίζει εξαρτήσεις σε κάθε μεταγλώττιση του έργου. Το XCFramework παρέχει έτοιμα δυαδικά αρχεία χωρίς να απαιτεί μεταγλώττιση από την πλευρά του καταναλωτή.

  • XCFramework — δυαδική παράδοση, προστασία πηγαίου κώδικα, υποστήριξη όλων των πλατφορμών Apple σε ένα πακέτο
  • SPM — εργασία με ανοικτό πηγαίο κώδικα, δυνατότητα επιθεώρησης, αυτόματη μεταγλώττιση για πλατφόρμα στόχο
  • Δυαδικές εξαρτήσεις SPM χρησιμοποιούν XCFramework ως μορφή συσκευασίας, συνδυάζοντας και τις δύο προσεγγίσεις

Με την κυκλοφορία του Swift Package Manager 5.3, η Apple πρόσθεσε υποστήριξη για δυαδικές εξαρτήσεις — τώρα το SPM μπορεί να φορτώσει XCFramework ως απομακρυσμένη εξάρτηση. Το Package.swift καθορίζει τη διεύθυνση URL του δυαδικού τεχνουργήματος και το άθροισμα ελέγχου του για επαλήθευση.

Σύμφωνα με το Swift Package Manager documentation (2024), οι δυαδικές εξαρτήσεις συνιστώνται για SDK που δεν αποκαλύπτουν τον πηγαίο κώδικα ή για βιβλιοθήκες των οποίων η μεταγλώττιση διαρκεί δυσανάλογα πολύ χρόνο. Για έργα ανοικτού κώδικα, προτιμάται η παράδοση με πηγαίο κώδικα μέσω SPM.

ΚριτήριοXCFrameworkSwift Package Manager
ΜορφήΔυαδική (.xcframework)Πηγαίος κώδικας
Προστασία κώδικαΠλήρηςΌχι
Χρόνος μεταγλώττισηςΕλάχιστος (αντιγραφή)Εξαρτάται από τον όγκο κώδικα
Ευελιξία πλατφορμώνΌλες οι πλατφόρμες AppleΕξαρτάται από Package.swift
ΕνσωμάτωσηDrag-and-drop ή SPMPackage.swift

Συχνές ερωτήσεις

Ποια είναι η διαφορά μεταξύ XCFramework και .framework;

.framework — μια παρωχημένη μορφή που περιέχει fat binary με αρχιτεκτονικές συσκευής και προσομοιωτή. Το XCFramework αποθηκεύει κάθε τμήμα ξεχωριστά, εξαλείφοντας συγκρούσεις αρχιτεκτονικής κατά τη μεταγλώττιση. Η Apple συνιστά XCFramework για όλα τα νέα έργα και μετεγκατάσταση υπαρχόντων.

Μπορεί να χρησιμοποιηθεί το XCFramework με CocoaPods;

CocoaPods υποστηρίζει XCFramework από την έκδοση 1.9. Στο podspec αρκεί να καθορίσετε spec.vendored_frameworks και spec.static_framework. Ο διαχειριστής επιλύει αυτόματα τις εξαρτήσεις, λαμβάνοντας υπόψη τα διαθέσιμα τμήματα για την πλατφόρμα του έργου.

Είναι υποχρεωτική η μετάβαση από .framework σε XCFramework;

Η Apple δεν αφαιρεί την υποστήριξη για .framework, αλλά για νέα SDK συνιστά αποκλειστικά XCFramework. Κατά την αποστολή εφαρμογής στο App Store με fat binary σε παλιά μορφή, είναι πιθανά σφάλματα Invalid Bundle λόγω αρχιτεκτονικών προσομοιωτή, γεγονός που καθιστά το XCFramework πρακτική αναγκαιότητα.

Πώς λειτουργεί το XCFramework με το Swift Package Manager;

Από Swift 5.3, οι δυαδικές εξαρτήσεις στο SPM χρησιμοποιούν XCFramework. Το Package.swift καθορίζει τη διεύθυνση url και το checksum του δυαδικού πακέτου. Το SPM κατεβάζει, επαληθεύει την ακεραιότητα και συνδέει το XCFramework ως εξάρτηση συστήματος χωρίς μεταγλώττιση πηγαίου κώδικα.

Υποστηρίζει το XCFramework την πλατφόρμα visionOS;

visionOS υποστηρίζεται στο XCFramework από το Xcode 15. Στο WWDC 2023, η Apple επιβεβαίωσε ότι η μορφή επεκτάθηκε για Apple Vision Pro. Το τμήμα για visionOS έχει SupportedPlatform = xros και περιλαμβάνει την αρχιτεκτονική arm64.

Σύνοψη

  • XCFramework — σύγχρονη μορφή Apple για δυαδική παράδοση βιβλιοθηκών, αντικαθιστά το .framework και λύνει προβλήματα fat binary
  • Ξεχωριστά τμήματα για κάθε πλατφόρμα και αρχιτεκτονική εξαλείφουν συγκρούσεις κατά τη μεταγλώττιση και την ανάγκη για φάσεις Run Script
  • Δημιουργία μέσω xcodebuild -create-xcframework αυτοματοποιείται σε CI/CD και δεν απαιτεί χειροκίνητη συγχώνευση δυαδικών μέσω lipo
  • Ενσωμάτωση στο έργο Xcode γίνεται σύροντας το .xcframework στην ενότητα Embedded Binaries χωρίς διαμόρφωση διαδρομών αναζήτησης
  • Swift Package Manager υποστηρίζει XCFramework για δυαδικές εξαρτήσεις, συνδυάζοντας ευκολία διαχείρισης με προστασία κώδικα
  • Όλες οι πλατφόρμες Apple — iOS, macOS, tvOS, watchOS και visionOS — υποστηρίζονται σε ένα πακέτο
  • Συνιστάται η χρήση XCFramework για όλα τα νέα SDK και κατά τη μετεγκατάσταση υπαρχουσών βιβλιοθηκών .framework

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης