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 اور Catalyst ایپلی کیشنز۔ ہر پلیٹ فارم کو پیکیج کے اندر ایک علیحدہ slice ملتا ہے، جو آرکیٹیکچر کے تنازعات کو ختم کرتا ہے اور 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 نے اسے فارمیٹ کی سطح پر حل کیا: ہر slice ایک علیحدہ فولڈر ہے جس میں Info.plist ہے جو ہدف پلیٹ فارم اور آرکیٹیکچر کو بیان کرتی ہے۔ Xcode بلڈ کے وقت خود بخود مطلوبہ slice کا انتخاب کرتا ہے، جس میں پوسٹ پروسیسنگ کی ضرورت نہیں۔
XCFramework میں ہر slice میں صرف ایک پلیٹ فارم-آرکیٹیکچر کا مجموعہ ہوتا ہے۔ مثال کے طور پر، ios-arm64 میں صرف iOS ڈیوائسز کے لیے بائنری ہے، اور ios-x86_64-simulator میں صرف Intel Mac سمیلیٹر کے لیے۔ Xcode خود بخود صحیح slice کا انتخاب کرتا ہے، آرکیٹیکچر ہٹانے والی اسکرپٹ کی ضرورت کو ختم کرتا ہے اور بلڈ خرابیوں کے خطرے کو کم کرتا ہے۔
ios-arm64-x86_64-simulator slice Apple Silicon Macs کی مدد کے لیے متعارف کرایا گیا تھا۔ پہلے، سمیلیٹر کو arm64 (Apple Silicon) اور x86_64 (Intel) کے لیے علیحدہ بائنری کی ضرورت ہوتی تھی۔ XCFramework ایک سمیلیٹر slice کے اندر fat binary کی اجازت دیتا ہے — یہ واحد استثنا ہے جہاں fat binary جائز ہے۔
XCFramework پیکیج ایک ڈائریکٹری ہے جس کا ایکسٹینشن .xcframework ہے، جس میں اوپری سطح پر Info.plist اور بائنری slices والے فولڈرز ہوتے ہیں۔ ہر slice میں کسی مخصوص پلیٹ فارم کے لیے .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 کلید ہوتی ہے، جو ہر slice کے لیے LibraryIdentifier، LibraryPath اور SupportedPlatform کی فہرست دیتی ہے۔ Xcode پروجیکٹ میں XCFramework شامل کرتے وقت اس فائل کو پڑھتا ہے اور خود بخود تلاش کے راستے اور Embed Frameworks مرحلہ ترتیب دیتا ہے۔
ہر slice اپنے Info.plist کے ساتھ ایک مکمل .framework یا جامد لائبریری ہے۔ یہ XCFramework کو مخلوط اقسام کی حمایت کرنے کی اجازت دیتا ہے: کچھ پلیٹ فارمز کے لیے جامد لائبریریاں اور دوسروں کے لیے متحرک فریم ورک، اگرچہ عملی طور پر تمام slices کے لیے ایک قسم استعمال ہوتی ہے۔
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 بنانے کو خودکار کرتا ہے۔ ایک مقبول طریقہ کار Makefile یا Fastlane lane کی شکل میں لپیٹنے والا ہے جس میں پیرامیٹرائزڈ scheme اور آؤٹ پٹ پاتھ ہوتا ہے۔
# 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 ترتیبات میں Frameworks, Libraries, and Embedded Content سیکشن میں .xcframework کو گھسیٹنا کافی ہے۔
.framework کے برعکس، XCFramework کو سمیلیٹر آرکیٹیکچرز ہٹانے کے لیے Run Script مرحلہ شامل کرنے کی ضرورت نہیں۔ Xcode خود بخود دستیاب slices کا تعین کرتا ہے اور صرف موجودہ بلڈ اسکیم کے لیے ضروری slices شامل کرتا ہے۔ فزیکل ڈیوائس کے لیے ios-arm64 slice استعمال ہوتا ہے، سمیلیٹر کے لیے — 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 کے ذریعے ہوتا ہے۔ انحصار مینیجر خود بخود تعین کرتا ہے کہ پروجیکٹ کے لیے کون سے slices ضروری ہیں۔ Firebase، Adjust، AppsFlyer جیسے بہت سے تجارتی SDK نے تنصیب کو آسان بنانے کے لیے 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 ہر slice کو علیحدہ محفوظ کرتا ہے، تعمیر کے دوران آرکیٹیکچر تنازعات کو ختم کرتا ہے۔ Apple تمام نئے پروجیکٹس اور موجودہ پروجیکٹس کی منتقلی کے لیے XCFramework کی سفارش کرتا ہے۔
CocoaPods ورژن 1.9 سے XCFramework کو سپورٹ کرتا ہے۔ podspec میں spec.vendored_frameworks اور spec.static_framework بتانا کافی ہے۔ مینیجر پروجیکٹ پلیٹ فارم کے لیے دستیاب slices کو مدنظر رکھتے ہوئے خود بخود انحصار حل کرتا ہے۔
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 کے slice میں SupportedPlatform = xros ہے اور arm64 آرکیٹیکچر شامل ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