Skip to content
cocoapods-to-spm logo

CocoaPods to Swift Package Manager Migration

cocoapods-to-spm

Guide to migrating iOS Capacitor plugins and dependencies from CocoaPods to Swift Package Manager (SPM). Use this skill when users want to modernize their iOS project, remove CocoaPods, or add SPM-based dependencies.

yeohj0710/wellnessbox0installs0stars

SKILL.md

Full skill instructions

CocoaPods to Swift Package Manager Migration

Step-by-step guide for migrating Capacitor iOS projects from CocoaPods to Swift Package Manager.

When to Use This Skill

  • User wants to migrate from CocoaPods to SPM
  • User is setting up a new project with SPM
  • User needs to add SPM dependencies to Capacitor
  • User has CocoaPods issues and wants an alternative
  • User wants faster builds (SPM often faster)

Why Migrate to SPM?

AspectCocoaPodsSPM
Build SpeedSlowerFaster
Apple IntegrationThird-partyNative Xcode
Ruby DependencyRequiredNone
Version ManagementPodfile.lockPackage.resolved
Xcodeproj ChangesModifies projectUses workspace
Binary CachingLimitedBuilt-in

Migration Process

Step 1: Analyze Current Dependencies

First, identify what you're currently using:

cd ios/​App
cat Podfile
pod outdated

Common Capacitor pods to migrate:

# Podfile (before)
target 'App' do
  capacitor_pods
  pod 'Firebase/​Analytics'
  pod 'Firebase/​Messaging'
  pod 'Alamofire'
  pod 'KeychainAccess'
end

Step 2: Find SPM Equivalents

Most popular libraries support SPM. Use these URLs:

LibrarySPM URL
Firebasehttps://github.com/​firebase/​firebase-ios-sdk
Alamofirehttps://github.com/​Alamofire/​Alamofire
KeychainAccesshttps://github.com/​kishikawakatsumi/​KeychainAccess
SDWebImagehttps://github.com/​SDWebImage/​SDWebImage
SnapKithttps://github.com/​SnapKit/​SnapKit
Realmhttps://github.com/​realm/​realm-swift
Lottiehttps://github.com/​airbnb/​lottie-spm

Step 3: Clean CocoaPods

cd ios/​App

# Remove CocoaPods integration
pod deintegrate

# Remove Podfile.lock and Pods directory
rm -rf Podfile.lock Pods

# Remove workspace (we'll use project directly or create new workspace)
rm -rf App.xcworkspace

Step 4: Add SPM Dependencies in Xcode

  1. Open ios/​App/​App.xcodeproj in Xcode
  2. Select the project in navigator
  3. Go to Package Dependencies tab
  4. Click + to add package
  5. Enter the package URL
  6. Choose version rules
  7. Select target App

Step 5: Update Podfile for Capacitor Core

Capacitor still needs CocoaPods for its core. Create minimal Podfile:

# ios/​App/​Podfile
require_relative '../​../​node_modules/​@capacitor/​ios/​scripts/​pods_helpers'

platform :ios, '14.0'
use_frameworks!

install! 'cocoapods', :disable_input_output_paths => true

def capacitor_pods
  pod 'Capacitor', :path => '../​../​node_modules/​@capacitor/​ios'
  pod 'CapacitorCordova', :path => '../​../​node_modules/​@capacitor/​ios'
end

target 'App' do
  capacitor_pods
  # Other plugin pods that don't support SPM yet
end

post_install do |installer|
  assertDeploymentTarget(installer)
end

Then run:

cd ios/​App && pod install

Step 6: Configure Plugin for SPM Support

If you're creating a Capacitor plugin with SPM support:

