CocoaPods — مدیر وابستگی با کد منبع باز برای پروژههای iOS، macOS، watchOS و tvOS. CocoaPods به زبان Ruby ساخته شده و از رجیستر مشخصات (Specs) با بیش از ۱۰۰٬۰۰۰ کتابخانه استفاده میکند. یکپارچهسازی از طریق فایل Podfile انجام میشود که در آن تمام وابستگیهای پروژه توصیف میشوند. نتیجه نصب — .xcworkspace است که پروژه اصلی و همه ماژولهای متصل را ترکیب میکند. CocoaPods محبوبترین مدیر وابستگی در توسعه iOS باقی میماند: طبق نظرسنجی Stack Overflow Survey (2025)، ۳۴٪ از توسعهدهندگان iOS از آن استفاده میکنند.
نکات اصلی
pod install .xcworkspace را ایجاد میکند — فقط این فایل باید در Xcode باز شودCocoaPods — مدیر وابستگی برای اکوسیستم Apple، نوشته شده به Ruby و منتشر شده در سال ۲۰۱۱ توسط Eladio Lopez. CocoaPods مشکل یکپارچهسازی کتابخانههای شخص ثالث در پروژههای Xcode را حل میکند: به جای کپی دستی فایلها و پیکربندی linker flags، توسعهدهنده وابستگیها را در Podfile توصیف کرده و pod install را اجرا میکند. CocoaPods به طور خودکار فایلهای منبع را بارگیری، پرچمهای کامپایلر را پیکربندی و فضای کاری .xcworkspace را ایجاد میکند.
معماری CocoaPods شامل سه مؤلفه است: CocoaPods.app (ابزار CLI)، Specs (رجیستر مرکزی مشخصات در GitHub) و Podfile (پیکربندی پروژه). رجیستر Specs شامل بیش از ۱۰۰٬۰۰۰ کتابخانه با تاریخچه نسخه است. هنگام اجرای pod install، CocoaPods آخرین نسخه رجیستر را بارگیری میکند (pod repo update)، وابستگیها را پیدا میکند، درخت نسخه را حل کرده و .xcworkspace را با یکپارچهسازی تمام podها تولید میکند. هر کتابخانه به عنوان یک target جداگانه کامپایل میشود که امکان جداسازی وابستگیها و جلوگیری از تداخل نامها را فراهم میکند.
CocoaPods با Xcode یکپارچه شده است: فایلهای Pods.xccconfig را با مسیرهای هدر و پرچمهای linker تولید میکند و همچنین User Script Sandboxing را پیکربندی میکند. برای استفاده از CocoaPods در macOS، Ruby ۲.۶+ (از قبل روی تمام Macها نصب شده) و Xcode با Command Line Tools مورد نیاز است. آمار: در سال ۲۰۲۵، CocoaPods بیش از ۱۰ میلیارد بارگیری pod را پردازش کرد و یک پروژه متوسط iOS شامل ۱۵ تا ۴۰ وابستگی از طریق CocoaPods است.
CocoaPods هر کتابخانه را به عنوان یک مخزن Git جداگانه بارگیری میکند، مشخصات .podspec آن را بررسی کرده و به یک فریمورک ایستا یا کتابخانه پویا کامپایل میکند. Podها میتوانند به podهای دیگر وابسته باشند — 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' وابستگیها را برای یک target خاص گروهبندی میکند. هر خط pod 'Name', '~> version' نام کتابخانه و نسخه را مشخص میکند. عملگر '~> 5.9' به معنای «هر نسخهای از ۵٫۹ تا ۶٫۰، به جز ۶٫۰» است — این نسخهگذاری معنایی است که از breaking changes محافظت میکند.
CocoaPods از عملگرهای نسخه انعطافپذیر پشتیبانی میکند: '= 1.0' (نسخه دقیق)، '> = 1.0' (حداقل)، '< 2.0' (حداکثر)، '~ > 1.2.3' (فقط patch). میتوان کتابخانه را از پوشه محلی از طریق 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! کامپایل podها را به عنوان فریمورک به جای کتابخانههای ایستا فعال میکند (رفتار پیشفرض از Xcode ۱۵+). ویژگی :linkage => :static فریمورکها را به صورت اجباری ایستا میکند و اندازه برنامه را کاهش میدهد. inhibit_all_warnings! هشدارهای podها را غیرفعال میکند — برای تمیزی لاگ ساخت مفید است. targetهای تودرتو (مثلاً برای تستها) با inherit! :search_paths فقط مسیرهای جستجو را دریافت میکنند بدون اینکه همه وابستگیها را دوباره کامپایل کنند. بلوک post_install پیکربندی ساخت را برای همه targetهای pod تنظیم میکند — این یک الگوی استاندارد برای تعیین حداقل نسخه iOS واحد است.
Podfile.lock به طور خودکار در pod install تولید میشود. این فایل نسخههای دقیق همه وابستگیهای نصب شده را از جمله وابستگیهای انتقالی ثابت میکند. فایل lock باید در مخزن نگهداری شود — بدون آن، pod install در ماشین دیگر ممکن است نسخههای متفاوتی نصب کند. دستور pod update PodName یک pod خاص را بهروزرسانی کرده و Podfile.lock را تغییر میدهد. pod outdated لیست podهایی را نشان میدهد که نسخههای جدیدتر برای آنها در دسترس است.
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 وابستگی به podهای دیگر را با نسخه مشخص میکند. s.ios.deployment_target حداقل نسخه پشتیبانی شده iOS را تعیین میکند — CocoaPods به طور خودکار هشدار میدهد اگر پروژه از نسخه قدیمیتر استفاده کند. برای podهای خصوصی میتوان از :path در Podfile به جای انتشار در رجیستر استفاده کرد.
انتشار کتابخانه در رجیستر مرکزی Specs از طریق pod trunk push NetworkingKit.podspec انجام میشود. ثبتنام قبلی از طریق pod trunk register dev@example.com 'Developer' لازم است. CocoaPods اعتبار podspec را بررسی کرده و یک pull request به مخزن Specs ارسال میکند. جایگزین — رجیستر خصوصی pod repo push برای کتابخانههای داخلی شرکت است.
Subspecs امکان تقسیم کتابخانه به ماژولهایی را فراهم میکند که کاربر میتواند به صورت انتخابی متصل کند. به عنوان مثال، Firebase از subspecs استفاده میکند: pod 'Firebase/Crashlytics' فقط Crashlytics را بدون سایر ماژولهای Firebase متصل میکند. Subspec پیکربندی پایه را به ارث برده و میتواند source_files و وابستگیهای خود را اضافه کند.
| دستور | عمل |
|---|---|
pod spec lint | بررسی اعتبار podspec |
pod trunk register | ثبت نام در CocoaPods Trunk |
pod trunk push | انتشار podspec در رجیستر |
pod repo push | انتشار در رجیستر خصوصی |
pod lib lint | اعتبارسنجی محلی کتابخانه |
CocoaPods از طریق RubyGems — مدیر بسته استاندارد Ruby نصب میشود. در macOS، Ruby از قبل نصب شده است، بنابراین یک دستور در ترمینال کافی است. روش جایگزین 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 podها را نمیبیند و ساخت با خطاهای linking مواجه میشود. دستور pod install وابستگیها را فقط در صورت تغییر Podfile یا در اولین اجرا بارگیری میکند. برای نصب مجدد اجباری همه podها از pod install --repo-update یا pod deintegrate && pod install استفاده میشود.
بهروزرسانی CocoaPods از طریق sudo gem update cocoapods یا brew upgrade cocoapods انجام میشود. نسخه CocoaPods با دستور pod --version بررسی میشود. از نسخه ۱٫۱۲ (۲۰۲۴)، CocoaPods از Xcode ۱۵ با تنظیمات بررسی دقیق ماژولها و حل بهبود یافته وابستگیهای انتقالی پشتیبانی میکند. آخرین نسخه پایدار در mid-2025 نسخه ۱٫۱۶ با پشتیبانی از Swift ۶ و عملکرد بهبود یافته حل گراف وابستگی برای پروژههای با ۵۰+ pod است.
# بهروزرسانی همه podها به آخرین نسخهها
pod update
# بهروزرسانی pod خاص
pod update Alamofire
# بررسی وابستگیهای منسوخ
pod outdated
# حذف CocoaPods از پروژه
pod deintegratepod update بدون آرگومان همه podها را به آخرین نسخههای سازگار طبق 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 در هر درخواست pull پیکربندی شود.
CocoaPods چندین قابلیت پیشرفته ارائه میدهد: :path برای توسعه محلی کتابخانهها، :git برای اتصال forkها، :branch برای تست شاخههای توسعه. دستور use_frameworks! با :linkage => :static اندازه فایل باینری نهایی را به حداقل میرساند. برای تست A/B و feature flagها میتوان نسخههای مختلف podها را از طریق ساختارهای شرطی 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
# فورک با رفع باگ
pod 'Kingfisher', :git => 'https://github.com/user/Kingfisher.git', :branch => 'fix-memory-leak'
end
abstract_target 'Pods' do
pod 'Alamofire'
endabstract_target یک target مجازی برای وابستگیهای مشترک بدون اتصال به 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) |
| تعداد کتابخانهها | ۱۰۰٬۰۰۰+ | ~۶۵٬۰۰۰ | ~۲۰٬۰۰۰ |
| وابستگیهای انتقالی | خودکار | خودکار | دستی |
| پشتیبانی از منابع | بله (resource bundles) | بله (Resources) | خیر |
| سرعت نصب | متوسط | سریع | سریع |
| نسخهگذاری | Gemfile.lock | Package.resolved | Cartfile.resolved |
CocoaPods انتخاب پروژههایی است که به حداکثر سازگاری با کتابخانهها نیاز دارند (بسیاری از کتابخانههای legacy فقط از طریق CocoaPods در دسترس هستند). SPM برای پروژههای جدید توصیه میشود — در Xcode تعبیه شده، نیاز به نصب ابزارهای اضافی ندارد و توسط Apple پشتیبانی میشود. Carthage به ندرت استفاده میشود، عمدتاً در پروژههایی با نیاز به حداقل دخالت در پیکربندی Xcode. از سال ۲۰۲۴، Apple به طور فعال SPM را توسعه میدهد و بسیاری از کتابخانههای محبوب (Alamofire, Firebase, SnapKit) در حال حاضر آن را در کنار CocoaPods پشتیبانی میکنند.
مهاجرت از CocoaPods به SPM از طریق pod deintegrate (حذف CocoaPods) و افزودن بستهها از طریق File → Add Package Dependencies در Xcode انجام میشود. مشکلات اصلی: کتابخانههای دارای منابع (فونتها، تصاویر، storyboard) ممکن است رفتار متفاوتی داشته باشند و پلاگینهای CocoaPods (مثلاً برای تولید کد) در SPM مشابه ندارند. توصیه میشود CocoaPods را برای پروژههایی که به قابلیتهای خاص CocoaPods نیاز دارند نگه دارید: تولید کد، بستههای منبع و مراحل ساخت سفارشی از طریق هوکهای 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 را در semua ماشینها بررسی کنید.
خطا در بهروزرسانی رجیستر Specs — معمولاً ناشی از مشکلات شبکه یا مخزن Git قدیمی است. راهحل: pod repo update --verbose جزئیات را نشان میدهد. اگر Specs خراب است: rm -rf ~/.cocoapods/repos/master && pod repo add master https://github.com/CocoaPods/Specs.git. در اینترنت کند میتوان از CDN استفاده کرد — از CocoaPods ۱٫۸+ به طور پیشفرض فعال است.
خطای duplicate symbols — هنگام اتصال یک کتابخانه دو بار یا تداخل نمادها بین podها رخ میدهد. راهحل: Podfile را برای تکرار بررسی کنید، از use_frameworks! :linkage => :static برای جداسازی نمادها استفاده کنید. اگر مشکل در کتابخانه است — به نویسنده گزارش دهید. گاهی اوقات پاک کردن Derived Data و راهاندازی مجدد Xcode کمک میکند.
CocoaPods روی Apple Silicon Mac نصب نمیشود — Ruby از پیش نصب شده روی macOS از طریق Rosetta ۲ کار میکند که باعث خطاهای کامپایل میشود. راهحل: Ruby را از طریق rbenv یا asdf برای معماری بومی ARM64 نصب کنید. جایگزین — استفاده از Homebrew: brew install cocoapods به طور خودکار برای ARM64 کامپایل میشود. اگر gems برای x86_64 نصب شده باشند، دستور arch -arm64 sudo gem install cocoapods مشکل را حل میکند.
نصب کند podها — در پروژههای بزرگ pod install ممکن است دقیقهها طول بکشد. راهحل: --verbose را برای تشخیص فعال کنید. اگر Specs از قبل بهروز است از --no-repo-update استفاده کنید. برای سرورهای CI پوشه Pods/ و ~/.cocoapods را کش کنید. در CocoaPods ۱٫۱۲+ بارگیری موازی از طریق install! 'cocoapods', :parallel_download => true اضافه شده است.
| مشکل | علت | راهحل |
|---|---|---|
| Sandbox not in sync | تغییر Podfile.lock | pod install |
| مخزن Specs خراب است | خطای Git | نصب مجدد Specs |
| Duplicate symbols | تداخل کتابخانهها | use_frameworks! :static |
| خطا روی Apple Silicon | Ruby تحت Rosetta | Homebrew / rbenv ARM |
| نصب کند | گراف وابستگی بزرگ | Parallel download, کش |
سوالات متداول
CocoaPods — مدیر وابستگی برای پروژههای Apple (iOS, macOS, watchOS, tvOS). این ابزار بارگیری، پیکربندی و یکپارچهسازی کتابخانههای شخص ثالث را خودکار میکند. به جای کپی دستی فایلها و پیکربندی پرچمهای کامپایلر، کافی است خط pod 'LibraryName' را به Podfile اضافه کرده و pod install را اجرا کنید.
Podfile — فایل پیکربندی که توسعهدهنده مینویسد: شامل نام کتابخانهها و عملگرهای نسخه (~> 5.9, >= 2.0, نسخه دقیق) است. Podfile.lock به طور خودکار تولید میشود و نسخههای دقیق همه وابستگیهای نصب شده را ثابت میکند. Podfile.lock باید در Git ذخیره شود — تضمین میکند که semua اعضای تیم از نسخههای یکسان استفاده میکنند.
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 اضافه میکند — پس از انتشار، semua توسعهدهندگان میتوانند از طریق pod 'YourLib' به آن دسترسی داشته باشند.
خلاصه
pod trunk pushgem install cocoapods، پیکربندی — از طریق pod init و pod installpod install، پاک کردن کش و پیکربندی فریمورکها حل میشوندما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.