XCFramework: ما هو، تنسيق التوزيع الثنائي وتطبيقه

المؤلف: IT Sectr نُشر: 2026-06-05 وقت القراءة: 7 دق

XCFramework هو تنسيق ثنائي من Apple يدمج المكتبات لأنظمة iOS وmacOS وtvOS وwatchOS في حزمة واحدة. تم تصميمه ليحل محل .framework ولحل مشاكل الثنائيات الضخمة (fat binaries) عند البناء لبنى معمارية مختلفة للمحاكي والجهاز. وفقاً لـ Apple WWDC 2019، أصبح XCFramework التنسيق الإلزامي لتوزيع SDK التي تدعم منصات متعددة، واستبدل بالكامل النهج القديم بالثنائيات الشاملة.

الخلاصة

  • XCFramework هو تنسيق Apple الشامل لتوزيع المكتبات، ويدعم منصات وبُنى متعددة في حزمة واحدة
  • تم استبدال نهج Fat binary بشرائح منفصلة لكل منصة، مما يلغي مشاكل البناء مع بنى المحاكي
  • يتم الإنشاء عبر xcodebuild -create-xcframework دون الحاجة لدمج الثنائيات يدوياً باستخدام lipo
  • يتم التوصيل في Xcode عبر Embed & Sign دون نصوص إضافية لإزالة بنى المحاكي
  • Swift Package Manager لا يحل محل XCFramework بالكامل — التبعيات الثنائية في SPM تُوزع بهذا التنسيق تحديداً

ما هو XCFramework؟

XCFramework هو تنسيق لتغليف المكتبات الثنائية والأطر، قدمته Apple في WWDC 2019. الهدف الرئيسي هو إنشاء حزمة واحدة تحتوي على إصدارات مترجمة من المكتبة لجميع المنصات والبُنى المستهدفة.

قبل XCFramework، كان المطورون يستخدمون .framework مع الثنائيات الضخمة التي تدمج بُنى متعددة عبر أداة lipo. تسبب هذا النهج في مشاكل: عند بناء مشروع للمحاكي، كان الثنائي الضخم يحتوي على بنية المحاكي والجهاز معاً، مما أدى إلى أخطاء عند إرسال البناء إلى App Store. كان على المطورين كتابة مراحل Run Script لإزالة البنى غير الضرورية.

وفقاً لوثائق مطوري Apple (2024)، يدعم XCFramework جميع منصات نظام Apple البيئي: iOS وiPadOS وmacOS وtvOS وwatchOS وvisionOS وتطبيقات Catalyst. كل منصة تحصل على شريحة منفصلة داخل الحزمة، مما يلغي تعارضات البنى ويبسط توزيع SDK.

متى تحتاج XCFramework؟

يُستخدم XCFramework في ثلاثة سيناريوهات رئيسية: توزيع SDK مغلقة المصدر لمطورين خارجيين، توزيع وحدات أصلية لـ Flutter وReact Native، ونشر المكتبات التي تتطلب تجميعاً مسبقاً. التنسيق إلزامي لجميع SDK الجديدة المنشورة في نظام Apple البيئي.

يختار المطورون XCFramework عندما لا يمكن الكشف عن كود المصدر، أو عندما تستخدم المكتبة خوارزميات احتكارية، أو عندما تكون حماية الترخيص مطلوبة. على عكس Swift Package Manager الذي يعمل مع كود المصدر، يُوصِل XCFramework ملفات ثنائية مترجمة بالفعل.

كيف يحل XCFramework مشكلة الثنائي الضخم؟

مشكلة الثنائي الضخم كانت أن الثنائي الشامل يحتوي على بُنى متعددة في ملف Mach-O واحد. عند بناء تطبيق للمحاكي، كان Xcode يضم كلاً من بنية الجهاز arm64 وبنية المحاكي x86_64 — و App Store يقبل فقط بنية الجهاز.

الحل التقليدي تضمن إضافة مرحلة Run Script تستدعي lipo لإزالة بنى المحاكي من البناء النهائي. كان هذا النهج هشاً ويتعطل مع تحديثات 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 لدعم Macs ذات Apple Silicon. سابقاً، كان المحاكي يتطلب ثنائياً منفصلاً لـ arm64 (Apple Silicon) و x86_64 (Intel). يسمح XCFramework بثنائي ضخم داخل شريحة محاكي واحدة — وهذا هو الاستثناء الوحيد حيث يكون الثنائي الضخم مبرراً.

هيكل حزمة XCFramework

حزمة XCFramework هي دليل بامتداد .xcframework، تحتوي على Info.plist في المستوى الأعلى ومجلدات بشرائح ثنائية. كل شريحة تتضمن مكتبة .framework أو .a لمنصة محددة.

bash
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 دعم الأنواع المختلطة: مكتبات ثابتة لبعض المنصات وأطر ديناميكية لأخرى، على الرغم من أنه عملياً يُستخدم نوع واحد لجميع الشرائح.

إنشاء XCFramework من سطر الأوامر

يتم إنشاء XCFramework عبر xcodebuild -create-xcframework. يأخذ الأمر مكتبات .framework أو .a مترجمة بالفعل لكل منصة ويجمعها في حزمة واحدة.

تتكون العملية من خطوتين: أولاً، يتم بناء الثنائيات لكل منصة مستهدفة، ثم يتم تغليفها في XCFramework. للبناء، تُستخدم أعلام الوجهة (destination flags) القياسية لـ Xcode.

bash
# 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، يُستخدم نص شل (shell script) لأتمتة البناء لجميع المنصات وإنشاء XCFramework. النهج الشائع هو غلاف على شكل Makefile أو Fastlane lane مع وسائط لـ scheme ومسار الإخراج.