Package.swift:

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "CapacitorNativeBiometric",
    platforms: [.iOS(.v14)],
    products: [
        .library(
            name: "CapacitorNativeBiometric",
            targets: ["NativeBiometricPlugin"]
        ),
    ],
    dependencies: [
        .package(url: "https://github.com/​nicholasalx/​capacitor-swift-pm", from: "6.0.0"),
    ],
    targets: [
        .target(
            name: "NativeBiometricPlugin",
            dependencies: [
                .product(name: "Capacitor", package: "capacitor-swift-pm"),
                .product(name: "Cordova", package: "capacitor-swift-pm"),
            ],
            path: "ios/​Sources/​NativeBiometricPlugin",
            publicHeadersPath: "include"
        ),
    ]
)

Step 7: Xcode Project Structure for SPM

ios/
├── App/
│   ├── App/
│   │   ├── AppDelegate.swift
│   │   ├── Info.plist
│   │   └── ...
│   ├── App.xcodeproj/
│   │   └── project.xcworkspace/
│   │       └── xcshareddata/
│   │           └── swiftpm/
│   │               └── Package.resolved  # SPM lock file
│   ├── Podfile
│   └── Podfile.lock
└── ...

Hybrid Approach (Recommended)

Most Capacitor projects work best with a hybrid approach:

Keep in CocoaPods:

  • @capacitor/​ios core
  • Capacitor plugins without SPM support

Move to SPM:

  • Firebase
  • Third-party libraries
  • Your own Swift packages

Example Hybrid Setup

Podfile:

require_relative '../​../​node_modules/​@capacitor/​ios/​scripts/​pods_helpers'

platform :ios, '14.0'
use_frameworks!

install! 'cocoapods', :disable_input_output_paths => true

def capacitor_pods
  pod 'Capacitor', :path => '../​../​node_modules/​@capacitor/​ios'
  pod 'CapacitorCordova', :path => '../​../​node_modules/​@capacitor/​ios'
  # Plugins without SPM support
  pod 'CapacitorCamera', :path => '../​../​node_modules/​@capacitor/​camera'
end

target 'App' do
  capacitor_pods
  # NO Firebase here - use SPM instead
end

Xcode Package Dependencies:

  • Firebase iOS SDK
  • Any other SPM-compatible libraries

Common Issues and Solutions

Issue: Duplicate Symbols

Cause: Same library in both CocoaPods and SPM

Solution: Remove from Podfile if using SPM

# Podfile - WRONG
pod 'Firebase/​Analytics'  # Remove this

# Use SPM instead in Xcode

Issue: Module Not Found

Cause: SPM package not linked to target

Solution:

  1. Xcode > Project > Targets > App
  2. General > Frameworks, Libraries, and Embedded Content
  3. Add the SPM package product

Issue: Build Errors After Migration

Cause: Missing frameworks or wrong imports

Solution: Clean and rebuild

# Clean derived data
rm -rf ~/​Library/​Developer/​Xcode/​DerivedData

# Clean build folder in Xcode
# Cmd + Shift + K

# Rebuild
bunx cap sync ios
cd ios/​App && pod install

Issue: Capacitor Plugin Not Found

Cause: Plugin needs registration

Solution: Ensure plugin is registered in AppDelegate.swift:

import Capacitor
import YourPlugin

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        // Capacitor handles plugin registration automatically
        return true
    }
}

Creating SPM-Compatible Capacitor Plugin

Directory Structure

my-capacitor-plugin/
├── Package.swift
├── ios/
│   └── Sources/
│       └── MyPlugin/
│           ├── MyPlugin.swift
│           ├── MyPlugin.m           # Objc bridge if needed
│           └── include/
│               └── MyPlugin.h       # Public headers
├── src/
│   ├── index.ts
│   ├── definitions.ts
│   └── web.ts
└── package.json

Package.swift Template

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "CapacitorMyPlugin",
    platforms: [.iOS(.v14)],
    products: [
        .library(
            name: "CapacitorMyPlugin",
            targets: ["MyPluginPlugin"]
        ),
    ],
    dependencies: [
        .package(url: "https://github.com/​nicholasalx/​capacitor-swift-pm", from: "6.0.0"),
    ],
    targets: [
        .target(
            name: "MyPluginPlugin",
            dependencies: [
                .product(name: "Capacitor", package: "capacitor-swift-pm"),
                .product(name: "Cordova", package: "capacitor-swift-pm"),
            ],
            path: "ios/​Sources/​MyPlugin"
        ),
    ]
)

