From fa044acde494baa6254d0e2476248e80936b6ced Mon Sep 17 00:00:00 2001 From: Nurlan Garash Date: Mon, 22 Jun 2026 15:40:46 +0400 Subject: [PATCH] feat(ios): add Swift Package Manager support Adds a Package.swift manifest alongside the existing podspec so the plugin builds with Flutter 3.44+ Swift Package Manager while remaining fully CocoaPods-compatible. - Move ios/Classes -> ios/superwallkit_flutter/Sources/superwallkit_flutter (shared source tree consumed by both SPM and CocoaPods) - Add ios/superwallkit_flutter/Package.swift (iOS 14.0), depending on the SuperwallKit SPM package (github.com/superwall/Superwall-iOS) pinned to 4.14.2 to match the podspec - Update podspec source_files to the new shared path - Ignore SPM build artifacts Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 5 ++++ ios/.gitignore | 6 ++++- ios/superwallkit_flutter.podspec | 2 +- ios/superwallkit_flutter/Package.swift | 27 +++++++++++++++++++ .../FeatureHandler.swift | 0 .../Mappers/CustomerInfo+Pigeonify.swift | 0 .../Mappers/OptionsMapper.swift | 0 .../Mappers/PaywallInfoMapper.swift | 0 ...ywallPresentationRequestStatusMapper.swift | 0 ...resentationRequestStatusReasonMapper.swift | 0 .../Mappers/PresentationResultMapper.swift | 0 .../Mappers/RedemptionResult+Pigeonify.swift | 0 .../Mappers/RestoreTypeMapper.swift | 0 .../Mappers/StoreProductMapper.swift | 0 .../Mappers/StoreTransactionMapper.swift | 0 .../Mappers/SurveyOptionMapper.swift | 0 .../Mappers/TriggerResultMapper.swift | 0 .../PaywallPresentationHandler.swift | 0 .../PurchaseController.swift | 0 .../SuperwallDelegate.swift | 0 .../superwallkit_flutter}/SuperwallHost.swift | 0 .../SuperwallHostGenerated.swift | 0 .../SuperwallkitFlutterPlugin.swift | 0 23 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 ios/superwallkit_flutter/Package.swift rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/FeatureHandler.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/CustomerInfo+Pigeonify.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/OptionsMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/PaywallInfoMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/PaywallPresentationRequestStatusMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/PaywallPresentationRequestStatusReasonMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/PresentationResultMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/RedemptionResult+Pigeonify.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/RestoreTypeMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/StoreProductMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/StoreTransactionMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/SurveyOptionMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/Mappers/TriggerResultMapper.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/PaywallPresentationHandler.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/PurchaseController.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/SuperwallDelegate.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/SuperwallHost.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/SuperwallHostGenerated.swift (100%) rename ios/{Classes => superwallkit_flutter/Sources/superwallkit_flutter}/SuperwallkitFlutterPlugin.swift (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66bdf85..d4f7a92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ The changelog for `Superwall`. Also see the [releases](https://github.com/superwall/Superwall-Flutter/releases) on GitHub. +## Unreleased + +### Enhancements +- Adds Swift Package Manager (SPM) support for iOS, alongside the existing CocoaPods support. This removes the "plugin does not support Swift Package Manager" warning under Flutter 3.44+ while remaining fully backward compatible with CocoaPods. + ## 2.4.12 ### Enhancements diff --git a/ios/.gitignore b/ios/.gitignore index 0c88507..cdabff7 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -35,4 +35,8 @@ Icon? /Flutter/Generated.xcconfig /Flutter/ephemeral/ -/Flutter/flutter_export_environment.sh \ No newline at end of file +/Flutter/flutter_export_environment.sh +# Swift Package Manager +.build/ +.swiftpm/ +Package.resolved diff --git a/ios/superwallkit_flutter.podspec b/ios/superwallkit_flutter.podspec index 5ebcf04..570b24d 100644 --- a/ios/superwallkit_flutter.podspec +++ b/ios/superwallkit_flutter.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.license = { :file => '../LICENSE' } s.author = { 'Superwall' => 'jake@superwall.com' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' + s.source_files = 'superwallkit_flutter/Sources/superwallkit_flutter/**/*' s.dependency 'Flutter' s.dependency 'SuperwallKit', '4.14.2' s.platform = :ios, '14.0' diff --git a/ios/superwallkit_flutter/Package.swift b/ios/superwallkit_flutter/Package.swift new file mode 100644 index 0000000..7138579 --- /dev/null +++ b/ios/superwallkit_flutter/Package.swift @@ -0,0 +1,27 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "superwallkit_flutter", + platforms: [ + .iOS("14.0") + ], + products: [ + .library(name: "superwallkit-flutter", targets: ["superwallkit_flutter"]) + ], + dependencies: [ + // Pinned to match the version declared in the podspec + // (s.dependency 'SuperwallKit', '4.14.2'). + .package(url: "https://github.com/superwall/Superwall-iOS.git", exact: "4.14.2") + ], + targets: [ + .target( + name: "superwallkit_flutter", + dependencies: [ + .product(name: "SuperwallKit", package: "Superwall-iOS") + ] + ) + ] +) diff --git a/ios/Classes/FeatureHandler.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/FeatureHandler.swift similarity index 100% rename from ios/Classes/FeatureHandler.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/FeatureHandler.swift diff --git a/ios/Classes/Mappers/CustomerInfo+Pigeonify.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/CustomerInfo+Pigeonify.swift similarity index 100% rename from ios/Classes/Mappers/CustomerInfo+Pigeonify.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/CustomerInfo+Pigeonify.swift diff --git a/ios/Classes/Mappers/OptionsMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/OptionsMapper.swift similarity index 100% rename from ios/Classes/Mappers/OptionsMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/OptionsMapper.swift diff --git a/ios/Classes/Mappers/PaywallInfoMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PaywallInfoMapper.swift similarity index 100% rename from ios/Classes/Mappers/PaywallInfoMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PaywallInfoMapper.swift diff --git a/ios/Classes/Mappers/PaywallPresentationRequestStatusMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PaywallPresentationRequestStatusMapper.swift similarity index 100% rename from ios/Classes/Mappers/PaywallPresentationRequestStatusMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PaywallPresentationRequestStatusMapper.swift diff --git a/ios/Classes/Mappers/PaywallPresentationRequestStatusReasonMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PaywallPresentationRequestStatusReasonMapper.swift similarity index 100% rename from ios/Classes/Mappers/PaywallPresentationRequestStatusReasonMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PaywallPresentationRequestStatusReasonMapper.swift diff --git a/ios/Classes/Mappers/PresentationResultMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PresentationResultMapper.swift similarity index 100% rename from ios/Classes/Mappers/PresentationResultMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/PresentationResultMapper.swift diff --git a/ios/Classes/Mappers/RedemptionResult+Pigeonify.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/RedemptionResult+Pigeonify.swift similarity index 100% rename from ios/Classes/Mappers/RedemptionResult+Pigeonify.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/RedemptionResult+Pigeonify.swift diff --git a/ios/Classes/Mappers/RestoreTypeMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/RestoreTypeMapper.swift similarity index 100% rename from ios/Classes/Mappers/RestoreTypeMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/RestoreTypeMapper.swift diff --git a/ios/Classes/Mappers/StoreProductMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/StoreProductMapper.swift similarity index 100% rename from ios/Classes/Mappers/StoreProductMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/StoreProductMapper.swift diff --git a/ios/Classes/Mappers/StoreTransactionMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/StoreTransactionMapper.swift similarity index 100% rename from ios/Classes/Mappers/StoreTransactionMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/StoreTransactionMapper.swift diff --git a/ios/Classes/Mappers/SurveyOptionMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/SurveyOptionMapper.swift similarity index 100% rename from ios/Classes/Mappers/SurveyOptionMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/SurveyOptionMapper.swift diff --git a/ios/Classes/Mappers/TriggerResultMapper.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/TriggerResultMapper.swift similarity index 100% rename from ios/Classes/Mappers/TriggerResultMapper.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/Mappers/TriggerResultMapper.swift diff --git a/ios/Classes/PaywallPresentationHandler.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/PaywallPresentationHandler.swift similarity index 100% rename from ios/Classes/PaywallPresentationHandler.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/PaywallPresentationHandler.swift diff --git a/ios/Classes/PurchaseController.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/PurchaseController.swift similarity index 100% rename from ios/Classes/PurchaseController.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/PurchaseController.swift diff --git a/ios/Classes/SuperwallDelegate.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallDelegate.swift similarity index 100% rename from ios/Classes/SuperwallDelegate.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallDelegate.swift diff --git a/ios/Classes/SuperwallHost.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallHost.swift similarity index 100% rename from ios/Classes/SuperwallHost.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallHost.swift diff --git a/ios/Classes/SuperwallHostGenerated.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallHostGenerated.swift similarity index 100% rename from ios/Classes/SuperwallHostGenerated.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallHostGenerated.swift diff --git a/ios/Classes/SuperwallkitFlutterPlugin.swift b/ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallkitFlutterPlugin.swift similarity index 100% rename from ios/Classes/SuperwallkitFlutterPlugin.swift rename to ios/superwallkit_flutter/Sources/superwallkit_flutter/SuperwallkitFlutterPlugin.swift