XCFramework एक Apple बाइनरी प्रारूप है जो iOS, macOS, tvOS और watchOS के लिए लाइब्रेरीज़ को एक पैकेज में जोड़ता है। इसे .framework को बदलने और विभिन्न सिम्युलेटर और डिवाइस आर्किटेक्चर के लिए निर्माण करते समय fat binaries की समस्याओं को खत्म करने के लिए डिज़ाइन किया गया था। Apple WWDC 2019 के अनुसार, XCFramework कई प्लेटफ़ॉर्म का समर्थन करने वाले SDK की आपूर्ति के लिए अनिवार्य प्रारूप बन गया और सार्वभौमिक बाइनरी के पुराने दृष्टिकोण को पूरी तरह से बदल दिया।
मुख्य बातें
XCFramework बाइनरी लाइब्रेरीज़ और फ्रेमवर्क के लिए एक पैकेजिंग प्रारूप है, जिसे Apple ने WWDC 2019 में पेश किया था। मुख्य उद्देश्य एक ऐसा बंडल बनाना है जिसमें सभी लक्ष्य प्लेटफ़ॉर्म और आर्किटेक्चर के लिए लाइब्रेरी के संकलित संस्करण हों।
XCFramework से पहले, डेवलपर्स lipo उपयोगिता के माध्यम से कई आर्किटेक्चर को संयोजित करने वाले fat binary के साथ .framework का उपयोग करते थे। यह दृष्टिकोण समस्याएँ पैदा करता था: सिम्युलेटर के लिए प्रोजेक्ट बनाते समय, fat binary में सिम्युलेटर और डिवाइस दोनों आर्किटेक्चर शामिल होते थे, जिससे App Store में बिल्ड सबमिट करते समय त्रुटियाँ होती थीं। डेवलपर्स को अनावश्यक आर्किटेक्चर हटाने के लिए Run Script चरण लिखने पड़ते थे।
Apple डेवलपर दस्तावेज़ीकरण (2024) के अनुसार, XCFramework Apple पारिस्थितिकी तंत्र के सभी प्लेटफ़ॉर्म का समर्थन करता है: iOS, iPadOS, macOS, tvOS, watchOS, visionOS और कैटलिस्ट अनुप्रयोग। प्रत्येक प्लेटफ़ॉर्म को पैकेज के अंदर एक अलग स्लाइस मिलता है, जो आर्किटेक्चर विरोध को समाप्त करता है और SDK वितरण को सरल बनाता है।
XCFramework का उपयोग तीन मुख्य परिदृश्यों में किया जाता है: तृतीय-पक्ष डेवलपर्स को बंद SDK वितरित करना, Flutter और React Native के लिए मूल मॉड्यूल वितरित करना, और उन लाइब्रेरीज़ को प्रकाशित करना जिन्हें पूर्व-संकलन की आवश्यकता होती है। Apple पारिस्थितिकी तंत्र में प्रकाशित सभी नए SDK के लिए यह प्रारूप अनिवार्य है।
डेवलपर्स XCFramework चुनते हैं जब स्रोत कोड का खुलासा नहीं किया जा सकता, जब लाइब्रेरी मालिकाना एल्गोरिदम का उपयोग करती है, या जब लाइसेंस सुरक्षा की आवश्यकता होती है। Swift Package Manager के विपरीत, जो स्रोत कोड के साथ काम करता है, XCFramework पहले से संकलित बाइनरी फ़ाइलें वितरित करता है।
Fat binary समस्या यह थी कि एक सार्वभौमिक बाइनरी में एक Mach-O फ़ाइल में कई आर्किटेक्चर होते थे। सिम्युलेटर के लिए ऐप बनाते समय, Xcode डिवाइस आर्किटेक्चर arm64 और सिम्युलेटर आर्किटेक्चर x86_64 दोनों शामिल करता था — App Store केवल डिवाइस आर्किटेक्चर स्वीकार करता था।
पारंपरिक समाधान में अंतिम बिल्ड से सिम्युलेटर आर्किटेक्चर हटाने के लिए lipo को कॉल करने वाला Run Script चरण जोड़ना शामिल था। यह दृष्टिकोण नाजुक था और Xcode अपडेट या नए आर्किटेक्चर (जैसे Apple Silicon पर सिम्युलेटर के लिए arm64) आने पर टूट जाता था।
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 Macs के समर्थन के लिए पेश किया गया था। पहले, सिम्युलेटर के लिए 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 चरण कॉन्फ़िगर करता है।
प्रत्येक स्लाइस अपने स्वयं के Info.plist के साथ एक पूर्ण .framework या स्थिर लाइब्रेरी है। यह XCFramework को मिश्रित प्रकारों का समर्थन करने की अनुमति देता है: कुछ प्लेटफ़ॉर्म के लिए स्थिर लाइब्रेरी और दूसरों के लिए गतिशील फ्रेमवर्क, हालाँकि व्यवहार में सभी स्लाइस के लिए एक प्रकार का उपयोग किया जाता है।
XCFramework बनाना xcodebuild -create-xcframework के माध्यम से किया जाता है। कमांड प्रत्येक प्लेटफ़ॉर्म के लिए पहले से निर्मित .framework या .a लाइब्रेरी इनपुट के रूप में लेता है और उन्हें एक पैकेज में जोड़ता है।
प्रक्रिया में दो चरण होते हैं: पहले, प्रत्येक लक्ष्य प्लेटफ़ॉर्म के लिए बाइनरी बनाई जाती हैं, फिर उन्हें XCFramework में पैकेज किया जाता है। निर्माण के लिए मानक Xcode destination फ़्लैग का उपयोग किया जाता है।
# Step 1: build frameworks for each platform
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"
# Step 2: create 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 बनाने को स्वचालित करने वाला शेल स्क्रिप्ट का उपयोग किया जाता है। लोकप्रिय दृष्टिकोण पैरामीटरयुक्त scheme और आउटपुट पथ के साथ Makefile या Fastlane lane के रूप में एक रैपर है।
# build_xcframework.sh - automation script
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"
ऐसी स्क्रिप्ट परीक्षण पास करने के बाद CI पाइपलाइन (GitHub Actions, Bitrise, Jenkins) में चलती है। परिणामी XCFramework को संग्रहीत किया जाता है और रिलीज़ आर्टिफ़ैक्ट के रूप में अपलोड किया जाता है या pod spec के माध्यम से CocoaPods जैसे निर्भरता प्रबंधक के माध्यम से प्रकाशित किया जाता है।
XCFramework को Xcode प्रोजेक्ट में शामिल करने के लिए खोज पथों के मैन्युअल कॉन्फ़िगरेशन की आवश्यकता नहीं होती। target की General सेटिंग्स में .xcframework को Frameworks, Libraries, and Embedded Content सेक्शन में खींचना पर्याप्त है।
.framework के विपरीत, XCFramework को सिम्युलेटर आर्किटेक्चर हटाने के लिए Run Script चरण जोड़ने की आवश्यकता नहीं होती। Xcode स्वचालित रूप से उपलब्ध स्लाइस निर्धारित करता है और वर्तमान बिल्ड योजना के लिए केवल आवश्यक स्लाइस शामिल करता है। भौतिक डिवाइस के लिए ios-arm64 स्लाइस का उपयोग किया जाता है, सिम्युलेटर के लिए — ios-arm64-x86_64-simulator या ios-x86_64-simulator।
import MyLibrary
func processData() {
// XCFramework resolves the correct slice at build time
let processor = DataProcessor()
let result = processor.analyze(input: "sample")
print(result)
}
CocoaPods के लिए, एकीकरण vendored_frameworks और समर्थित प्लेटफ़ॉर्म की सूची के साथ podspec के माध्यम से होता है। निर्भरता प्रबंधक स्वचालित रूप से निर्धारित करता है कि प्रोजेक्ट के लिए कौन से स्लाइस आवश्यक हैं। कई वाणिज्यिक 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 दस्तावेज़ीकरण (2024) के अनुसार, बाइनरी निर्भरताओं की सिफारिश उन SDK के लिए की जाती है जो स्रोत कोड प्रकट नहीं करते, या उन लाइब्रेरीज़ के लिए जिनका निर्माण अनुपातहीन रूप से लंबा समय लेता है। ओपन-सोर्स प्रोजेक्ट्स के लिए, SPM के माध्यम से स्रोत कोड वितरण को प्राथमिकता दी जाती है।
| मानदंड | XCFramework | Swift Package Manager |
|---|---|---|
| प्रारूप | बाइनरी (.xcframework) | स्रोत कोड |
| कोड सुरक्षा | पूर्ण | नहीं |
| निर्माण समय | न्यूनतम (कॉपी करना) | कोड की मात्रा पर निर्भर करता है |
| प्लेटफ़ॉर्म लचीलापन | सभी Apple प्लेटफ़ॉर्म | Package.swift पर निर्भर करता है |
| एकीकरण | खींचें-और-छोड़ें या SPM | Package.swift |
अक्सर पूछे जाने वाले प्रश्न
.framework एक पुराना प्रारूप है जिसमें डिवाइस और सिम्युलेटर आर्किटेक्चर के साथ fat binary होता है। XCFramework प्रत्येक स्लाइस को अलग-अलग संग्रहीत करता है, निर्माण के दौरान आर्किटेक्चर विरोध को समाप्त करता है। Apple सभी नए प्रोजेक्ट्स और मौजूदा प्रोजेक्ट्स के माइग्रेशन के लिए XCFramework की सिफारिश करता है।
CocoaPods संस्करण 1.9 से XCFramework का समर्थन करता है। podspec में spec.vendored_frameworks और spec.static_framework निर्दिष्ट करना पर्याप्त है। प्रबंधक प्रोजेक्ट प्लेटफ़ॉर्म के लिए उपलब्ध स्लाइस को ध्यान में रखते हुए स्वचालित रूप से निर्भरताओं को हल करता है।
Apple .framework का समर्थन नहीं हटाता, लेकिन नए SDK के लिए विशेष रूप से XCFramework की सिफारिश करता है। पुराने प्रारूप में fat binary के साथ App Store में ऐप सबमिट करते समय, सिम्युलेटर आर्किटेक्चर के कारण Invalid Bundle त्रुटियाँ हो सकती हैं, जो XCFramework को एक व्यावहारिक आवश्यकता बनाती हैं।
Swift 5.3 से शुरू करके, SPM में बाइनरी निर्भरताएँ XCFramework का उपयोग करती हैं। Package.swift बाइनरी पैकेज का url और checksum निर्दिष्ट करता है। SPM डाउनलोड करता है, अखंडता सत्यापित करता है और स्रोत कोड संकलित किए बिना XCFramework को सिस्टम निर्भरता के रूप में जोड़ता है।
visionOS Xcode 15 से XCFramework में समर्थित है। WWDC 2023 में Apple ने पुष्टि की कि प्रारूप Apple Vision Pro के लिए विस्तारित किया गया है। visionOS के लिए स्लाइस में SupportedPlatform = xros है और इसमें arm64 आर्किटेक्चर शामिल है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।