CocoaPods هو مدير تبعيات مفتوح المصدر لمشاريع iOS وmacOS وwatchOS وtvOS. تم بناء CocoaPods بلغة Ruby ويستخدم سجل مواصفات (Specs) يحتوي على أكثر من 100٬000 مكتبة. يتم التكامل من خلال ملف Podfile، الذي يصف جميع تبعيات المشروع. نتيجة التثبيت هي .xcworkspace، الذي يدمج المشروع الرئيسي مع جميع الوحدات المتصلة. يظل CocoaPods مدير التبعيات الأكثر شعبية في تطوير iOS: وفقًا لاستطلاع Stack Overflow Survey (2025)، يستخدمه 34% من مطوري iOS.
النقاط الرئيسية
pod install ينشئ .xcworkspace — يجب فتح هذا الملف فقط في XcodeCocoaPods هو مدير تبعيات لنظام Apple البيئي، مكتوب بلغة Ruby وتم إصداره في عام 2011 بواسطة Eladio Lopez. يحل CocoaPods مشكلة دمج المكتبات الخارجية في مشاريع Xcode: بدلاً من نسخ الملفات يدويًا وتكوين علامات الرابط، يصف المطور التبعيات في Podfile ويشغل pod install. يقوم CocoaPods تلقائيًا بتنزيل الملفات المصدرية، وتكوين علامات المترجم، وإنشاء مساحة العمل .xcworkspace.
تتضمن بنية CocoaPods ثلاثة مكونات: CocoaPods.app (أداة CLI)، Specs (سجل المواصفات المركزي على GitHub)، وPodfile (تكوين المشروع). يحتوي سجل Specs على أكثر من 100٬000 مكتبة مع سجل إصدارات. عند تشغيل pod install، يقوم CocoaPods بتنزيل أحدث إصدار من السجل (pod repo update)، ويجد التبعيات، ويحل شجرة الإصدارات، وينشئ .xcworkspace مع جميع تكاملات pods. يتم تجميع كل مكتبة كهدف منفصل، مما يسمح بعزل التبعيات وتجنب تضارب الأسماء.
CocoaPods متكامل بشكل وثيق مع Xcode: يقوم بإنشاء ملفات Pods.xcconfig مع مسارات الرؤوس وعلامات الرابط، وتكوين User Script Sandboxing. لاستخدام CocoaPods على macOS، يلزم Ruby 2.6+ (مثبت مسبقًا على جميع أجهزة Mac) وXcode مع أدوات سطر الأوامر. إحصائيات: في عام 2025، قام CocoaPods بمعالجة أكثر من 10 مليارات تنزيل pod، ويحتوي مشروع iOS المتوسط على 15 إلى 40 تبعية عبر CocoaPods.
CocoaPods يقوم بتنزيل كل مكتبة كمستودع Git منفصل، ويتحقق من مواصفاتها .podspec ويجمعها في إطار عمل ثابت أو مكتبة ديناميكية. يمكن أن تعتمد pods على pods أخرى — يقوم CocoaPods ببناء رسم بياني للتبعيات وحل تضارب الإصدارات. إذا تطلبت مكتبتان إصدارات مختلفة من نفس التبعية، يحاول CocoaPods إيجاد إصدار متوافق أو يبلغ عن خطأ. يتم تسجيل جميع التبعيات وإصداراتها في ملف Podfile.lock، الذي يجب إضافته إلى نظام التحكم في الإصدارات.
مزايا CocoaPods على التكامل اليدوي: إدارة تلقائية للتبعيات، سجل مركزي للمكتبات، دعم للتبعيات الفرعية (subspecs)، إمكانية إنشاء مستودعات خاصة والتحكم الدلالي في الإصدارات. لفريق التطوير، يضمن CocoaPods أن جميع الأعضاء يستخدمون نفس إصدارات المكتبات — Podfile.lock يضمن قابلية إعادة إنتاج البناء على أي جهاز.
Podfile هو ملف تكوين بلغة Ruby يحدد تبعيات مشروع Xcode. يتم وضع Podfile في جذر المشروع بجانب .xcodeproj. تعتمد صيغة CocoaPods على Ruby DSL (لغة خاصة بالمجال)، مما يسمح باستخدام المتغيرات والشروط والحلقات. يحتوي Podfile الأدنى على نظام أساسي وتبعية واحدة على الأقل.
platform :ios, '15.0'
target 'MyApp' do
pod 'Alamofire', '~> 5.9'
pod 'SnapKit', '~> 5.7'
pod 'Kingfisher', '~> 8.0'
endالسطر الرئيسي platform :ios, '15.0' يحدد الحد الأدنى لإصدار iOS. توجيه target 'MyApp' يجمع التبعيات لهدف معين. كل سطر pod 'Name', '~> version' يحدد اسم المكتبة والإصدار. العامل '~> 5.9' يعني "أي إصدار من 5.9 إلى 6.0، باستثناء 6.0" — هذا هو التحكم الدلالي في الإصدارات الذي يحمي من التغييرات الجذرية.
CocoaPods يدعم عوامل إصدار مرنة: '= 1.0' (إصدار دقيق)، '>= 1.0' (أدنى)، '< 2.0' (أقصى)، '~> 1.2.3' (تصحيح فقط). يمكن تضمين مكتبة من مجلد محلي عبر pod 'MyLib', :path => '../MyLib'. للتضمين من Git — pod 'MyLib', :git => 'https://github.com/user/MyLib.git', :tag => '1.0.0'.
platform :ios, '15.0'
use_frameworks! :linkage => :static
inhibit_all_warnings!
target 'MyApp' do
pod 'Alamofire', '~> 5.9'
pod 'Firebase/Crashlytics', '~> 11.0'
target 'MyAppTests' do
inherit! :search_paths
pod 'Nimble', '~> 13.0'
end
end
target 'MyWatchExtension' do
platform :watchos, '9.0'
pod 'Alamofire', '~> 5.9'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
enduse_frameworks! يفعل تجميع pods كإطارات عمل بدلاً من المكتبات الثابتة (السلوك الافتراضي منذ Xcode 15+). السمة :linkage => :static تجبر إطارات العمل على أن تكون ثابتة، مما يقلل حجم التطبيق. inhibit_all_warnings! يثبط التحذيرات من pods — مفيد لنقاء سجل البناء. الأهداف المتداخلة (مثل الاختبارات) مع inherit! :search_paths تتلقى مسارات بحث فقط دون إعادة تجميع جميع التبعيات. كتلة post_install تهيئ إعدادات البناء لجميع أهداف pod — هذا نمط قياسي لتعيين إصدار iOS أدنى موحد.
Podfile.lock يتم إنشاؤه تلقائيًا أثناء pod install. يثبت الإصدارات الدقيقة لجميع التبعيات المثبتة، بما في ذلك التبعيات غير المباشرة. يجب الاحتفاظ بملف القفل في المستودع — بدونه، قد يقوم pod install على جهاز آخر بتثبيت إصدارات مختلفة. الأمر pod update PodName يحدث pod معينًا، مما يعدل Podfile.lock. pod outdated يعرض قائمة pods المتاحة بإصدارات أحدث.
Podspec هو ملف Ruby بامتداد .podspec يصف مكتبة لـ CocoaPods. يحتوي Podspec على بيانات وصفية (اسم، إصدار، مؤلف)، كود مصدري، تبعيات، أطر عمل النظام ومتطلبات النظام الأساسي. يتحقق CocoaPods من صحة podspec باستخدام pod spec lint قبل النشر في السجل.
Pod::Spec.new do |s|
s.name = 'NetworkingKit'
s.version = '1.2.0'
s.summary = 'Lightweight HTTP client for iOS'
s.description = 'NetworkingKit is a Swift HTTP client with async/await support, built-in caching, and automatic retry logic.'
s.homepage = 'https://github.com/user/NetworkingKit'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Developer' => 'dev@example.com' }
s.source = { :git => 'https://github.com/user/NetworkingKit.git', :tag => s.version.to_s }
s.ios.deployment_target = '15.0'
s.swift_version = '5.9'
s.source_files = 'Sources/**/*.swift'
s.dependency 'Alamofire', '~> 5.9'
ends.name — الاسم الفريد للمكتبة في السجل. s.version يتوافق مع علامة Git (مهم للنشر). s.source_files — نمط glob لتضمين الملفات المصدرية. s.dependency يحدد تبعية على pods أخرى مع إصدار. s.ios.deployment_target يحدد الحد الأدنى لإصدار iOS المدعوم — سيحذر CocoaPods تلقائيًا إذا كان المشروع يستخدم إصدارًا أقدم. للـ pods الخاصة، يمكن استخدام :path في Podfile بدلاً من النشر في السجل.
يتم نشر مكتبة في سجل Specs المركزي عبر pod trunk push NetworkingKit.podspec. التسجيل المسبق مطلوب من خلال pod trunk register dev@example.com 'Developer'. يتحقق CocoaPods من صحة podspec ويرسل طلب سحب إلى مستودع Specs. البديل هو سجل خاص عبر pod repo push للمكتبات الداخلية للشركة.
التبعيات الفرعية (Subspecs) تسمح بتقسيم المكتبة إلى وحدات يمكن للمستخدمين تضمينها بشكل انتقائي. على سبيل المثال، تستخدم Firebase تبعيات فرعية: pod 'Firebase/Crashlytics' يضم فقط Crashlytics بدون وحدات Firebase الأخرى. ترث التبعيات الفرعية التكوين الأساسي ويمكنها إضافة source_files وتبعيات خاصة بها.
| الأمر | الإجراء |
|---|---|
pod spec lint | التحقق من صحة podspec |
pod trunk register | التسجيل في CocoaPods Trunk |
pod trunk push | نشر podspec في السجل |
pod repo push | النشر في سجل خاص |
pod lib lint | التحقق المحلي من المكتبة |
CocoaPods يتم تثبيته عبر RubyGems — مدير الحزم القياسي لـ Ruby. Ruby مثبت مسبقًا على macOS، لذا يكفي أمر واحد في الطرفية. البديل هو Homebrew، الذي يثبت CocoaPods كصيغة منفصلة. بعد التثبيت، يتم تهيئة المشروع بأمر pod init، الذي ينشئ Podfile بتكوين أساسي. بعد ملء Podfile بالتبعيات، يشغل المطور pod install — يقوم CocoaPods بتنزيل المكتبات وإنشاء مساحة العمل.
# تثبيت CocoaPods عبر RubyGems
sudo gem install cocoapods
# تثبيت بديل عبر Homebrew
brew install cocoapods
# تهيئة Podfile في المشروع
cd /path/to/Project
pod init
# تثبيت التبعيات
pod installقاعدة مهمة: بعد pod install، افتح دائمًا .xcworkspace، وليس .xcodeproj. إذا فتحت .xcodeproj، لن ير Xcode الـ pods وسيفشل البناء بأخطاء الربط. أمر pod install يقوم بتنزيل التبعيات فقط عند تغيير Podfile أو في التشغيل الأول. لإعادة تثبيت جميع pods بالقوة، استخدم pod install --repo-update أو pod deintegrate && pod install.
تحديث CocoaPods يتم عبر sudo gem update cocoapods أو brew upgrade cocoapods. يتم التحقق من إصدار CocoaPods بأمر pod --version. منذ الإصدار 1.12 (2024)، يدعم CocoaPods Xcode 15 مع إعدادات التحقق الصارمة للوحدات وتحسين حل التبعيات غير المباشرة. أحدث إصدار ثابت في منتصف 2025 هو 1.16 مع دعم Swift 6 وأداء محسن لحل رسم بياني للتبعيات للمشاريع التي تحتوي على أكثر من 50 pod.
# تحديث جميع pods إلى أحدث الإصدارات
pod update
# تحديث pod محدد
pod update Alamofire
# التحقق من التبعيات القديمة
pod outdated
# إزالة CocoaPods من المشروع
pod deintegratepod update بدون وسائط يحدث جميع pods إلى أحدث الإصدارات المتوافقة وفقًا لـ Podfile (مع مراعاة عوامل ~>). pod outdated يظهر الفرق بين الإصدار الحالي في Podfile.lock وأحدث إصدار متاح. pod deintegrate يزيل CocoaPods بالكامل من المشروع — يزيل .xcworkspace وملفات التكوين وإعدادات البناء. هذا مفيد عند الترحيل إلى Swift Package Manager.
إدارة التبعيات في CocoaPods تشمل أربعة جوانب: تثبيت الإصدارات، حل النزاعات، تحسين البناء والتعامل مع التبعيات غير المباشرة. يبني CocoaPods رسمًا بيانيًا للتبعيات بناءً على Podfile.lock — إذا كان المشروع يستخدم المكتبتين A وB، وكلتاهما تعتمدان على C، يجد CocoaPods إصدار C الذي يرضي كلا المتطلبين.
تنشأ النزاعات عندما تتطلب تبعيتان إصدارات غير متوافقة من نفس المكتبة. يبلغ CocoaPods عن خطأ يشير إلى المتطلبات المتعارضة. الحلول: تحديث إحدى التبعيات إلى إصدار متوافق، استخدام pod 'Lib', :git => ... مع commit محدد، أو عمل fork لإحدى المكتبات مع تبعية معدلة. للمشاريع الكبيرة، يوصى بإعداد التحقق CI باستخدام pod lib lint على كل طلب سحب.
CocoaPods يقدم عدة إمكانيات متقدمة: :path للتطوير المحلي للمكتبات، :git لربط forks، :branch لاختبار فروع التطوير. توجيه use_frameworks! مع :linkage => :static يقلل حجم الملف الثنائي النهائي. لاختبار A/B ومفاتيح الميزات، يمكن تضمين إصدارات مختلفة من pods عبر إنشاءات شرطية Ruby في Podfile.
platform :ios, '15.0'
use_frameworks!
# تحديد البيئة
is_debug = defined?(DEBUG) && DEBUG
target 'MyApp' do
# التبعيات الأساسية
pod 'Alamofire', '~> 5.9'
pod 'SnapKit', '~> 5.7'
# مكتبة محلية للتطوير
pod 'MyInternalLib', :path => '../MyInternalLib'
# تبعية شرطية للتصحيح
if is_debug
pod 'SwiftyBeaver', '~> 2.0'
else
pod 'CocoaLumberjack', '~> 3.8'
end
# fork مع إصلاح خطأ
pod 'Kingfisher', :git => 'https://github.com/user/Kingfisher.git', :branch => 'fix-memory-leak'
end
abstract_target 'Pods' do
pod 'Alamofire'
endabstract_target ينشئ هدفًا افتراضيًا للتبعيات المشتركة دون ربط بهدف Xcode محدد. تسمح الإنشاءات الشرطية Ruby بتضمين مكتبات مختلفة لتكوينات Debug و Release. :path مع مكتبة محلية يسرع التطوير — يتم تطبيق التغييرات دون إعادة تشغيل pod install. وضع :branch مفيد لاختبار التغييرات قبل الإصدار الرسمي.
CocoaPods وSwift Package Manager (SPM) وCarthage هم ثلاثة مدراء تبعيات رئيسيين في تطوير iOS. لكل منها بنيته الخاصة، ونهج التكامل ومستوى التحكم. يتصدر CocoaPods في عدد المكتبات، يفوز SPM بدعم Xcode المدمج، يتراجع Carthage في الشعبية لكنه يوفر أقصى تحكم.
| المعيار | CocoaPods | SPM | Carthage |
|---|---|---|---|
| لغة التكوين | Ruby DSL | Package.swift (Swift) | Cartfile |
| التكامل مع Xcode | عبر workspace | مدمج | يدوي (xcframeworks) |
| عدد المكتبات | أكثر من 100٬000 | ~65٬000 | ~20٬000 |
| التبعيات غير المباشرة | تلقائيًا | تلقائيًا | يدويًا |
| دعم الموارد | نعم (حزم موارد) | نعم (موارد) | لا |
| سرعة التثبيت | متوسطة | سريعة | سريعة |
| التحكم في الإصدارات | Gemfile.lock | Package.resolved | Cartfile.resolved |
CocoaPods يظل الخيار للمشاريع التي تتطلب أقصى توافق مع المكتبات (العديد من المكتبات القديمة متاحة فقط عبر CocoaPods). SPM موصى به للمشاريع الجديدة — فهو مدمج في Xcode، لا يتطلب أدوات إضافية ومدعوم من Apple. Carthage يستخدم نادرًا، بشكل أساسي للمشاريع التي تتطلب تدخلًا أدنى في تكوين Xcode. منذ 2024، تعمل Apple بنشاط على تطوير SPM، والعديد من المكتبات الشهيرة (Alamofire، Firebase، SnapKit) تدعمه بالفعل جنبًا إلى جنب مع CocoaPods.
الترحيل من CocoaPods إلى SPM يتم عبر pod deintegrate (إزالة CocoaPods) وإضافة الحزم عبر File → Add Package Dependencies في Xcode. التحديات الرئيسية: المكتبات ذات الموارد (الخطوط، الصور، القصص المصورة) قد تتصرف بشكل مختلف، وإضافات CocoaPods (مثل توليد الكود) ليس لها نظائر في SPM. يوصى بالاحتفاظ بـ CocoaPods للمشاريع التي تتطلب ميزات خاصة بـ CocoaPods: توليد الكود، حزم الموارد ومراحل البناء المخصصة عبر hooks post_install.
CocoaPods أداة مستقرة، لكن المطورين يواجهون أحيانًا مشكلات نموذجية. معظمها مرتبطة بإصدارات Ruby أو التخزين المؤقت أو تضارب التبعيات. فيما يلي السيناريوهات الأكثر شيوعًا وحلولها.
خطأ "The sandbox is not in sync with the Podfile.lock" — يحدث عندما يتم تغيير Podfile.lock في المستودع قبل تشغيل pod install. الحل: تشغيل pod install أو pod deintegrate && pod install. لبيئات CI، يوصى بإضافة pod install إلى نص البناء. سبب شائع آخر هو اختلاف إصدار CocoaPods بين المطورين: تحقق من pod --version على جميع الأجهزة.
خطأ أثناء تحديث سجل Specs — عادةً بسبب مشاكل الشبكة أو مستودع Git قديم. الحل: pod repo update --verbose يعرض التفاصيل. إذا كان Specs تالفًا: rm -rf ~/.cocoapods/repos/master && pod repo add master https://github.com/CocoaPods/Specs.git. للإنترنت البطيء، يمكن استخدام CDN — مفعل افتراضيًا منذ CocoaPods 1.8+.
خطأ الرموز المكررة (Duplicate symbols) — يحدث عند تضمين مكتبة مرتين أو عند تضارب رموز بين pods. الحل: تحقق من Podfile للتكرار، استخدم use_frameworks! :linkage => :static لعزل الرموز. إذا كانت المشكلة في المكتبة، أبلغ المؤلف. أحيانًا يساعد تنظيف Derived Data وإعادة تشغيل Xcode.
لا يتم تثبيت CocoaPods على Apple Silicon Mac — Ruby المثبت مسبقًا على macOS يعمل عبر Rosetta 2، مما يسبب أخطاء تجميع. الحل: تثبيت Ruby عبر rbenv أو asdf للبنية الأصلية ARM64. البديل: استخدام Homebrew — brew install cocoapods يبني تلقائيًا لـ ARM64. إذا كانت gems مثبتة لـ x86_64، الأمر arch -arm64 sudo gem install cocoapods يحل المشكلة.
تثبيت بطيء للـ pods — في المشاريع الكبيرة، قد يستغرق pod install دقائق. الحل: تفعيل --verbose للتشخيص. استخدم --no-repo-update إذا كان Specs محدثًا بالفعل. لخوادم CI، خزن مؤقتًا مجلد Pods/ و~/.cocoapods. في CocoaPods 1.12+، التنزيل المتوازي متاح عبر install! 'cocoapods', :parallel_download => true.
| المشكلة | السبب | الحل |
|---|---|---|
| Sandbox not in sync | تغيير Podfile.lock | pod install |
| مستودع Specs تالف | خطأ Git | إعادة تثبيت Specs |
| رموز مكررة | تضارب مكتبات | use_frameworks! :static |
| خطأ على Apple Silicon | Ruby تحت Rosetta | Homebrew / rbenv ARM |
| تثبيت بطيء | رسم بياني كبير للتبعيات | تنزيل متوازي، تخزين مؤقت |
الأسئلة المتكررة
CocoaPods هو مدير تبعيات لمشاريع Apple (iOS، macOS، watchOS، tvOS). يقوم بأتمتة تنزيل وتكوين ودمج المكتبات الخارجية. بدلاً من نسخ الملفات يدويًا وتكوين علامات المترجم، يكفي إضافة سطر pod 'LibraryName' إلى Podfile وتشغيل pod install.
Podfile هو ملف تكوين يكتبه المطور: يحتوي على أسماء المكتبات وعوامل الإصدارات (~> 5.9، >= 2.0، إصدار دقيق). Podfile.lock يتم إنشاؤه تلقائيًا ويثبت الإصدارات الدقيقة لجميع التبعيات المثبتة. يجب الاحتفاظ بـ Podfile.lock في Git — يضمن أن جميع أعضاء الفريق يستخدمون نفس الإصدارات.
شغل pod deintegrate في الطرفية من مجلد المشروع — سيزيل CocoaPods ملف .xcworkspace وملفات التكوين وإعدادات البناء. ثم افتح .xcodeproj في Xcode، انتقل إلى File → Add Package Dependencies وأضف الحزم المطلوبة. SPM هو حل Apple المدمج الذي لا يتطلب تثبيتًا إضافيًا.
نعم، يمكن لـ CocoaPods وSPM التعايش في نفس المشروع. يدير CocoaPods جزءًا من التبعيات عبر .xcworkspace، بينما يتولى SPM Package Dependencies في Xcode. لكن قد تنشأ تضاربات في التبعيات غير المباشرة: إذا حاول كلا النظامين تضمين إصدارات مختلفة من نفس المكتبة، سيفشل البناء. يوصى باستخدام مدير واحد لجميع التبعيات.
أنشئ ملف .podspec يصف المكتبة. شغل pod spec lint للتحقق المحلي. سجل عبر pod trunk register email name. انشر spec عبر pod trunk push YourLib.podspec. سيضيف CocoaPods مكتبتك تلقائيًا إلى سجل Specs المركزي — بعد النشر، ستكون متاحة لجميع المطورين عبر pod 'YourLib'.
الخلاصة
pod trunk pushgem install cocoapods، والتكوين عبر pod init وpod installpod install وتنظيف التخزين المؤقت وتكوين إطارات العملسنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.