From 1c451730acde8170510eb6ebcb2f45e9fbeffc12 Mon Sep 17 00:00:00 2001 From: Theo Germain Date: Fri, 29 May 2026 21:01:09 +0200 Subject: [PATCH 1/2] feat(ios): add Swift Package Manager (SPM) support Adds a Package.swift manifest for the iOS plugin so apps using Flutter's Swift Package Manager integration can resolve mixpanel_flutter natively instead of falling back to CocoaPods. CocoaPods consumers are unaffected. Changes: - ios/mixpanel_flutter/Package.swift: SPM manifest targeting iOS 12.0, depends on mixpanel-swift 6.4.0 (matches the podspec). - ios/mixpanel_flutter/Sources/mixpanel_flutter/: symlinks to swift/Classes/ (same pattern as macos/Classes/). - ios/mixpanel_flutter.podspec: source_files updated to Sources/ layout. - ios/Classes/: removed ObjC wrapper and old symlinks. The Swift class is now exposed to ObjC via @objc(MixpanelFlutterPlugin), making the wrapper redundant. - swift/Classes/SwiftMixpanelFlutterPlugin.swift: added @objc(MixpanelFlutterPlugin) so ObjC AppDelegate projects continue to work without the wrapper. Rebased on top of the packages/ monorepo restructuring (main after #241). Closes #176. --- .../ios/Classes/MixpanelFlutterPlugin.h | 4 --- .../ios/Classes/MixpanelFlutterPlugin.m | 15 --------- .../ios/Classes/MixpanelTypeHandler.swift | 1 - .../Classes/SwiftMixpanelFlutterPlugin.swift | 1 - .../ios/mixpanel_flutter.podspec | 2 +- .../ios/mixpanel_flutter/Package.swift | 31 +++++++++++++++++++ .../MixpanelTypeHandler.swift | 1 + .../SwiftMixpanelFlutterPlugin.swift | 1 + .../Classes/SwiftMixpanelFlutterPlugin.swift | 1 + 9 files changed, 35 insertions(+), 22 deletions(-) delete mode 100644 packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.h delete mode 100644 packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.m delete mode 120000 packages/mixpanel_flutter/ios/Classes/MixpanelTypeHandler.swift delete mode 120000 packages/mixpanel_flutter/ios/Classes/SwiftMixpanelFlutterPlugin.swift create mode 100644 packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift create mode 120000 packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/MixpanelTypeHandler.swift create mode 120000 packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/SwiftMixpanelFlutterPlugin.swift diff --git a/packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.h b/packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.h deleted file mode 100644 index 3f615430..00000000 --- a/packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.h +++ /dev/null @@ -1,4 +0,0 @@ -#import - -@interface MixpanelFlutterPlugin : NSObject -@end diff --git a/packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.m b/packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.m deleted file mode 100644 index 0db539aa..00000000 --- a/packages/mixpanel_flutter/ios/Classes/MixpanelFlutterPlugin.m +++ /dev/null @@ -1,15 +0,0 @@ -#import "MixpanelFlutterPlugin.h" -#if __has_include() -#import -#else -// Support project import fallback if the generated compatibility header -// is not copied when this plugin is created as a library. -// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "mixpanel_flutter-Swift.h" -#endif - -@implementation MixpanelFlutterPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftMixpanelFlutterPlugin registerWithRegistrar:registrar]; -} -@end diff --git a/packages/mixpanel_flutter/ios/Classes/MixpanelTypeHandler.swift b/packages/mixpanel_flutter/ios/Classes/MixpanelTypeHandler.swift deleted file mode 120000 index 0642a4a4..00000000 --- a/packages/mixpanel_flutter/ios/Classes/MixpanelTypeHandler.swift +++ /dev/null @@ -1 +0,0 @@ -../../swift/Classes/MixpanelTypeHandler.swift \ No newline at end of file diff --git a/packages/mixpanel_flutter/ios/Classes/SwiftMixpanelFlutterPlugin.swift b/packages/mixpanel_flutter/ios/Classes/SwiftMixpanelFlutterPlugin.swift deleted file mode 120000 index 4eb68a61..00000000 --- a/packages/mixpanel_flutter/ios/Classes/SwiftMixpanelFlutterPlugin.swift +++ /dev/null @@ -1 +0,0 @@ -../../swift/Classes/SwiftMixpanelFlutterPlugin.swift \ No newline at end of file diff --git a/packages/mixpanel_flutter/ios/mixpanel_flutter.podspec b/packages/mixpanel_flutter/ios/mixpanel_flutter.podspec index eac3c0a7..8aa806ee 100644 --- a/packages/mixpanel_flutter/ios/mixpanel_flutter.podspec +++ b/packages/mixpanel_flutter/ios/mixpanel_flutter.podspec @@ -13,7 +13,7 @@ Pod::Spec.new do |s| s.license = { :file => '../LICENSE' } s.author = { 'Mixpanel, Inc' => 'support@mixpanel.com' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' + s.source_files = 'mixpanel_flutter/Sources/mixpanel_flutter/**/*.swift' s.dependency 'Flutter' s.dependency 'Mixpanel-swift', '6.4.0' s.platform = :ios, '12.0' diff --git a/packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift b/packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift new file mode 100644 index 00000000..418a7bc3 --- /dev/null +++ b/packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift @@ -0,0 +1,31 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "mixpanel_flutter", + platforms: [ + .iOS("12.0") + ], + products: [ + .library( + name: "mixpanel-flutter", + targets: ["mixpanel_flutter"] + ) + ], + dependencies: [ + .package( + url: "https://github.com/mixpanel/mixpanel-swift.git", + exact: "6.4.0" + ) + ], + targets: [ + .target( + name: "mixpanel_flutter", + dependencies: [ + .product(name: "Mixpanel", package: "mixpanel-swift") + ], + path: "Sources/mixpanel_flutter", + resources: [] + ) + ] +) diff --git a/packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/MixpanelTypeHandler.swift b/packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/MixpanelTypeHandler.swift new file mode 120000 index 00000000..2dd30312 --- /dev/null +++ b/packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/MixpanelTypeHandler.swift @@ -0,0 +1 @@ +../../../../swift/Classes/MixpanelTypeHandler.swift \ No newline at end of file diff --git a/packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/SwiftMixpanelFlutterPlugin.swift b/packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/SwiftMixpanelFlutterPlugin.swift new file mode 120000 index 00000000..2287cd73 --- /dev/null +++ b/packages/mixpanel_flutter/ios/mixpanel_flutter/Sources/mixpanel_flutter/SwiftMixpanelFlutterPlugin.swift @@ -0,0 +1 @@ +../../../../swift/Classes/SwiftMixpanelFlutterPlugin.swift \ No newline at end of file diff --git a/packages/mixpanel_flutter/swift/Classes/SwiftMixpanelFlutterPlugin.swift b/packages/mixpanel_flutter/swift/Classes/SwiftMixpanelFlutterPlugin.swift index 76859c3c..26fd1bdf 100644 --- a/packages/mixpanel_flutter/swift/Classes/SwiftMixpanelFlutterPlugin.swift +++ b/packages/mixpanel_flutter/swift/Classes/SwiftMixpanelFlutterPlugin.swift @@ -9,6 +9,7 @@ import Mixpanel public typealias MixpanelFlutterPlugin = SwiftMixpanelFlutterPlugin #endif +@objc(MixpanelFlutterPlugin) public class SwiftMixpanelFlutterPlugin: NSObject, FlutterPlugin { private var instance: MixpanelInstance? From bbaa0e1a3d9c6ec261abbc2cbcde146ff011af5d Mon Sep 17 00:00:00 2001 From: Theo Germain Date: Thu, 4 Jun 2026 16:19:43 +0200 Subject: [PATCH 2/2] fix(spm): bump iOS minimum deployment target to 13.0 in Package.swift --- packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift b/packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift index 418a7bc3..ffaafa13 100644 --- a/packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift +++ b/packages/mixpanel_flutter/ios/mixpanel_flutter/Package.swift @@ -4,7 +4,7 @@ import PackageDescription let package = Package( name: "mixpanel_flutter", platforms: [ - .iOS("12.0") + .iOS("13.0") ], products: [ .library(