Skip to content

Conversation

@WcaleNieWolny
Copy link

@WcaleNieWolny WcaleNieWolny commented Dec 17, 2025

Problem

When using Swift Package Manager (SPM), the Capacitor CLI currently defaults to iOS 15.0 as the minimum deployment target, regardless of what is configured in Xcode build settings. This causes issues when plugins require a higher minimum iOS version, particularly for security reasons.

Related Work

PR #7556 attempted to address this issue by reading the iOS deployment target from the Xcode project configuration. However, it did not fully solve the problem because:

  1. It only reads the major version - The implementation reads only 2 characters from the deployment target, which means it cannot handle minor versions like 15.5 (it would only read 15)
  2. It uses the wrong format - It generates .iOS(.v15) format, which doesn't support dot versions. According to Apple's documentation, versions with minor numbers (like 15.5) must use the .iOS("15.5") string format instead

This PR builds upon that work by properly reading the full version (including minor versions) and using the correct Swift Package Manager format.

Security Impact

This is particularly critical for plugins that depend on libraries with security requirements. For example, ZipArchive requires iOS 15.5+ due to a security vulnerability (CVE-2018-25032) in zlib versions before 1.2.12. zlib 1.2.12 is only included in iOS 15.5+ and later versions.

When Capacitor CLI generates a Package.swift file with .iOS(.v15) instead of .iOS("15.5"), it prevents proper enforcement of the security requirement, potentially exposing apps to known vulnerabilities. Furthermore, the project will simply not build if the minimum iOS version is not met.

Solution

This PR fixes the SPM platform version generation to:

  1. Read the full iOS deployment target (including minor versions like 15.5) from the Xcode project configuration
  2. Use the correct Swift Package Manager format based on Apple's documentation:
    • .iOS("15.5") when a dot version is detected (required for versions like 15.5)
    • .iOS(.v15) when no dot version is detected (for major versions only)

This ensures that the generated Package.swift accurately reflects the iOS deployment target configured in Xcode, allowing plugins with security requirements (like ZipArchive) to properly enforce their minimum iOS version requirements.

Changes

  • Added getMajorMinoriOSVersion() function to read the full iOS deployment target (including minor versions) from project.pbxproj
  • Updated SPM Package.swift generation to use the correct platform version format based on whether a dot version is present
  • Fixed iOS enum usage in platform version formatting

Documentation

Availability

This fix is already available in our fork Cap-go/capacitor-plus and can be installed via npm:

npm install @capacitor-plus/cli

Testing

Tested manually with a Capacitor app configured for iOS 15.5 deployment target. The generated Package.swift now correctly uses .iOS("15.5") format.

riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 17, 2025
@eric-horodyski
Copy link
Member

This Pull Request addresses the following Issue: #8276.

@markemer markemer changed the title Fix/ios spm platforms feat: allow spm platforms to select os without being overwritten Dec 17, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 18, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 19, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 20, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 21, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 22, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 23, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 24, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 25, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 26, 2025
riderx pushed a commit to Cap-go/capacitor-plus that referenced this pull request Dec 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants