Tools: # πŸͺ¦ RIP CocoaPods (2011-2026): What Every iOS Developer Must Do NOW

Tools: # πŸͺ¦ RIP CocoaPods (2011-2026): What Every iOS Developer Must Do NOW

Source: Dev.to

πŸ“° The Official Announcement ## πŸ“… The Complete Timeline ## πŸ€” Why Is CocoaPods Dying? ## 1. Swift Package Manager Won ## 2. Maintainer Burnout ## 3. Security Nightmares ## 4. The Irony: Cross-Platform Kept It Alive ## βœ… What Will STILL Work After Dec 2026 ## ❌ What Will BREAK ## 🚨 Who Should Be MOST Worried? ## πŸ”΄ HIGH PRIORITY β€” Migrate NOW ## 🟑 MEDIUM PRIORITY β€” Plan Your Migration ## 🟒 LOW PRIORITY β€” You Have Time ## πŸ› οΈ Complete Migration Guide: CocoaPods β†’ SPM ## Step 1: Audit Your Dependencies ## Step 2: Check SPM Availability ## Step 3: Remove CocoaPods (The Clean Way) ## Step 4: Add SPM Dependencies ## Step 5: Handle Libraries WITHOUT SPM Support ## πŸ”₯ React Native Developers: Special Section ## The Deprecation Warning You've Seen ## New Commands to Use ## React Native 0.75+ SPM Integration ## ⚠️ Google Maps SDK Warning ## πŸ“± Flutter Developers: What to Know ## πŸ“¦ For Library Maintainers: Add SPM Support TODAY ## 1. Create Package.swift ## 2. Reorganize Your Files ## 3. Test Locally ## 4. Tag a Release ## βœ… Migration Checklist ## πŸ’‘ Pro Tips from the Trenches ## 1. Don't Wait Until November 2026 ## 2. Migrate One Dependency at a Time ## 3. Test on Fresh Clones ## 4. Update Your CI/CD ## 5. For New Projects: SPM Only ## πŸ”— Essential Resources ## 🎬 Conclusion After 15 years of faithful service, CocoaPods is officially dying. On December 2, 2026, the CocoaPods trunk will become permanently read-only. No new pods. No updates. Game over. If you're an iOS developer, React Native developer, or Flutter developer β€” this affects YOU. Here's your complete survival guide. From Orta Therox, CocoaPods maintainer: "In two years we plan to turn CocoaPods trunk to be read-only. At that point, no new versions or pods will be added to trunk." β€” CocoaPods Blog, November 2024 This isn't speculation. This is official. Why December 2nd? It's the Wednesday after American Thanksgiving β€” chosen so developers won't be in "rush mode." When Apple introduced SPM in 2015, CocoaPods' fate was sealed: From the official blog: "Members of the core team have individually had reasons for continual maintenance: a sense of duty, being employed to work on libraries or apps which use CocoaPods... However, with time β€” these links become more tenuous too, jobs change, people move to new ecosystems." The team is tired. And rightfully so after 15 years. In May 2025, CocoaPods had to block the prepare_command field because security researchers kept exploiting it: "We've had enough security researchers abusing scripting capabilities in CocoaPods that we are now introducing a block on allowing new CocoaPods to use the prepare_command field." "If CocoaPods' only audience were native Cocoa developers, CocoaPods' usage should be on the decline. The popularity of React Native and Flutter have ensured that most metrics of usage/traffic have been steadily rising over time." React Native and Flutter developers β€” you're the reason CocoaPods lasted this long! Don't panic completely. These will continue working: Why? The infrastructure stays online as long as GitHub and jsDelivr exist. First, list everything you're using: Create a migration spreadsheet: Or via Package.swift (for libraries): Option A: Use XCFramework Option B: Fork and Add SPM Support Then submit a PR to the original repo! Option C: Vendor the Code Copy source files directly into your project. Check the license first! This is intentional. React Native is preparing for the post-CocoaPods world. React Native 0.75 introduced spm_dependency helper: "Starting with version 11.0 of all Google Maps Platform iOS SDKs, new versions will not be released on CocoaPods." (Q2 2026) If you use react-native-maps with Google provider β€” watch this closely. Alternative: Use Apple Maps (no provider prop needed). Flutter also relies on CocoaPods for iOS. The Flutter team is actively working on SPM: For now: Keep using CocoaPods but monitor Flutter's SPM progress. Your users need this. Here's how: SPM expects this structure: Copy this for your project: Library maintainers won't magically add SPM support at the last minute. Start now. SPM resolves differently than CocoaPods. Always test: Starting a new project in 2025+? Don't even install CocoaPods. CocoaPods was a game-changer. It transformed iOS development by making dependency management accessible to everyone. Before CocoaPods, integrating third-party libraries was a nightmare of manual file copying and build configuration. But technology evolves. Swift Package Manager is: The clock is ticking. December 2, 2026 will arrive faster than you think. Thank you, CocoaPods, for 15 incredible years. πŸͺ¦πŸ’ Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse CODE_BLOCK: β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ COCOAPODS SUNSET TIMELINE β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ βœ… Aug 2024 β”‚ Maintenance mode announced β”‚ β”‚ βœ… Nov 2024 β”‚ Read-only plan confirmed β”‚ β”‚ βœ… May 2025 β”‚ prepare_command blocked (security) β”‚ β”‚ ⏳ Mid-late 2025β”‚ First mass notification to contributors β”‚ β”‚ ⏳ Sept-Oct 2026β”‚ Final warning notification β”‚ β”‚ ⏳ Nov 1-7 2026 β”‚ Test run of read-only mode β”‚ β”‚ πŸ’€ Dec 2, 2026 β”‚ TRUNK PERMANENTLY READ-ONLY β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ COCOAPODS SUNSET TIMELINE β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ βœ… Aug 2024 β”‚ Maintenance mode announced β”‚ β”‚ βœ… Nov 2024 β”‚ Read-only plan confirmed β”‚ β”‚ βœ… May 2025 β”‚ prepare_command blocked (security) β”‚ β”‚ ⏳ Mid-late 2025β”‚ First mass notification to contributors β”‚ β”‚ ⏳ Sept-Oct 2026β”‚ Final warning notification β”‚ β”‚ ⏳ Nov 1-7 2026 β”‚ Test run of read-only mode β”‚ β”‚ πŸ’€ Dec 2, 2026 β”‚ TRUNK PERMANENTLY READ-ONLY β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ CODE_BLOCK: β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ COCOAPODS SUNSET TIMELINE β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ βœ… Aug 2024 β”‚ Maintenance mode announced β”‚ β”‚ βœ… Nov 2024 β”‚ Read-only plan confirmed β”‚ β”‚ βœ… May 2025 β”‚ prepare_command blocked (security) β”‚ β”‚ ⏳ Mid-late 2025β”‚ First mass notification to contributors β”‚ β”‚ ⏳ Sept-Oct 2026β”‚ Final warning notification β”‚ β”‚ ⏳ Nov 1-7 2026 β”‚ Test run of read-only mode β”‚ β”‚ πŸ’€ Dec 2, 2026 β”‚ TRUNK PERMANENTLY READ-ONLY β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ CODE_BLOCK: + βœ… SPM: Built into Xcode + βœ… SPM: No Ruby dependency + βœ… SPM: Apple's official support + βœ… SPM: Better security model + βœ… SPM: Faster resolution - ❌ CocoaPods: External tool - ❌ CocoaPods: Ruby dependency hell - ❌ CocoaPods: Community maintained - ❌ CocoaPods: Security vulnerabilities - ❌ CocoaPods: Slower builds Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: + βœ… SPM: Built into Xcode + βœ… SPM: No Ruby dependency + βœ… SPM: Apple's official support + βœ… SPM: Better security model + βœ… SPM: Faster resolution - ❌ CocoaPods: External tool - ❌ CocoaPods: Ruby dependency hell - ❌ CocoaPods: Community maintained - ❌ CocoaPods: Security vulnerabilities - ❌ CocoaPods: Slower builds CODE_BLOCK: + βœ… SPM: Built into Xcode + βœ… SPM: No Ruby dependency + βœ… SPM: Apple's official support + βœ… SPM: Better security model + βœ… SPM: Faster resolution - ❌ CocoaPods: External tool - ❌ CocoaPods: Ruby dependency hell - ❌ CocoaPods: Community maintained - ❌ CocoaPods: Security vulnerabilities - ❌ CocoaPods: Slower builds CODE_BLOCK: // βœ… STILL WORKS pod install // Existing pods pod update // To versions already on trunk // Pods from GitHub/jsDelivr // Private spec repositories // Vendored dependencies (from npm) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: // βœ… STILL WORKS pod install // Existing pods pod update // To versions already on trunk // Pods from GitHub/jsDelivr // Private spec repositories // Vendored dependencies (from npm) CODE_BLOCK: // βœ… STILL WORKS pod install // Existing pods pod update // To versions already on trunk // Pods from GitHub/jsDelivr // Private spec repositories // Vendored dependencies (from npm) CODE_BLOCK: // ❌ BROKEN pod trunk push MyAwesomePod // New pods rejected pod trunk push --version 2.0 // Updates rejected // Security patches via trunk // New library releases Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: // ❌ BROKEN pod trunk push MyAwesomePod // New pods rejected pod trunk push --version 2.0 // Updates rejected // Security patches via trunk // New library releases CODE_BLOCK: // ❌ BROKEN pod trunk push MyAwesomePod // New pods rejected pod trunk push --version 2.0 // Updates rejected // Security patches via trunk // New library releases COMMAND_BLOCK: # See all your pods cat Podfile | grep "pod '" # Or from Podfile.lock cat Podfile.lock | grep " -" | head -20 Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # See all your pods cat Podfile | grep "pod '" # Or from Podfile.lock cat Podfile.lock | grep " -" | head -20 COMMAND_BLOCK: # See all your pods cat Podfile | grep "pod '" # Or from Podfile.lock cat Podfile.lock | grep " -" | head -20 COMMAND_BLOCK: # Most libraries with SPM support have this file ls Package.swift # in the repo root Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # Most libraries with SPM support have this file ls Package.swift # in the repo root COMMAND_BLOCK: # Most libraries with SPM support have this file ls Package.swift # in the repo root COMMAND_BLOCK: # Install deintegration tools sudo gem install cocoapods-deintegrate cocoapods-clean # Navigate to your project cd /path/to/your/project/ios # Remove CocoaPods integration pod deintegrate # Clean cache pod cache clean --all # Delete leftover files rm -rf Pods/ rm Podfile rm Podfile.lock rm -rf *.xcworkspace # Now open .xcodeproj (not workspace!) open YourApp.xcodeproj Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # Install deintegration tools sudo gem install cocoapods-deintegrate cocoapods-clean # Navigate to your project cd /path/to/your/project/ios # Remove CocoaPods integration pod deintegrate # Clean cache pod cache clean --all # Delete leftover files rm -rf Pods/ rm Podfile rm Podfile.lock rm -rf *.xcworkspace # Now open .xcodeproj (not workspace!) open YourApp.xcodeproj COMMAND_BLOCK: # Install deintegration tools sudo gem install cocoapods-deintegrate cocoapods-clean # Navigate to your project cd /path/to/your/project/ios # Remove CocoaPods integration pod deintegrate # Clean cache pod cache clean --all # Delete leftover files rm -rf Pods/ rm Podfile rm Podfile.lock rm -rf *.xcworkspace # Now open .xcodeproj (not workspace!) open YourApp.xcodeproj CODE_BLOCK: // swift-tools-version:5.9 import PackageDescription let package = Package( name: "MyAwesomeApp", platforms: [ .iOS(.v15), .macOS(.v12) ], dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0"), .package(url: "https://github.com/firebase/firebase-ios-sdk.git", from: "10.0.0"), .package(url: "https://github.com/realm/realm-swift.git", from: "10.45.0"), ], targets: [ .target( name: "MyAwesomeApp", dependencies: [ "Alamofire", .product(name: "FirebaseAnalytics", package: "firebase-ios-sdk"), .product(name: "RealmSwift", package: "realm-swift"), ] ), ] ) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: // swift-tools-version:5.9 import PackageDescription let package = Package( name: "MyAwesomeApp", platforms: [ .iOS(.v15), .macOS(.v12) ], dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0"), .package(url: "https://github.com/firebase/firebase-ios-sdk.git", from: "10.0.0"), .package(url: "https://github.com/realm/realm-swift.git", from: "10.45.0"), ], targets: [ .target( name: "MyAwesomeApp", dependencies: [ "Alamofire", .product(name: "FirebaseAnalytics", package: "firebase-ios-sdk"), .product(name: "RealmSwift", package: "realm-swift"), ] ), ] ) CODE_BLOCK: // swift-tools-version:5.9 import PackageDescription let package = Package( name: "MyAwesomeApp", platforms: [ .iOS(.v15), .macOS(.v12) ], dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0"), .package(url: "https://github.com/firebase/firebase-ios-sdk.git", from: "10.0.0"), .package(url: "https://github.com/realm/realm-swift.git", from: "10.45.0"), ], targets: [ .target( name: "MyAwesomeApp", dependencies: [ "Alamofire", .product(name: "FirebaseAnalytics", package: "firebase-ios-sdk"), .product(name: "RealmSwift", package: "realm-swift"), ] ), ] ) CODE_BLOCK: // Package.swift .binaryTarget( name: "SomeSDK", path: "Frameworks/SomeSDK.xcframework" ) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: // Package.swift .binaryTarget( name: "SomeSDK", path: "Frameworks/SomeSDK.xcframework" ) CODE_BLOCK: // Package.swift .binaryTarget( name: "SomeSDK", path: "Frameworks/SomeSDK.xcframework" ) CODE_BLOCK: // Use your fork temporarily .package(url: "https://github.com/YOUR_USERNAME/legacy-lib.git", branch: "add-spm-support") Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: // Use your fork temporarily .package(url: "https://github.com/YOUR_USERNAME/legacy-lib.git", branch: "add-spm-support") CODE_BLOCK: // Use your fork temporarily .package(url: "https://github.com/YOUR_USERNAME/legacy-lib.git", branch: "add-spm-support") CODE_BLOCK: ==================== DEPRECATION NOTICE ===================== Calling `pod install` directly is deprecated in React Native ============================================================ Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: ==================== DEPRECATION NOTICE ===================== Calling `pod install` directly is deprecated in React Native ============================================================ CODE_BLOCK: ==================== DEPRECATION NOTICE ===================== Calling `pod install` directly is deprecated in React Native ============================================================ COMMAND_BLOCK: # ❌ OLD WAY (deprecated) cd ios && pod install # βœ… NEW WAY yarn ios # or npx react-native run-ios # or (Expo) npx expo run:ios Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # ❌ OLD WAY (deprecated) cd ios && pod install # βœ… NEW WAY yarn ios # or npx react-native run-ios # or (Expo) npx expo run:ios COMMAND_BLOCK: # ❌ OLD WAY (deprecated) cd ios && pod install # βœ… NEW WAY yarn ios # or npx react-native run-ios # or (Expo) npx expo run:ios COMMAND_BLOCK: # In your library's .podspec Pod::Spec.new do |s| s.name = "MyRNLibrary" # ... spm_dependency(s, url: 'https://github.com/example/package.git', requirement: {kind: 'upToNextMajorVersion', minimumVersion: '1.0.0'}, products: ['SomeProduct'] ) end Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # In your library's .podspec Pod::Spec.new do |s| s.name = "MyRNLibrary" # ... spm_dependency(s, url: 'https://github.com/example/package.git', requirement: {kind: 'upToNextMajorVersion', minimumVersion: '1.0.0'}, products: ['SomeProduct'] ) end COMMAND_BLOCK: # In your library's .podspec Pod::Spec.new do |s| s.name = "MyRNLibrary" # ... spm_dependency(s, url: 'https://github.com/example/package.git', requirement: {kind: 'upToNextMajorVersion', minimumVersion: '1.0.0'}, products: ['SomeProduct'] ) end CODE_BLOCK: // swift-tools-version:5.9 import PackageDescription let package = Package( name: "MyAwesomeLibrary", platforms: [ .iOS(.v13), .macOS(.v10_15), .tvOS(.v13), .watchOS(.v6) ], products: [ .library( name: "MyAwesomeLibrary", targets: ["MyAwesomeLibrary"] ), ], targets: [ .target( name: "MyAwesomeLibrary", path: "Sources" ), .testTarget( name: "MyAwesomeLibraryTests", dependencies: ["MyAwesomeLibrary"], path: "Tests" ), ] ) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: // swift-tools-version:5.9 import PackageDescription let package = Package( name: "MyAwesomeLibrary", platforms: [ .iOS(.v13), .macOS(.v10_15), .tvOS(.v13), .watchOS(.v6) ], products: [ .library( name: "MyAwesomeLibrary", targets: ["MyAwesomeLibrary"] ), ], targets: [ .target( name: "MyAwesomeLibrary", path: "Sources" ), .testTarget( name: "MyAwesomeLibraryTests", dependencies: ["MyAwesomeLibrary"], path: "Tests" ), ] ) CODE_BLOCK: // swift-tools-version:5.9 import PackageDescription let package = Package( name: "MyAwesomeLibrary", platforms: [ .iOS(.v13), .macOS(.v10_15), .tvOS(.v13), .watchOS(.v6) ], products: [ .library( name: "MyAwesomeLibrary", targets: ["MyAwesomeLibrary"] ), ], targets: [ .target( name: "MyAwesomeLibrary", path: "Sources" ), .testTarget( name: "MyAwesomeLibraryTests", dependencies: ["MyAwesomeLibrary"], path: "Tests" ), ] ) COMMAND_BLOCK: MyLibrary/ β”œβ”€β”€ Package.swift # NEW β”œβ”€β”€ Sources/ β”‚ └── MyAwesomeLibrary/ β”‚ β”œβ”€β”€ File1.swift β”‚ β”œβ”€β”€ File2.swift β”‚ └── Resources/ # If needed β”œβ”€β”€ Tests/ β”‚ └── MyAwesomeLibraryTests/ β”‚ └── Tests.swift └── MyLibrary.podspec # Keep for backward compatibility Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: MyLibrary/ β”œβ”€β”€ Package.swift # NEW β”œβ”€β”€ Sources/ β”‚ └── MyAwesomeLibrary/ β”‚ β”œβ”€β”€ File1.swift β”‚ β”œβ”€β”€ File2.swift β”‚ └── Resources/ # If needed β”œβ”€β”€ Tests/ β”‚ └── MyAwesomeLibraryTests/ β”‚ └── Tests.swift └── MyLibrary.podspec # Keep for backward compatibility COMMAND_BLOCK: MyLibrary/ β”œβ”€β”€ Package.swift # NEW β”œβ”€β”€ Sources/ β”‚ └── MyAwesomeLibrary/ β”‚ β”œβ”€β”€ File1.swift β”‚ β”œβ”€β”€ File2.swift β”‚ └── Resources/ # If needed β”œβ”€β”€ Tests/ β”‚ └── MyAwesomeLibraryTests/ β”‚ └── Tests.swift └── MyLibrary.podspec # Keep for backward compatibility CODE_BLOCK: swift build swift test swift package resolve Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: swift build swift test swift package resolve CODE_BLOCK: swift build swift test swift package resolve COMMAND_BLOCK: git add Package.swift Sources/ Tests/ git commit -m "Add Swift Package Manager support" git tag 2.0.0 git push origin main --tags Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: git add Package.swift Sources/ Tests/ git commit -m "Add Swift Package Manager support" git tag 2.0.0 git push origin main --tags COMMAND_BLOCK: git add Package.swift Sources/ Tests/ git commit -m "Add Swift Package Manager support" git tag 2.0.0 git push origin main --tags COMMAND_BLOCK: ## Pre-Migration - [ ] List all CocoaPods dependencies - [ ] Check SPM support for each - [ ] Find alternatives for unsupported libs - [ ] Create backup branch - [ ] Notify team members ## Migration - [ ] Run `pod deintegrate` - [ ] Delete Pods/, Podfile, Podfile.lock, *.xcworkspace - [ ] Open .xcodeproj - [ ] Add each dependency via SPM - [ ] Update import statements if needed - [ ] Fix build errors ## Post-Migration - [ ] Run all unit tests - [ ] Run all UI tests - [ ] Test on real devices (iPhone + iPad) - [ ] Test CI/CD pipeline - [ ] Update README.md - [ ] Update onboarding docs - [ ] Celebrate πŸŽ‰ Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: ## Pre-Migration - [ ] List all CocoaPods dependencies - [ ] Check SPM support for each - [ ] Find alternatives for unsupported libs - [ ] Create backup branch - [ ] Notify team members ## Migration - [ ] Run `pod deintegrate` - [ ] Delete Pods/, Podfile, Podfile.lock, *.xcworkspace - [ ] Open .xcodeproj - [ ] Add each dependency via SPM - [ ] Update import statements if needed - [ ] Fix build errors ## Post-Migration - [ ] Run all unit tests - [ ] Run all UI tests - [ ] Test on real devices (iPhone + iPad) - [ ] Test CI/CD pipeline - [ ] Update README.md - [ ] Update onboarding docs - [ ] Celebrate πŸŽ‰ COMMAND_BLOCK: ## Pre-Migration - [ ] List all CocoaPods dependencies - [ ] Check SPM support for each - [ ] Find alternatives for unsupported libs - [ ] Create backup branch - [ ] Notify team members ## Migration - [ ] Run `pod deintegrate` - [ ] Delete Pods/, Podfile, Podfile.lock, *.xcworkspace - [ ] Open .xcodeproj - [ ] Add each dependency via SPM - [ ] Update import statements if needed - [ ] Fix build errors ## Post-Migration - [ ] Run all unit tests - [ ] Run all UI tests - [ ] Test on real devices (iPhone + iPad) - [ ] Test CI/CD pipeline - [ ] Update README.md - [ ] Update onboarding docs - [ ] Celebrate πŸŽ‰ COMMAND_BLOCK: # Podfile - Gradual migration target 'MyApp' do # Already migrated to SPM: # - Alamofire # - Firebase # Still on CocoaPods: pod 'SomeLegacyLib', '~> 1.0' end Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # Podfile - Gradual migration target 'MyApp' do # Already migrated to SPM: # - Alamofire # - Firebase # Still on CocoaPods: pod 'SomeLegacyLib', '~> 1.0' end COMMAND_BLOCK: # Podfile - Gradual migration target 'MyApp' do # Already migrated to SPM: # - Alamofire # - Firebase # Still on CocoaPods: pod 'SomeLegacyLib', '~> 1.0' end COMMAND_BLOCK: # Simulate a new developer git clone your-repo fresh-clone cd fresh-clone open Project.xcodeproj # Build and run Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # Simulate a new developer git clone your-repo fresh-clone cd fresh-clone open Project.xcodeproj # Build and run COMMAND_BLOCK: # Simulate a new developer git clone your-repo fresh-clone cd fresh-clone open Project.xcodeproj # Build and run CODE_BLOCK: - run: pod install - run: xcodebuild -workspace App.xcworkspace ... Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: - run: pod install - run: xcodebuild -workspace App.xcworkspace ... CODE_BLOCK: - run: pod install - run: xcodebuild -workspace App.xcworkspace ... CODE_BLOCK: - run: xcodebuild -project App.xcodeproj -resolvePackageDependencies - run: xcodebuild -project App.xcodeproj ... Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: - run: xcodebuild -project App.xcodeproj -resolvePackageDependencies - run: xcodebuild -project App.xcodeproj ... CODE_BLOCK: - run: xcodebuild -project App.xcodeproj -resolvePackageDependencies - run: xcodebuild -project App.xcodeproj ... COMMAND_BLOCK: # Just use Xcode's built-in package management # File β†’ Add Package Dependencies... Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: # Just use Xcode's built-in package management # File β†’ Add Package Dependencies... COMMAND_BLOCK: # Just use Xcode's built-in package management # File β†’ Add Package Dependencies... CODE_BLOCK: β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Time remaining: ~11 months β”‚ β”‚ β”‚ β”‚ Start your migration TODAY. β”‚ β”‚ β”‚ β”‚ Your future self will thank you. β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Time remaining: ~11 months β”‚ β”‚ β”‚ β”‚ Start your migration TODAY. β”‚ β”‚ β”‚ β”‚ Your future self will thank you. β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ CODE_BLOCK: β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Time remaining: ~11 months β”‚ β”‚ β”‚ β”‚ Start your migration TODAY. β”‚ β”‚ β”‚ β”‚ Your future self will thank you. β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - Swift Package Index β€” Search 6,000+ packages - GitHub README β€” Look for "Swift Package Manager" section - Podspec source field β€” Get the Git URL - File β†’ Add Package Dependencies... - Enter repo URL: https://github.com/Alamofire/Alamofire.git - Select version rule (e.g., "Up to Next Major") - Choose target(s) - Click Add Package - Track progress: flutter/flutter#126005 - Many plugins already support SPM - Migration tools in development - More secure - Native to Xcode - Backed by Apple