Plugin Swift Code

import Foundation
import Capacitor

@objc(MyPlugin)
public class MyPlugin: CAPPlugin, CAPBridgedPlugin {
    public let identifier = "MyPlugin"
    public let jsName = "MyPlugin"
    public let pluginMethods: [CAPPluginMethod] = [
        CAPPluginMethod(name: "echo", returnType: CAPPluginReturnPromise),
    ]

    @objc func echo(_ call: CAPPluginCall) {
        let value = call.getString("value") ?? ""
        call.resolve(["value": value])
    }
}

Migration Checklist

  • List all current CocoaPods dependencies
  • Identify SPM equivalents for each
  • Run pod deintegrate
  • Add SPM packages in Xcode
  • Create minimal Podfile for Capacitor core
  • Run pod install
  • Clean derived data
  • Build and test
  • Commit Package.resolved to git
  • Update CI/​CD scripts if needed

Resources

More skills from yeohj0710

vercel-composition-patterns logo
yeohj0710/wellnessbox

vercel-composition-patterns

Composition patterns for building flexible, maintainable React components. Avoid boolean prop proliferation by using compound components, lifting state, and composing internals. These patterns make codebases easier for both humans and AI agents to work with as they scale.

0 0
View

Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, or database configurations.

0 0
View
next-upgrade logo
yeohj0710/wellnessbox

next-upgrade

Upgrade Next.js to the latest version following official migration guides and codemods

0 0
View
capacitor-deep-linking logo
yeohj0710/wellnessbox

capacitor-deep-linking

Complete guide to implementing deep links and universal links in Capacitor apps. Covers iOS Universal Links, Android App Links, custom URL schemes, and navigation handling. Use this skill when users need to open their app from links.

0 0
View
tailwind-capacitor logo
yeohj0710/wellnessbox

tailwind-capacitor

Guide to using Tailwind CSS in Capacitor mobile apps. Covers mobile-first design, touch targets, safe areas, dark mode, and performance optimization. Use this skill when users want to style Capacitor apps with Tailwind.

0 0
View
vercel-deploy logo
yeohj0710/wellnessbox

vercel-deploy

Deploy applications and websites to Vercel. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment".

0 0
View
capacitor-keyboard logo
yeohj0710/wellnessbox

capacitor-keyboard

Guide to handling keyboard in Capacitor apps including visibility detection, accessory bar, scroll behavior, and input focus. Use this skill when users have keyboard-related issues.

0 0
View
frontend-design logo
yeohj0710/wellnessbox

frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beaut...

0 0
View
ios-android-logs logo
yeohj0710/wellnessbox

ios-android-logs

Guide to accessing device logs on iOS and Android for Capacitor apps. Covers command-line tools, GUI applications, filtering, and real-time streaming. Use this skill when users need to view device logs for debugging.

0 0
View
vercel-react-native-skills logo
yeohj0710/wellnessbox

vercel-react-native-skills

Comprehensive best practices for React Native and Expo applications. Contains rules across multiple categories covering performance, animations, UI patterns, and platform-specific optimizations.

0 0
View
capacitor-app-store logo
yeohj0710/wellnessbox

capacitor-app-store

Complete guide to publishing Capacitor apps to Apple App Store and Google Play Store. Covers app preparation, screenshots, metadata, review guidelines, and submission process. Use this skill when users are ready to publish their app.

0 0
View
develop-ai-functions-example logo
yeohj0710/wellnessbox

develop-ai-functions-example

Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples/ai-functions/src to validate provider support, demonstrate features, or create test fixtures.

0 0
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View