From e2699a8f82e8a95b999ea779d3c03297e638d612 Mon Sep 17 00:00:00 2001 From: Nicklas Lundin Date: Fri, 5 Jun 2026 11:29:58 +0200 Subject: [PATCH 1/5] feat: add Swift Package Manager support for iOS Flutter 3.44+ uses SPM by default. This adds a Package.swift manifest so the plugin resolves via SPM while keeping CocoaPods backward compat. Co-Authored-By: Claude Opus 4.6 (1M context) --- ios/confidence_flutter_sdk.podspec | 13 ++++------ ios/confidence_flutter_sdk/.gitignore | 2 ++ ios/confidence_flutter_sdk/Package.swift | 24 +++++++++++++++++++ .../ConfidenceFlutterSdkPlugin.swift | 0 4 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 ios/confidence_flutter_sdk/.gitignore create mode 100644 ios/confidence_flutter_sdk/Package.swift rename ios/{Classes => confidence_flutter_sdk/Sources/confidence_flutter_sdk}/ConfidenceFlutterSdkPlugin.swift (100%) diff --git a/ios/confidence_flutter_sdk.podspec b/ios/confidence_flutter_sdk.podspec index 9d53bd4..29a9190 100644 --- a/ios/confidence_flutter_sdk.podspec +++ b/ios/confidence_flutter_sdk.podspec @@ -5,19 +5,16 @@ Pod::Spec.new do |s| s.name = 'confidence_flutter_sdk' s.version = '0.0.1' - s.summary = 'A new Flutter plugin project.' - s.description = <<-DESC -A new Flutter plugin project. - DESC - s.homepage = 'http://example.com' + s.summary = 'Flutter plugin for the Confidence SDK.' + s.description = 'Flutter plugin for the Confidence SDK.' + s.homepage = 'https://confidence.spotify.com' s.license = { :file => '../LICENSE' } - s.author = { 'Your Company' => 'email@example.com' } + s.author = { 'Confidence' => 'confidence@spotify.com' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' + s.source_files = 'confidence_flutter_sdk/Sources/confidence_flutter_sdk/**/*.swift', 'Classes/Confidence/**/*.swift' s.dependency 'Flutter' s.platform = :ios, '14.0' - # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } s.swift_version = '5.0' end diff --git a/ios/confidence_flutter_sdk/.gitignore b/ios/confidence_flutter_sdk/.gitignore new file mode 100644 index 0000000..bb39a0b --- /dev/null +++ b/ios/confidence_flutter_sdk/.gitignore @@ -0,0 +1,2 @@ +.build/ +Package.resolved diff --git a/ios/confidence_flutter_sdk/Package.swift b/ios/confidence_flutter_sdk/Package.swift new file mode 100644 index 0000000..0694f94 --- /dev/null +++ b/ios/confidence_flutter_sdk/Package.swift @@ -0,0 +1,24 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +let package = Package( + name: "confidence_flutter_sdk", + platforms: [ + .iOS("14.0"), + ], + products: [ + .library(name: "confidence-flutter-sdk", targets: ["confidence_flutter_sdk"]), + ], + dependencies: [ + .package(url: "https://github.com/spotify/confidence-sdk-swift.git", from: "1.4.4"), + ], + targets: [ + .target( + name: "confidence_flutter_sdk", + dependencies: [ + .product(name: "Confidence", package: "confidence-sdk-swift"), + ] + ), + ] +) diff --git a/ios/Classes/ConfidenceFlutterSdkPlugin.swift b/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift similarity index 100% rename from ios/Classes/ConfidenceFlutterSdkPlugin.swift rename to ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift From 8b90fe0db71e6126a505a5ab297a66ae4174dc29 Mon Sep 17 00:00:00 2001 From: Nicklas Lundin Date: Fri, 5 Jun 2026 16:44:39 +0200 Subject: [PATCH 2/5] fix: add conditional import for Confidence module SPM builds Confidence as a separate module requiring an explicit import. CocoaPods compiles everything in one module so the import is unnecessary. #if canImport handles both paths. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift b/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift index cb064b3..548d0aa 100644 --- a/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift +++ b/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift @@ -1,5 +1,8 @@ import Flutter import UIKit +#if canImport(Confidence) +import Confidence +#endif public class ConfidenceFlutterSdkPlugin: NSObject, FlutterPlugin { public static func register(with registrar: FlutterPluginRegistrar) { From f3e7664dd7ead8446873953e060cd3bcc412469a Mon Sep 17 00:00:00 2001 From: Nicklas Lundin Date: Fri, 5 Jun 2026 16:49:08 +0200 Subject: [PATCH 3/5] ci: add SPM build job for iOS Adds a parallel ios-test-spm job using Flutter 3.44.0 which defaults to Swift Package Manager. Renames existing job to ios-test-cocoapods. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/ios-test.yaml | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ios-test.yaml b/.github/workflows/ios-test.yaml index 6d8b59f..c988c12 100644 --- a/.github/workflows/ios-test.yaml +++ b/.github/workflows/ios-test.yaml @@ -7,7 +7,7 @@ on: branches: - '*' jobs: - ios-test: + ios-test-cocoapods: runs-on: macos-latest env: @@ -45,3 +45,27 @@ jobs: - run: echo API_KEY=${{ secrets.TEST_API_KEY }} > example/.env - run: cd example && flutter drive --driver=test_drive/integration_test.dart --target=test/widget_test.dart + + ios-test-spm: + runs-on: macos-latest + + env: + FLUTTER_CHANNEL: stable + FLUTTER_VERSION: 3.44.0 + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - uses: futureware-tech/simulator-action@v3 + with: + model: 'iPhone 16' + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: ${{ env.FLUTTER_CHANNEL }} + + - run: echo API_KEY=${{ secrets.TEST_API_KEY }} > example/.env + - run: cd example && flutter drive --driver=test_drive/integration_test.dart --target=test/widget_test.dart From dc3e9401a51d01e4d17b0ae0cbccac6cd5846e97 Mon Sep 17 00:00:00 2001 From: Nicklas Lundin Date: Fri, 5 Jun 2026 17:06:55 +0200 Subject: [PATCH 4/5] fix: resolve SPM identity mismatch and add FlutterFramework dep SPM derives package identity from the git repo URL (confidence-sdk-flutter) which doesn't match the plugin name (confidence_flutter_sdk). Vendor Confidence sources directly instead of using an external SPM dependency to avoid the identity conflict. Add FlutterFramework dependency required by Flutter 3.41+. Update SPM CI job to copy sources from submodule. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/ios-test.yaml | 6 ++++++ ios/confidence_flutter_sdk/Package.swift | 4 ++-- .../confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift | 3 --- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ios-test.yaml b/.github/workflows/ios-test.yaml index c988c12..e2c0ac7 100644 --- a/.github/workflows/ios-test.yaml +++ b/.github/workflows/ios-test.yaml @@ -57,6 +57,12 @@ jobs: - name: Checkout code uses: actions/checkout@v2 + - name: Fetch submodules + run: git submodule update --init --recursive + + - name: Copy Confidence sources for SPM + run: cp -r ios/Classes/confidence-sdk/Sources/Confidence ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ + - uses: futureware-tech/simulator-action@v3 with: model: 'iPhone 16' diff --git a/ios/confidence_flutter_sdk/Package.swift b/ios/confidence_flutter_sdk/Package.swift index 0694f94..d9a6526 100644 --- a/ios/confidence_flutter_sdk/Package.swift +++ b/ios/confidence_flutter_sdk/Package.swift @@ -11,13 +11,13 @@ let package = Package( .library(name: "confidence-flutter-sdk", targets: ["confidence_flutter_sdk"]), ], dependencies: [ - .package(url: "https://github.com/spotify/confidence-sdk-swift.git", from: "1.4.4"), + .package(name: "FlutterFramework", path: "../FlutterFramework"), ], targets: [ .target( name: "confidence_flutter_sdk", dependencies: [ - .product(name: "Confidence", package: "confidence-sdk-swift"), + .product(name: "FlutterFramework", package: "FlutterFramework"), ] ), ] diff --git a/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift b/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift index 548d0aa..cb064b3 100644 --- a/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift +++ b/ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ConfidenceFlutterSdkPlugin.swift @@ -1,8 +1,5 @@ import Flutter import UIKit -#if canImport(Confidence) -import Confidence -#endif public class ConfidenceFlutterSdkPlugin: NSObject, FlutterPlugin { public static func register(with registrar: FlutterPluginRegistrar) { From 02aac9a632bece11e5cdae0c770bb87e39b1a8b6 Mon Sep 17 00:00:00 2001 From: Nicklas Lundin Date: Mon, 8 Jun 2026 15:23:23 +0200 Subject: [PATCH 5/5] fix: isolate SPM package from parent git identity SPM derives package identity from the parent git repo URL (confidence-sdk-flutter) which doesn't match the plugin directory name (confidence_flutter_sdk). Initialize a standalone git repo inside the package directory in CI so SPM uses the directory name. End users consuming via pub.dev are unaffected since the pub cache has no .git directory. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/ios-test.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ios-test.yaml b/.github/workflows/ios-test.yaml index e2c0ac7..5468d6c 100644 --- a/.github/workflows/ios-test.yaml +++ b/.github/workflows/ios-test.yaml @@ -63,6 +63,9 @@ jobs: - name: Copy Confidence sources for SPM run: cp -r ios/Classes/confidence-sdk/Sources/Confidence ios/confidence_flutter_sdk/Sources/confidence_flutter_sdk/ + - name: Isolate SPM package from parent git repo + run: git init ios/confidence_flutter_sdk + - uses: futureware-tech/simulator-action@v3 with: model: 'iPhone 16'