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 সমস্ত নতুন প্রকল্প এবং বিদ্যমান প্রকল্পগুলির migration-এর জন্য 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।