bash
# 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 الناتج وتحميله كمنتج إصدار أو نشره عبر مدير تبعيات مثل CocoaPods باستخدام pod spec.

دمج XCFramework في مشروع Xcode

دمج 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.

swift
import MyLibrary

func processData() {
    // XCFramework resolves the correct slice at build time
    let processor = DataProcessor()
    let result = processor.analyze(input: "sample")
    print(result)
}

لـ CocoaPods، يتم التكامل عبر podspec مع vendored_frameworks وقائمة بالمنصات المدعومة. يحدد مدير التبعيات تلقائياً الشرائح التي يحتاجها المشروع. العديد من SDK التجارية — Firebase، Adjust، AppsFlyer — انتقلت إلى XCFramework لتبسيط التثبيت.

مقارنة XCFramework و Swift Package Manager

Swift Package Manager و XCFramework ليسا متنافسين بل يكملان بعضهما البعض. يعمل SPM مع كود المصدر ويبني التبعيات في كل بناء للمشروع. يوفر XCFramework ثنائيات جاهزة دون الحاجة إلى تجميع من جانب المستهلك.

  • XCFramework — توزيع ثنائي، حماية كود المصدر، دعم جميع منصات Apple في حزمة واحدة
  • SPM — العمل مع كود المصدر المفتوح، إمكانية الفحص، البناء التلقائي للمنصة المستهدفة
  • التبعيات الثنائية لـ SPM تستخدم XCFramework كتنسيق تغليف، مما يجمع بين كلا النهجين

مع إصدار Swift Package Manager 5.3، أضافت Apple دعم التبعيات الثنائية — الآن يمكن لـ SPM تنزيل XCFramework كتبعية عن بُعد. يحدد Package.swift عنوان URL للأداة الثنائية ومجموعها الاختباري للتحقق.

وفقاً لوثائق Swift Package Manager (2024)، يُوصى باستخدام التبعيات الثنائية لـ SDK التي لا تكشف عن كود المصدر، أو للمكتبات التي يستغرق بناؤها وقتاً غير متناسب. لمشاريع المصدر المفتوح، يُفضل توزيع كود المصدر عبر SPM.

المعيارXCFrameworkSwift Package Manager
التنسيقثنائي (.xcframework)كود مصدر
حماية الكودكاملةلا يوجد
وقت البناءأدنى حد (نسخ)يعتمد على حجم الكود
مرونة المنصاتجميع منصات Appleيعتمد على Package.swift
التكاملسحب وإفلات أو SPMPackage.swift

الأسئلة الشائعة

ما الفرق بين XCFramework و .framework؟

.framework هو تنسيق قديم يحتوي على ثنائي ضخم ببنى الجهاز والمحاكي. يخزن XCFramework كل شريحة على حدة، مما يلغي تعارضات البنى أثناء البناء. توصي Apple باستخدام XCFramework لجميع المشاريع الجديدة ولترحيل المشاريع الحالية.

هل يمكن استخدام XCFramework مع CocoaPods؟

CocoaPods يدعم XCFramework منذ الإصدار 1.9. في podspec، يكفي تحديد spec.vendored_frameworks و spec.static_framework. يقوم المدير تلقائياً بحل التبعيات، مع مراعاة الشرائح المتاحة لمنصة المشروع.

هل الانتقال من .framework إلى XCFramework إلزامي؟

Apple لا تزيل دعم .framework، لكنها توصي باستخدام XCFramework حصرياً لـ SDK الجديدة. عند إرسال تطبيق إلى App Store مع ثنائي ضخم بالتنسيق القديم، قد تحدث أخطاء Invalid Bundle بسبب بنى المحاكي، مما يجعل XCFramework ضرورة عملية.

كيف يعمل XCFramework مع Swift Package Manager؟

ابتداءً من Swift 5.3، تستخدم التبعيات الثنائية في SPM تنسيق XCFramework. يحدد Package.swift عنوان url والمجموع الاختباري للحزمة الثنائية. يقوم SPM بتنزيلها والتحقق من سلامتها وتوصيل XCFramework كتبعية نظام دون تجميع كود المصدر.

هل يدعم XCFramework منصة visionOS؟

visionOS مدعوم في XCFramework بدءاً من Xcode 15. في WWDC 2023، أكدت Apple أن التنسيق تم توسيعه لـ Apple Vision Pro. الشريحة الخاصة بـ visionOS لها SupportedPlatform = xros وتتضمن بنية arm64.

الملخص

  • XCFramework هو التنسيق الحديث من Apple للتوزيع الثنائي للمكتبات، ليحل محل .framework ويحل مشاكل الثنائي الضخم
  • الشرائح المنفصلة لكل منصة وبنية تلغي تعارضات البناء والحاجة إلى مراحل Run Script
  • الإنشاء عبر xcodebuild -create-xcframework يُؤتمت في CI/CD ولا يتطلب دمجاً يدوياً للثنائيات عبر lipo
  • التكامل في مشروع Xcode يتم بسحب .xcframework إلى قسم Embedded Binaries دون تكوين مسارات البحث
  • Swift Package Manager يدعم XCFramework للتبعيات الثنائية، مما يجمع بين سهولة الإدارة وحماية الكود
  • جميع منصات Apple — iOS وmacOS وtvOS وwatchOS وvisionOS — مدعومة في حزمة واحدة
  • يُوصى باستخدام XCFramework لجميع SDK الجديدة وعند ترحيل مكتبات .framework الحالية

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا