XCFramework — iOS, macOS, tvOS və watchOS üçün kitabxanaları bir paketdə birləşdirən Apple ikili formatı. .framework-i əvəz etmək və simulyator və cihazın müxtəlif arxitekturaları altında qurarkən fat binary problemlərini aradan qaldırmaq üçün hazırlanmışdır. Apple WWDC 2019 məlumatlarına görə, XCFramework bir neçə platformanı dəstəkləyən SDK-ların çatdırılması üçün məcburi format halına gəldi və universal ikili fayllarla köhnəlmiş yanaşmanı tamamilə əvəz etdi.
Əsas məqamlar
XCFramework — Apple tərəfindən WWDC 2019-da təqdim edilmiş ikili kitabxanaların və freymvorkların qablaşdırma formatı. Əsas məqsəd kitabxananın bütün hədəf platformalar və arxitekturalar üçün kompilyasiya edilmiş versiyalarını ehtiva edən bir bundle yaratmaqdır.
XCFramework meydana çıxmazdan əvvəl tərtibatçılar lipo vasitəsi ilə bir neçə arxitekturanı birləşdirən fat binary ilə .framework istifadə edirdilər. Bu yanaşma problemlər yaradırdı: simulyator üçün layihə qurarkən fat binary həm simulyator, həm də cihaz arxitekturasını ehtiva edirdi, bu da App Store-a qurma göndərərkən səhvlərə səbəb olurdu. Tərtibatçılar lazımsız arxitekturaları silmək üçün Run Script fazaları yazmalı idilər.
Apple Developer Documentation (2024) məlumatlarına görə, XCFramework Apple ekosisteminin bütün platformalarını dəstəkləyir: iOS, iPadOS, macOS, tvOS, watchOS, visionOS və katalizator tətbiqləri. Hər platforma paket daxilində ayrıca dilim alır ki, bu da arxitektura konfliktlərini aradan qaldırır və SDK-nın yayılmasını sadələşdirir.
XCFramework üç əsas ssenaridə tətbiq olunur: qapalı SDK-ların üçüncü tərəf tərtibatçılarına çatdırılması, Flutter və React Native üçün yerli modulların yayılması və ilkin kompilyasiya tələb edən kitabxanaların nəşri. Format Apple ekosistemində nəşr olunan bütün yeni SDK-lar üçün məcburidir.
Tərtibatçılar mənbə kodu açıqlana bilmədikdə, kitabxana mülkiyyət alqoritmlərindən istifadə etdikdə və ya lisenziya qorunması tələb olunduqda XCFramework-i seçirlər. Mənbə kodu ilə işləyən Swift Package Manager-dən fərqli olaraq, XCFramework artıq kompilyasiya edilmiş ikili faylları çatdırır.
Fat binary problemi ondan ibarət idi ki, universal ikili fayl bir Mach-O faylında bir neçə arxitekturanı ehtiva edirdi. Simulyator üçün tətbiq qurarkən Xcode ikili fayla cihazın arm64 arxitekturasını və simulyatorun x86_64 arxitekturasını daxil edirdi — App Store yalnız cihaz arxitekturasını qəbul edirdi.
Ənənəvi həll son qurmadan simulyator arxitekturalarını silmək üçün lipo çağırışı ilə Run Script fazasının əlavə edilməsini əhatə edirdi. Bu yanaşma kövrək idi və Xcode yeniləmələrində və ya yeni arxitekturalar əlavə edildikdə (məsələn, Apple Silicon-da simulyator üçün arm64) sıradan çıxırdı.
Swift.org (2023) məlumatlarına görə, Swift Package Manager komandası ilkin olaraq ikili asılılıqları dəstəkləməyə çalışarkən bu problemlə qarşılaşdı. XCFramework bunu format səviyyəsində həll etdi: hər dilim hədəf platforma və arxitekturanı təsvir edən Info.plist ilə ayrıca qovluqdur. Xcode qurma zamanı avtomatik olaraq uyğun dilimi seçir, post-emal tələb olunmur.
XCFramework-də hər dilim yalnız bir platforma və arxitektura kombinasiyasını ehtiva edir. Məsələn, ios-arm64 yalnız iOS cihazları üçün ikili fayl, ios-x86_64-simulator isə yalnız Intel Mac simulyatoru üçündür. Xcode avtomatik olaraq düzgün dilimi seçir, arxitekturaların silinməsi skriptlərinə ehtiyacı aradan qaldırır və qurma xətaları riskini azaldır.
ios-arm64-x86_64-simulator dilimi Apple Silicon Mac-in dəstəyi üçün meydana çıxdı. Əvvəllər simulyator üçün arm64 (Apple Silicon) və x86_64 (Intel) altında ayrıca ikili fayl tələb olunurdu. XCFramework simulyator üçün bir dilim daxilində fat binary-ə icazə verir — bu, fat binary-nin əsaslandırıldığı yeganə istisnadır.
XCFramework paketi .xcframework genişlənməsi olan, yuxarı səviyyədə Info.plist və ikili dilimlərlə qovluqları ehtiva edən kataloqdur. Hər dilim müəyyən platforma üçün .framework və ya .a kitabxanasını ehtiva edir.
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
Paketin Info.plist faylı hər dilim üçün LibraryIdentifier, LibraryPath və SupportedPlatform identifikatorlarını sadalayan AvailableLibraries açarını ehtiva edir. Xcode layihəyə XCFramework əlavə edərkən bu faylı oxuyur və axtarış yollarını və Embed Frameworks fazasını avtomatik konfiqurasiya edir.
Hər dilim öz Info.plist ilə tam hüquqlu .framework və ya statik kitabxanadır. Bu, XCFramework-ə qarışıq tipləri dəstəkləməyə imkan verir: bəzi platformalar üçün statik kitabxanalar və digərləri üçün dinamik freymvorklar, baxmayaraq ki, praktikada bütün dilimlər üçün bir tip daha çox istifadə olunur.
XCFramework yaradılması xcodebuild -create-xcframework vasitəsilə həyata keçirilir. Əmr hər platforma üçün artıq kompilyasiya edilmiş .framework və ya .a kitabxanalarını qəbul edir və onları vahid paketdə birləşdirir.
Proses iki addımdan ibarətdir: əvvəlcə hər hədəf platforma üçün ikili fayllar kompilyasiya edilir, sonra onlar XCFramework-ə qablaşdırılır. Kompilyasiya üçün standart Xcode destination flagları istifadə olunur.
# Addım 1: hər platforma üçün freymvorklar qurun
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"
# Addım 2: XCFramework yaradın
xcodebuild -create-xcframework -framework ./iOS/MyLibrary.framework -framework ./iOSSim/MyLibrary.framework -framework ./macOS/MyLibrary.framework -output ./MyLibrary.xcframework
-create-xcframework flagı Xcode 11-də meydana çıxdı. Əmr avtomatik olaraq düzgün kataloq strukturu yaradır və bütün platformaların təsviri ilə Info.plist generasiya edir. Əgər .framework-lərdən biri zədələnibsə və ya yanlış arxitektura ilə kompilyasiya edilibsə, xcodebuild validasiya mərhələsində xəta verir.
CI/CD üçün bütün platformalar altında qurmanı və XCFramework yaradılmasını avtomatlaşdıran shell skripti istifadə olunur. Populyar yanaşma scheme və output path parametrləşdirilməsi ilə Makefile və ya Fastlane leyen formasında sarğıdır.
# build_xcframework.sh — avtomatlaşdırma skripti
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"
Belə bir skript testlərdən sonra CI pipeline-da (GitHub Actions, Bitrise, Jenkins) icra olunur. Nəticədə alınan XCFramework arxivləşdirilir və buraxılış artefaktı kimi yüklənir və ya pod spec vasitəsilə CocoaPods kimi asılılıq meneceri vasitəsilə nəşr olunur.
XCFramework-in Xcode layihəsinə qoşulması axtarış yollarının əl ilə konfiqurasiyasını tələb etmir. Target parametrlərində General bölməsində Frameworks, Libraries, and Embedded Content hissəsinə .xcframework-i sürükləmək kifayətdir.
.framework-dən fərqli olaraq, XCFramework simulyator arxitekturalarını silmək üçün Run Script fazasının əlavə edilməsini tələb etmir. Xcode mövcud dilimləri avtomatik müəyyənləşdirir və yalnız cari qurma sxemi üçün lazım olanları daxil edir. Fiziki cihaz üçün ios-arm64 dilimi, simulyator üçün — ios-arm64-x86_64-simulator və ya ios-x86_64-simulator istifadə olunur.
import MyLibrary
func processData() {
// XCFramework qurma zamanı düzgün dilimi həll edir
let processor = DataProcessor()
let result = processor.analyze(input: "sample")
print(result)
}
CocoaPods üçün inteqrasiya vendored_frameworks və dəstəklənən platformaların siyahısını göstərən podspec vasitəsilə həyata keçirilir. Asılılıq meneceri layihə üçün hansı dilimlərin lazım olduğunu avtomatik müəyyənləşdirir. Bir çox kommersiya SDK-ları — Firebase, Adjust, AppsFlyer — quraşdırmanı sadələşdirmək üçün XCFramework-ə keçib.
Swift Package Manager və XCFramework rəqabət aparmır, bir-birini tamamlayır. SPM mənbə kodu ilə işləyir və layihənin hər qurulmasında asılılıqları kompilyasiya edir. XCFramework istehlakçı tərəfində kompilyasiya tələb etmədən hazır ikili fayllar təqdim edir.
Swift Package Manager 5.3 buraxılışı ilə Apple ikili asılılıqların dəstəyini əlavə etdi — indi SPM XCFramework-i uzaq asılılıq kimi yükləyə bilər. Package.swift ikili artefaktın URL-ni və doğrulama üçün onun checksum-nı göstərir.
Swift Package Manager documentation (2024) məlumatlarına görə, ikili asılılıqlar mənbə kodunu açıqlamayan SDK-lar və ya kompilyasiyası qeyri-mütənasib çox vaxt aparan kitabxanalar üçün tövsiyə olunur. Open-source layihələr üçün SPM vasitəsilə mənbə kodu ilə çatdırılma üstünlük təşkil edir.
| Kriteriya | XCFramework | Swift Package Manager |
|---|---|---|
| Format | İkili (.xcframework) | Mənbə kodu |
| Kodun qorunması | Tam | Yox |
| Qurma vaxtı | Minimal (kopiyalama) | Kod həcmindən asılıdır |
| Platforma elastikliyi | Bütün Apple platformaları | Package.swift-dən asılıdır |
| İnteqrasiya | Drag-and-drop və ya SPM | Package.swift |
Tez-tez verilən suallar
.framework — cihaz və simulyator arxitekturaları ilə fat binary ehtiva edən köhnəlmiş format. XCFramework hər dilimi ayrıca saxlayır, qurma zamanı arxitektura konfliktlərini aradan qaldırır. Apple bütün yeni layihələr və mövcud miqrasiyalar üçün XCFramework tövsiyə edir.
CocoaPods 1.9 versiyasından başlayaraq XCFramework-i dəstəkləyir. Podspec-də spec.vendored_frameworks və spec.static_framework göstərmək kifayətdir. Menecer layihənin platforması üçün mövcud dilimləri nəzərə alaraq asılılıqları avtomatik həll edir.
Apple .framework dəstəyini silmir, lakin yeni SDK-lar üçün yalnız XCFramework tövsiyə edir. Köhnə formatda fat binary ilə App Store-a tətbiq göndərərkən simulyator arxitekturaları səbəbindən Invalid Bundle xətası mümkündür ki, bu da XCFramework-i praktik zərurətə çevirir.
Swift 5.3-dən başlayaraq, SPM-də ikili asılılıqlar XCFramework-dən istifadə edir. Package.swift ikili paketin url və checksum-nı göstərir. SPM yükləyir, bütövlüyü yoxlayır və mənbə kodunun kompilyasiyası olmadan XCFramework-i sistem asılılığı kimi qoşur.
visionOS XCFramework-də Xcode 15-dən başlayaraq dəstəklənir. WWDC 2023-də Apple formatın Apple Vision Pro üçün genişləndirildiyini təsdiqlədi. visionOS üçün dilim SupportedPlatform = xros ilə və arm64 arxitekturasını ehtiva edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun