CocoaPods, iOS, macOS, watchOS ve tvOS projeleri için açık kaynaklı bir bağımlılık yöneticisidir. CocoaPods Ruby ile oluşturulmuştur ve 100.000'den fazla kütüphane içeren bir özellik kaydı (Specs) kullanır. Entegrasyon, projenin tüm bağımlılıklarını tanımlayan Podfile dosyası aracılığıyla gerçekleşir. Kurulumun sonucu, ana projeyi ve bağlı tüm modülleri birleştiren .xcworkspace dosyasıdır. CocoaPods, iOS geliştirmede en popüler bağımlılık yöneticisi olmaya devam etmektedir: Stack Overflow Survey (2025) anketine göre, iOS geliştiricilerinin %34'ü tarafından kullanılmaktadır.
Önemli Noktalar
pod install ile .xcworkspace oluşturur — Xcode'da yalnızca bu açılmalıdırCocoaPods, Apple ekosistemi için Ruby ile yazılmış ve 2011 yılında Eladio Lopez tarafından yayınlanan bir bağımlılık yöneticisidir. CocoaPods, Xcode projelerine üçüncü taraf kütüphaneleri entegre etme sorununu çözer: dosyaları manuel olarak kopyalamak ve bağlayıcı işaretlerini yapılandırmak yerine, geliştirici bağımlılıkları bir Podfile içinde tanımlar ve pod install komutunu çalıştırır. CocoaPods otomatik olarak kaynak dosyaları indirir, derleyici işaretlerini yapılandırır ve .xcworkspace çalışma alanını oluşturur.
CocoaPods mimarisi üç bileşenden oluşur: CocoaPods.app (CLI aracı), Specs (GitHub'da merkezi özellik kaydı) ve Podfile (proje yapılandırması). Specs kaydı, sürüm geçmişiyle birlikte 100.000'den fazla kütüphane içerir. pod install çalıştırıldığında, CocoaPods en son kayıt sürümünü indirir (pod repo update), bağımlılıkları bulur, sürüm ağacını çözer ve tüm pod entegrasyonlarıyla .xcworkspace oluşturur. Her kütüphane ayrı bir hedef olarak derlenir, bu da bağımlılık izolasyonu ve ad çakışmalarını önleme sağlar.
CocoaPods, Xcode ile sıkı bir şekilde entegredir: başlık yolları ve bağlayıcı işaretleri içeren Pods.xcconfig dosyaları oluşturur ve User Script Sandboxing yapılandırmasını yapar. macOS'ta CocoaPods kullanmak için Ruby 2.6+ (tüm Mac'lerde önceden yüklenmiş) ve Command Line Tools ile Xcode gereklidir. İstatistikler: 2025'te CocoaPods, 10 milyardan fazla pod indirmesi işledi ve ortalama bir iOS projesi, CocoaPods aracılığıyla 15 ila 40 bağımlılık içerir.
CocoaPods, her kütüphaneyi ayrı bir Git deposu olarak indirir, .podspec özelliğini doğrular ve statik bir çerçeve veya dinamik kütüphane olarak derler. Pod'lar diğer pod'lara bağımlı olabilir — CocoaPods bir bağımlılık grafiği oluşturur ve sürüm çakışmalarını çözer. İki kütüphane aynı bağımlılığın farklı sürümlerini gerektiriyorsa, CocoaPods uyumlu bir sürüm bulmaya çalışır veya hata bildirir. Tüm bağımlılıklar ve sürümleri Podfile.lock dosyasına kaydedilir ve bu dosya sürüm kontrolüne eklenmelidir.
Manuel entegrasyona göre CocoaPods'un avantajları: otomatik bağımlılık yönetimi, merkezi kütüphane kaydı, alt özellik (subspec) desteği, özel depolar oluşturma yeteneği ve anlamsal sürümleme. Bir geliştirme ekibi için CocoaPods, tüm üyelerin aynı kütüphane sürümlerini kullanmasını sağlar — Podfile.lock herhangi bir makinede derleme tekrarlanabilirliğini garanti eder.
Podfile, bir Xcode projesinin bağımlılıklarını tanımlayan Ruby yapılandırma dosyasıdır. Podfile, .xcodeproj dosyasının yanında proje köküne yerleştirilir. CocoaPods sözdizimi, değişkenler, koşullar ve döngüler kullanımına izin veren Ruby DSL'ye (Domain Specific Language) dayanır. Minimum bir Podfile, bir platform ve en az bir bağımlılık içerir.
platform :ios, '15.0'
target 'MyApp' do
pod 'Alamofire', '~> 5.9'
pod 'SnapKit', '~> 5.7'
pod 'Kingfisher', '~> 8.0'
endAnahtar satır platform :ios, '15.0' minimum iOS sürümünü belirler. target 'MyApp' yönergesi, belirli bir hedef için bağımlılıkları gruplandırır. Her pod 'Name', '~> version' satırı, kütüphane adını ve sürümünü belirtir. '~> 5.9' operatörü «5.9'dan 6.0'a kadar, 6.0 hariç herhangi bir sürüm» anlamına gelir — bu, önemli değişikliklere karşı koruyan anlamsal sürümlemedir.
CocoaPods esnek sürüm operatörlerini destekler: '= 1.0' (tam sürüm), '>= 1.0' (minimum), '< 2.0' (maksimum), '~> 1.2.3' (yalnızca yama). Yerel bir klasörden kütüphane eklemek için pod 'MyLib', :path => '../MyLib' kullanılır. Git'ten eklemek için — 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'ların statik kütüphaneler yerine çerçeve olarak derlenmesini sağlar (Xcode 15+'tan itibaren varsayılan davranış). :linkage => :static özelliği, çerçeveleri statik olmaya zorlayarak uygulama boyutunu azaltır. inhibit_all_warnings! pod'lardan gelen uyarıları bastırır — temiz bir derleme günlüğü için kullanışlıdır. inherit! :search_paths ile iç içe hedefler (örneğin testler için) tüm bağımlılıkları yeniden derlemeden yalnızca arama yollarını alır. post_install bloğu, tüm pod hedefleri için derleme ayarlarını yapılandırır — bu, birleşik bir minimum iOS sürümü ayarlamak için standart bir desendir.
Podfile.lock, pod install sırasında otomatik olarak oluşturulur. Geçişli olanlar dahil tüm yüklü bağımlılıkların tam sürümlerini sabitler. Kilit dosyası depoda saklanmalıdır — aksi takdirde başka bir makinede pod install farklı sürümler yükleyebilir. pod update PodName komutu, belirli bir pod'u güncelleyerek Podfile.lock'ı değiştirir. pod outdated, daha yeni sürümler mevcut olan pod'ların listesini gösterir.
Podspec, CocoaPods için bir kütüphaneyi tanımlayan .podspec uzantılı bir Ruby dosyasıdır. Podspec, meta veri (ad, sürüm, yazar), kaynak kod, bağımlılıklar, sistem çerçeveleri ve platform gereksinimlerini içerir. CocoaPods, kayıt defterine yayınlamadan önce pod spec lint ile podspec'i doğrular.
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 — kayıt defterindeki benzersiz kütüphane adı. s.version, Git etiketine karşılık gelir (yayınlama için önemlidir). s.source_files — kaynak dosyaları dahil etmek için glob deseni. s.dependency, bir sürümle diğer pod'lara bağımlılık belirtir. s.ios.deployment_target, desteklenen minimum iOS sürümünü ayarlar — proje daha eski bir sürüm kullanıyorsa CocoaPods otomatik olarak uyarır. Özel pod'lar için, kayıt defterine yayınlamak yerine Podfile'da :path kullanılabilir.
Merkezi Specs kaydına kütüphane yayınlama, pod trunk push NetworkingKit.podspec ile yapılır. pod trunk register dev@example.com 'Developer' ile ön kayıt gereklidir. CocoaPods podspec'i doğrular ve Specs deposuna bir çekme isteği gönderir. Alternatif olarak, şirket içi kütüphaneler için pod repo push ile özel bir kayıt defteri kullanılabilir.
Alt özellikler (Subspecs), bir kütüphaneyi kullanıcıların seçici olarak dahil edebileceği modüllere bölmeye olanak tanır. Örneğin, Firebase alt özellikler kullanır: pod 'Firebase/Crashlytics', diğer Firebase modülleri olmadan yalnızca Crashlytics'i içerir. Alt özellikler, temel yapılandırmayı devralır ve kendi source_files ve bağımlılıklarını ekleyebilir.
| Komut | Eylem |
|---|---|
pod spec lint | Podspec geçerliliğini doğrula |
pod trunk register | CocoaPods Trunk'a kaydol |
pod trunk push | Podspec'i kayıt defterine yayınla |
pod repo push | Özel kayıt defterine yayınla |
pod lib lint | Yerel kütüphane doğrulaması |
CocoaPods, RubyGems — Ruby'nin standart paket yöneticisi aracılığıyla kurulur. macOS'ta Ruby önceden yüklenmiştir, bu nedenle terminalde tek bir komut yeterlidir. Bir alternatif, CocoaPods'u ayrı bir formül olarak kuran Homebrew'dür. Kurulumdan sonra proje başlatma, temel yapılandırmayla bir Podfile oluşturan pod init ile yapılır. Podfile bağımlılıklarla doldurulduktan sonra geliştirici pod install komutunu çalıştırır — CocoaPods kütüphaneleri indirir ve çalışma alanını oluşturur.
# Kurulum CocoaPods aracılığıyla RubyGems
sudo gem install cocoapods
# Alternatif kurulum Homebrew
brew install cocoapods
# Başlatma Podfile projede
cd /path/to/Project
pod init
# Bağımlılıkları yükleme
pod installÖnemli kural: pod install'dan sonra her zaman .xcworkspace dosyasını açın, .xcodeproj dosyasını değil. .xcodeproj açarsanız, Xcode pod'ları görmez ve derleme bağlayıcı hatalarıyla başarısız olur. pod install komutu, bağımlılıkları yalnızca Podfile değiştiğinde veya ilk çalıştırmada indirir. Tüm pod'ları zorla yeniden yüklemek için pod install --repo-update veya pod deintegrate && pod install kullanın.
CocoaPods güncelleme, sudo gem update cocoapods veya brew upgrade cocoapods ile yapılır. CocoaPods sürümü pod --version ile kontrol edilir. Sürüm 1.12'den (2024) itibaren CocoaPods, sıkı modül doğrulama ayarları ve gelişmiş geçişli bağımlılık çözümü ile Xcode 15'i destekler. 2025 ortası itibarıyla en son kararlı sürüm, Swift 6 desteği ve 50+ pod'lu projeler için gelişmiş bağımlılık grafiği çözüm performansı ile 1.16'dır.
# Tüm pod'ları en son sürümlere güncelleme
pod update
# Belirli bir pod'u güncelleme
pod update Alamofire
# Eski bağımlılıkları kontrol etme
pod outdated
# Kaldırma CocoaPods projeden
pod deintegratepod update argümansız olarak, Podfile'a göre tüm pod'ları en son uyumlu sürümlere günceller (~> operatörlerine saygı duyarak). pod outdated, Podfile.lock'daki mevcut sürüm ile en son mevcut sürüm arasındaki farkı gösterir. pod deintegrate, CocoaPods'u projeden tamamen kaldırır — .xcworkspace, yapılandırma dosyaları ve derleme ayarlarını siler. Swift Package Manager'a geçiş yaparken bu kullanışlıdır.
Bağımlılık yönetimi CocoaPods'ta dört yönü içerir: sürüm sabitleme, çakışma çözümü, derleme optimizasyonu ve geçişli bağımlılıkları yönetme. CocoaPods, Podfile.lock'a dayalı bir bağımlılık grafiği oluşturur — bir proje A ve B kütüphanelerini kullanıyorsa ve her ikisi de C'ye bağımlıysa, CocoaPods her iki gereksinimi de karşılayan bir C sürümü bulur.
İki bağımlılık aynı kütüphanenin uyumsuz sürümlerini gerektirdiğinde çakışmalar ortaya çıkar. CocoaPods, çakışan gereksinimleri belirten bir hata bildirir. Çözümler: bağımlılıklardan birini uyumlu bir sürüme güncellemek, belirli bir işlemle pod 'Lib', :git => ... kullanmak veya değiştirilmiş bağımlılıkla kütüphanelerden birini çatallamak. Büyük projeler için, her çekme isteğinde pod lib lint ile CI doğrulaması ayarlamanız önerilir.
CocoaPods çeşitli gelişmiş özellikler sunar: yerel kütüphane geliştirme için :path, çatalları bağlamak için :git, geliştirme dallarını test etmek için :branch. :linkage => :static ile use_frameworks! yönergesi, nihai ikili dosya boyutunu en aza indirir. A/B testi ve özellik işaretleri için, Podfile'daki Ruby koşullu yapıları aracılığıyla farklı pod sürümleri dahil edilebilir.
platform :ios, '15.0'
use_frameworks!
# Ortamı tanımlama
is_debug = defined?(DEBUG) && DEBUG
target 'MyApp' do
# Temel bağımlılıklar
pod 'Alamofire', '~> 5.9'
pod 'SnapKit', '~> 5.7'
# Geliştirme için yerel kütüphane
pod 'MyInternalLib', :path => '../MyInternalLib'
# Hata ayıklama için koşullu bağımlılık
if is_debug
pod 'SwiftyBeaver', '~> 2.0'
else
pod 'CocoaLumberjack', '~> 3.8'
end
# Hata düzeltmesi içeren çatal
pod 'Kingfisher', :git => 'https://github.com/user/Kingfisher.git', :branch => 'fix-memory-leak'
end
abstract_target 'Pods' do
pod 'Alamofire'
endabstract_target, belirli bir Xcode hedefine bağlı kalmadan paylaşılan bağımlılıklar için sanal bir hedef oluşturur. Ruby koşullu yapıları, Debug ve Release yapılandırmaları için farklı kütüphaneler dahil etmeye olanak tanır. Yerel kütüphane ile :path, geliştirmeyi hızlandırır — değişiklikler pod install yeniden başlatılmadan uygulanır. :branch modu, resmi sürümden önce değişiklikleri test etmek için kullanışlıdır.
CocoaPods, Swift Package Manager (SPM) ve Carthage, iOS geliştirmedeki üç ana bağımlılık yöneticisidir. Her birinin kendi mimarisi, entegrasyon yaklaşımı ve kontrol düzeyi vardır. CocoaPods kütüphane sayısında liderdir, SPM Xcode'a entegre desteğiyle kazanır, Carthage popülerlikte geridedir ancak maksimum kontrol sağlar.
| Kriter | CocoaPods | SPM | Carthage |
|---|---|---|---|
| Yapılandırma dili | Ruby DSL | Package.swift (Swift) | Cartfile |
| Xcode entegrasyonu | Çalışma alanı aracılığıyla | Entegre | Manuel (xcframeworks) |
| Kütüphane sayısı | 100.000+ | ~65.000 | ~20.000 |
| Geçişli bağımlılıklar | Otomatik | Otomatik | Manuel |
| Kaynak desteği | Evet (resource bundles) | Evet (Resources) | Hayır |
| Kurulum hızı | Orta | Hızlı | Hızlı |
| Sürümleme | Gemfile.lock | Package.resolved | Cartfile.resolved |
CocoaPods, maksimum kütüphane uyumluluğu gerektiren projeler için tercih olmaya devam ediyor (birçok eski kütüphane yalnızca CocoaPods aracılığıyla kullanılabilir). SPM yeni projeler için önerilir — Xcode'a entegredir, ek araç gerektirmez ve Apple tarafından desteklenir. Carthage nadiren kullanılır, esas olarak Xcode yapılandırmasına minimum müdahale gerektiren projeler için. 2024'ten bu yana Apple, SPM'yi aktif olarak geliştiriyor ve birçok popüler kütüphane (Alamofire, Firebase, SnapKit) zaten CocoaPods'un yanı sıra SPM'yi de destekliyor.
CocoaPods'tan SPM'ye geçiş, pod deintegrate (CocoaPods'u kaldırma) ve Xcode'da File → Add Package Dependencies aracılığıyla paket ekleme ile yapılır. Temel zorluklar: kaynakları (yazı tipleri, resimler, storyboard) olan kütüphaneler farklı davranabilir ve CocoaPods eklentilerinin (örneğin kod oluşturma için) SPM'de karşılığı yoktur. Kod oluşturma, kaynak paketleri ve post_install kancaları aracılığıyla özel derleme aşamaları gibi CocoaPods'a özgü özellikler gerektiren projeler için CocoaPods'un korunması önerilir.
CocoaPods istikrarlı bir araçtır, ancak geliştiriciler ara sıra tipik sorunlarla karşılaşır. Çoğu Ruby sürümleri, önbelleğe alma veya bağımlılık çakışmalarıyla ilgilidir. Aşağıda en yaygın senaryolar ve çözümleri verilmiştir.
«The sandbox is not in sync with the Podfile.lock» hatası — pod install çalıştırılmadan önce Podfile.lock depoda değiştirildiğinde oluşur. Çözüm: pod install veya pod deintegrate && pod install çalıştırın. CI ortamları için, derleme komut dosyasına pod install eklenmesi önerilir. Diğer bir yaygın neden, geliştiriciler arasındaki CocoaPods sürüm farkıdır: tüm makinelerde pod --version kontrol edin.
Specs kaydını güncelleme hatası — genellikle ağ sorunları veya eski bir Git deposu nedeniyle oluşur. Çözüm: pod repo update --verbose ayrıntıları gösterir. Specs bozuksa: rm -rf ~/.cocoapods/repos/master && pod repo add master https://github.com/CocoaPods/Specs.git. Yavaş internet için CDN kullanabilirsiniz — CocoaPods 1.8+'dan itibaren varsayılan olarak etkindir.
Yinelenen sembol hatası — bir kütüphane iki kez eklendiğinde veya pod'lar arasında sembol çakışması olduğunda oluşur. Çözüm: Podfile'ı yinelenenler için kontrol edin, sembolleri ayırmak için use_frameworks! :linkage => :static kullanın. Sorun kütüphanedeyse, yazara bildirin. Bazen Derived Data'yı temizlemek ve Xcode'u yeniden başlatmak yardımcı olur.
Apple Silicon Mac'te CocoaPods kurulamıyor — macOS'ta önceden yüklenmiş Ruby, Rosetta 2 aracılığıyla çalışarak derleme hatalarına neden olur. Çözüm: yerel ARM64 mimarisi için rbenv veya asdf aracılığıyla Ruby yükleyin. Alternatif: Homebrew kullanın — brew install cocoapods otomatik olarak ARM64 için derler. Gem'ler x86_64 için yüklenmişse, arch -arm64 sudo gem install cocoapods komutu sorunu çözer.
Yavaş pod kurulumu — büyük projelerde pod install dakikalar alabilir. Çözüm: tanılama için --verbose etkinleştirin. Specs zaten güncelse --no-repo-update kullanın. CI sunucuları için Pods/ klasörünü ve ~/.cocoapods önbelleğe alın. CocoaPods 1.12+'da, install! 'cocoapods', :parallel_download => true ile paralel indirme mevcuttur.
| Sorun | Neden | Çözüm |
|---|---|---|
| Sandbox not in sync | Podfile.lock değişti | pod install |
| Specs deposu bozuk | Git hatası | Specs'i yeniden yükle |
| Yinelenen semboller | Kütüphane çakışması | use_frameworks! :static |
| Apple Silicon'da hata | Rosetta altında Ruby | Homebrew / rbenv ARM |
| Yavaş kurulum | Büyük bağımlılık grafiği | Paralel indirme, önbellek |
Sıkça Sorulan Sorular
CocoaPods, Apple projeleri (iOS, macOS, watchOS, tvOS) için bir bağımlılık yöneticisidir. Üçüncü taraf kütüphanelerin indirilmesini, yapılandırılmasını ve entegrasyonunu otomatikleştirir. Dosyaları manuel olarak kopyalamak ve derleyici işaretlerini yapılandırmak yerine, Podfile'a bir satır pod 'LibraryName' eklemek ve pod install çalıştırmak yeterlidir.
Podfile, geliştiricinin yazdığı bir yapılandırma dosyasıdır: kütüphane adlarını ve sürüm operatörlerini (~> 5.9, >= 2.0, tam sürüm) içerir. Podfile.lock otomatik olarak oluşturulur ve yüklü tüm bağımlılıkların tam sürümlerini sabitler. Podfile.lock Git'te saklanmalıdır — ekip üyelerinin aynı sürümleri kullanmasını sağlar.
Proje klasöründen terminalde pod deintegrate çalıştırın — CocoaPods .xcworkspace, yapılandırma dosyalarını ve derleme ayarlarını kaldıracaktır. Ardından Xcode'da .xcodeproj dosyasını açın, File → Add Package Dependencies'e gidin ve gerekli paketleri ekleyin. SPM, ek kurulum gerektirmeyen Apple'ın yerleşik çözümüdür.
Evet, CocoaPods ve SPM aynı projede bir arada bulunabilir. CocoaPods bağımlılıkların bir kısmını .xcworkspace aracılığıyla yönetirken, SPM Xcode'daki Package Dependencies'i yönetir. Ancak, geçişli bağımlılık çakışmaları mümkündür: her iki sistem aynı kütüphanenin farklı sürümlerini dahil etmeye çalışırsa derleme başarısız olur. Tüm bağımlılıklar için tek bir yönetici kullanılması önerilir.
Kütüphaneyi tanımlayan bir .podspec dosyası oluşturun. Yerel doğrulama için pod spec lint çalıştırın. pod trunk register email name ile kaydolun. pod trunk push YourLib.podspec ile spec'i yayınlayın. CocoaPods, kütüphanenizi otomatik olarak merkezi Specs kaydına ekleyecektir — yayınlandıktan sonra tüm geliştiriciler pod 'YourLib' ile kullanılabilir.
Özet
pod trunk push ile kayıt defterine kütüphane yayınlamak için özellik dosyasıgem install cocoapods ile, ayarlama pod init ve pod install ilepod install, önbellek temizleme ve çerçeve yapılandırması ile çözülürAnahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.