XCFramework — μια δυαδική μορφή της Apple που συνδυάζει βιβλιοθήκες για iOS, macOS, tvOS και watchOS σε ένα πακέτο. Σχεδιάστηκε για να αντικαταστήσει το .framework και να εξαλείψει τα προβλήματα των fat binaries κατά τη μεταγλώττιση για διαφορετικές αρχιτεκτονικές προσομοιωτή και συσκευής. Σύμφωνα με το Apple WWDC 2019, το XCFramework έγινε υποχρεωτική μορφή για την παράδοση SDK που υποστηρίζουν πολλές πλατφόρμες και αντικατέστησε πλήρως την παρωχημένη προσέγγιση με καθολικά δυαδικά αρχεία.
Κύρια σημεία
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 εφαρμόζεται σε τρία κύρια σενάρια: παράδοση κλειστών SDK σε προγραμματιστές τρίτων, διανομή εγγενών μονάδων για Flutter και React Native, και δημοσίευση βιβλιοθηκών που απαιτούν προηγούμενη μεταγλώττιση. Η μορφή είναι υποχρεωτική για όλα τα νέα SDK που δημοσιεύονται στο οικοσύστημα Apple.
Οι προγραμματιστές επιλέγουν XCFramework όταν ο πηγαίος κώδικας δεν μπορεί να αποκαλυφθεί, όταν η βιβλιοθήκη χρησιμοποιεί ιδιόκτητους αλγόριθμους ή όταν απαιτείται προστασία άδειας χρήσης. Σε αντίθεση με το Swift Package Manager που λειτουργεί με πηγαίο κώδικα, το XCFramework παραδίδει ήδη μεταγλωττισμένα δυαδικά αρχεία.
Το πρόβλημα 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, που περιέχει Info.plist στο ανώτερο επίπεδο και φακέλους με δυαδικά τμήματα. Κάθε τμήμα περιέχει μια βιβλιοθήκη .framework ή .a για μια συγκεκριμένη πλατφόρμα.
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 γίνεται μέσω xcodebuild -create-xcframework. Η εντολή δέχεται ήδη μεταγλωττισμένες βιβλιοθήκες .framework ή .a για κάθε πλατφόρμα και τις συνδυάζει σε ένα ενιαίο πακέτο.
Η διαδικασία αποτελείται από δύο βήματα: πρώτα μεταγλωττίζονται τα δυαδικά για κάθε πλατφόρμα στόχο, στη συνέχεια συσκευάζονται σε XCFramework. Για τη μεταγλώττιση χρησιμοποιούνται τυπικές σημαίες destination του Xcode.
# Βήμα 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.
# 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 στην ενότητα Frameworks, Libraries, and Embedded Content στις ρυθμίσεις General του target.
Σε αντίθεση με το .framework, το XCFramework δεν απαιτεί προσθήκη φάσης Run Script για αφαίρεση αρχιτεκτονικών προσομοιωτή. Το Xcode καθορίζει αυτόματα τα διαθέσιμα τμήματα και περιλαμβάνει μόνο τα απαραίτητα για το τρέχον σχήμα μεταγλώττισης. Για φυσική συσκευή χρησιμοποιείται το τμήμα ios-arm64, για προσομοιωτή — ios-arm64-x86_64-simulator ή ios-x86_64-simulator.
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 για απλοποίηση της εγκατάστασης.
Swift Package Manager και XCFramework δεν ανταγωνίζονται, αλλά αλληλοσυμπληρώνονται. Το SPM λειτουργεί με πηγαίο κώδικα και μεταγλωττίζει εξαρτήσεις σε κάθε μεταγλώττιση του έργου. Το XCFramework παρέχει έτοιμα δυαδικά αρχεία χωρίς να απαιτεί μεταγλώττιση από την πλευρά του καταναλωτή.
Με την κυκλοφορία του Swift Package Manager 5.3, η Apple πρόσθεσε υποστήριξη για δυαδικές εξαρτήσεις — τώρα το SPM μπορεί να φορτώσει XCFramework ως απομακρυσμένη εξάρτηση. Το Package.swift καθορίζει τη διεύθυνση URL του δυαδικού τεχνουργήματος και το άθροισμα ελέγχου του για επαλήθευση.
Σύμφωνα με το Swift Package Manager documentation (2024), οι δυαδικές εξαρτήσεις συνιστώνται για SDK που δεν αποκαλύπτουν τον πηγαίο κώδικα ή για βιβλιοθήκες των οποίων η μεταγλώττιση διαρκεί δυσανάλογα πολύ χρόνο. Για έργα ανοικτού κώδικα, προτιμάται η παράδοση με πηγαίο κώδικα μέσω SPM.
| Κριτήριο | XCFramework | Swift Package Manager |
|---|---|---|
| Μορφή | Δυαδική (.xcframework) | Πηγαίος κώδικας |
| Προστασία κώδικα | Πλήρης | Όχι |
| Χρόνος μεταγλώττισης | Ελάχιστος (αντιγραφή) | Εξαρτάται από τον όγκο κώδικα |
| Ευελιξία πλατφορμών | Όλες οι πλατφόρμες Apple | Εξαρτάται από Package.swift |
| Ενσωμάτωση | Drag-and-drop ή SPM | Package.swift |
Συχνές ερωτήσεις
.framework — μια παρωχημένη μορφή που περιέχει fat binary με αρχιτεκτονικές συσκευής και προσομοιωτή. Το XCFramework αποθηκεύει κάθε τμήμα ξεχωριστά, εξαλείφοντας συγκρούσεις αρχιτεκτονικής κατά τη μεταγλώττιση. Η Apple συνιστά XCFramework για όλα τα νέα έργα και μετεγκατάσταση υπαρχόντων.
CocoaPods υποστηρίζει XCFramework από την έκδοση 1.9. Στο podspec αρκεί να καθορίσετε spec.vendored_frameworks και spec.static_framework. Ο διαχειριστής επιλύει αυτόματα τις εξαρτήσεις, λαμβάνοντας υπόψη τα διαθέσιμα τμήματα για την πλατφόρμα του έργου.
Η Apple δεν αφαιρεί την υποστήριξη για .framework, αλλά για νέα SDK συνιστά αποκλειστικά XCFramework. Κατά την αποστολή εφαρμογής στο App Store με fat binary σε παλιά μορφή, είναι πιθανά σφάλματα Invalid Bundle λόγω αρχιτεκτονικών προσομοιωτή, γεγονός που καθιστά το XCFramework πρακτική αναγκαιότητα.
Από Swift 5.3, οι δυαδικές εξαρτήσεις στο SPM χρησιμοποιούν XCFramework. Το Package.swift καθορίζει τη διεύθυνση url και το checksum του δυαδικού πακέτου. Το SPM κατεβάζει, επαληθεύει την ακεραιότητα και συνδέει το XCFramework ως εξάρτηση συστήματος χωρίς μεταγλώττιση πηγαίου κώδικα.
visionOS υποστηρίζεται στο XCFramework από το Xcode 15. Στο WWDC 2023, η Apple επιβεβαίωσε ότι η μορφή επεκτάθηκε για Apple Vision Pro. Το τμήμα για visionOS έχει SupportedPlatform = xros και περιλαμβάνει την αρχιτεκτονική arm64.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης