Skip to content

rive_native Package.swift fails to compile under Swift Package Manager: String.replacingOccurrences without import Foundation #634

Description

@Asanta4

Affected versions

Confirmed in rive_native 0.1.4 and 0.1.6 (likely all SPM-shipping versions). Pulled transitively via rive 0.14.4 / 0.14.6.

Environment

  • Flutter 3.41.4 (stable)
  • Xcode 26.0.1 (build 17A400)
  • macOS 14, arm64
  • Swift 6.2 (swiftlang-6.2.0.19.9 clang-1700.3.19.1)
  • iOS deployment target 15.0
  • Hybrid Flutter SPM mode (flutter.config.enable-swift-package-manager: true in pubspec.yaml)

Bug

rive_native/ios/rive_native/Package.swift lines 1–6:

// swift-tools-version: 5.9
import PackageDescription

// Version and checksum are auto-updated by native/build_xcframework.sh
let riveNativeVersion = "0.1.6+1"
let riveNativeVersionURLComponent = riveNativeVersion.replacingOccurrences(of: "+", with: "%2B")

String.replacingOccurrences(of:with:) is a Foundation API. Swift Package Manager compiles Package.swift manifests in a minimal toolchain that does not auto-import Foundation. Result: every swift package resolve / xcodebuild -resolvePackageDependencies against a Flutter project that pulls in rive_native fails with:

error: Invalid manifest (compiled with: ["…", ".../rive_native/Package.swift", …])
.../rive_native/Package.swift:6:55: error: value of type 'String' has no member 'replacingOccurrences'
 4 | // Version and checksum are auto-updated by native/build_xcframework.sh
 5 | let riveNativeVersion = "0.1.6+1"
 6 | let riveNativeVersionURLComponent = riveNativeVersion.replacingOccurrences(of: "+", with: "%2B")
   |                                                       `- error: value of type 'String' has no member 'replacingOccurrences'

Cascading symptom (why this is hard to diagnose)

When SPM fails to compile a single plugin manifest in a Flutter FlutterGeneratedPluginSwiftPackage, the resolver bails out before walking transitive deps. The high-level error xcodebuild reports is misleading — in our case it surfaced as a fake firebase-ios-sdk version conflict:

xcodebuild: error: Could not resolve package dependencies:
  Failed to resolve dependencies Dependencies could not be resolved because
  'cloud_functions' depends on 'firebase-ios-sdk' 12.9.0..<13.0.0 and
  root depends on 'firebase-ios-sdk' 11.7.0..<12.0.0.

The 11.7.0 pin doesn't exist anywhere in the project — it's an artifact of SPM falling back to stale resolution state when the manifest compile fails. We spent ~2 hours chasing the firebase-ios-sdk red herring before tracing the actual rive_native manifest error in swift package resolve --verbose output.

Fix (one line)

Add import Foundation to rive_native/ios/rive_native/Package.swift line 2:

// swift-tools-version: 5.9
import PackageDescription
import Foundation  // ← add this

// Version and checksum are auto-updated by native/build_xcframework.sh
let riveNativeVersion = "0.1.6+1"
let riveNativeVersionURLComponent = riveNativeVersion.replacingOccurrences(of: "+", with: "%2B")

Verified locally: with import Foundation added to the pub-cache copy, xcodebuild -resolvePackageDependencies proceeds past manifest compilation and resolves the full graph successfully.

This is the same pattern other Flutter plugins use — e.g. firebase_core/ios/firebase_core/Package.swift imports both PackageDescription and Foundation since it uses String(contentsOfFile:) and NSString.path(withComponents:).

Why this matters now

Flutter 3.41+ ships SPM as a project-local opt-in (flutter.config.enable-swift-package-manager: true). With the Firebase Apple SDK CocoaPods publishing cutoff in October 2026, every Flutter+Firebase iOS app needs to migrate to SPM mode by then — and any project that pulls rive (which transitively pulls rive_native) will hit this error during their migration.

Happy to send a PR if rive-app accepts external contributions for rive_native — just let me know.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions