From b3d30e81acef1f2ad50ba6947ac7cdcd0ccba393 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Fri, 8 May 2026 00:23:28 +0530 Subject: [PATCH 01/11] Create Package.swift file for spm support --- ios/Package.swift | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 ios/Package.swift diff --git a/ios/Package.swift b/ios/Package.swift new file mode 100644 index 0000000..c16e5f2 --- /dev/null +++ b/ios/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "clevertap_plugin", + platforms: [ + .iOS("12.0") + ], + products: [ + .library(name: "clevertap-plugin", targets: ["clevertap_plugin"]) + ], + dependencies: [ + .package( + url: "https://github.com/CleverTap/clevertap-ios-sdk", + from: "7.6.0" + ) + ], + targets: [ + .target( + name: "clevertap_plugin", + dependencies: [ + .product(name: "CleverTapSDK", package: "clevertap-ios-sdk") + ], + path: "Classes", + publicHeadersPath: "include", + cSettings: [ + .headerSearchPath("include"), + .headerSearchPath(".") + ] + ) + ] +) From 2a7a4158598b854d281312ccd5d4ec77541e6e74 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Fri, 8 May 2026 00:25:43 +0530 Subject: [PATCH 02/11] Create symlinks for spm --- ios/Classes/include/CleverTapPlugin.h | 1 + ios/Classes/include/CleverTapPluginAppFunctionPresenter.h | 1 + ios/Classes/include/CleverTapPluginCustomTemplates.h | 1 + ios/Classes/include/CleverTapPluginTemplatePresenter.h | 1 + 4 files changed, 4 insertions(+) create mode 120000 ios/Classes/include/CleverTapPlugin.h create mode 120000 ios/Classes/include/CleverTapPluginAppFunctionPresenter.h create mode 120000 ios/Classes/include/CleverTapPluginCustomTemplates.h create mode 120000 ios/Classes/include/CleverTapPluginTemplatePresenter.h diff --git a/ios/Classes/include/CleverTapPlugin.h b/ios/Classes/include/CleverTapPlugin.h new file mode 120000 index 0000000..66b90f0 --- /dev/null +++ b/ios/Classes/include/CleverTapPlugin.h @@ -0,0 +1 @@ +../CleverTapPlugin.h \ No newline at end of file diff --git a/ios/Classes/include/CleverTapPluginAppFunctionPresenter.h b/ios/Classes/include/CleverTapPluginAppFunctionPresenter.h new file mode 120000 index 0000000..9b84638 --- /dev/null +++ b/ios/Classes/include/CleverTapPluginAppFunctionPresenter.h @@ -0,0 +1 @@ +../CleverTapPluginAppFunctionPresenter.h \ No newline at end of file diff --git a/ios/Classes/include/CleverTapPluginCustomTemplates.h b/ios/Classes/include/CleverTapPluginCustomTemplates.h new file mode 120000 index 0000000..367fdec --- /dev/null +++ b/ios/Classes/include/CleverTapPluginCustomTemplates.h @@ -0,0 +1 @@ +../CleverTapPluginCustomTemplates.h \ No newline at end of file diff --git a/ios/Classes/include/CleverTapPluginTemplatePresenter.h b/ios/Classes/include/CleverTapPluginTemplatePresenter.h new file mode 120000 index 0000000..aff2c7c --- /dev/null +++ b/ios/Classes/include/CleverTapPluginTemplatePresenter.h @@ -0,0 +1 @@ +../CleverTapPluginTemplatePresenter.h \ No newline at end of file From 5d96862bb1adea8fe6a10e41634b91f3a32ae9d2 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Fri, 8 May 2026 00:28:36 +0530 Subject: [PATCH 03/11] Add guard to obj c imports in ClevertapPlugin.m --- ios/Classes/CleverTapPlugin.m | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/ios/Classes/CleverTapPlugin.m b/ios/Classes/CleverTapPlugin.m index 27bb390..7931576 100644 --- a/ios/Classes/CleverTapPlugin.m +++ b/ios/Classes/CleverTapPlugin.m @@ -1,21 +1,101 @@ +#if __has_include() +#import +#else #import "CleverTap.h" +#endif + #import "CleverTapPlugin.h" + +#if __has_include() +#import +#else #import "CleverTap+Inbox.h" +#endif + +#if __has_include() +#import +#else #import "CleverTapUTMDetail.h" +#endif + +#if __has_include() +#import +#else #import "CleverTapEventDetail.h" +#endif + +#if __has_include() +#import +#else #import "CleverTapSyncDelegate.h" +#endif + +#if __has_include() +#import +#else #import "CleverTap+DisplayUnit.h" +#endif + +#if __has_include() +#import +#else #import "CleverTap+FeatureFlags.h" +#endif + +#if __has_include() +#import +#else #import "CleverTap+ProductConfig.h" +#endif + +#if __has_include() +#import +#else #import "CleverTapPushNotificationDelegate.h" +#endif + +#if __has_include() +#import +#else #import "CleverTapInAppNotificationDelegate.h" +#endif + +#if __has_include() +#import +#else #import "CleverTap+InAppNotifications.h" +#endif + +#if __has_include() +#import +#else #import "CleverTap+PushPermission.h" +#endif + +#if __has_include() +#import +#else #import "CTLocalInApp.h" +#endif + +#if __has_include() +#import +#else #import "CleverTap+CTVar.h" +#endif + +#if __has_include() +#import +#else #import "CTVar.h" +#endif + +#if __has_include() +#import +#else #import "CTTemplateContext.h" +#endif @interface CleverTapPlugin () From 203c1e356789f4ed7e3a6362f7dddc7fa3889f3f Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Fri, 8 May 2026 00:30:20 +0530 Subject: [PATCH 04/11] wrapped both CTJsonTemplateProducer.h and CTCustomTemplatesManager.h imports with guards --- ios/Classes/CleverTapPluginCustomTemplates.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ios/Classes/CleverTapPluginCustomTemplates.m b/ios/Classes/CleverTapPluginCustomTemplates.m index d5eaae4..da35cdd 100644 --- a/ios/Classes/CleverTapPluginCustomTemplates.m +++ b/ios/Classes/CleverTapPluginCustomTemplates.m @@ -9,8 +9,18 @@ #import "CleverTapPluginCustomTemplates.h" #import "CleverTapPluginTemplatePresenter.h" #import "CleverTapPluginAppFunctionPresenter.h" + +#if __has_include() +#import +#else #import "CTJsonTemplateProducer.h" +#endif + +#if __has_include() +#import +#else #import "CTCustomTemplatesManager.h" +#endif @implementation CleverTapPluginCustomTemplates From b91d17603baab04358e35c2b022a01e6f1d46597 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Fri, 8 May 2026 00:33:49 +0530 Subject: [PATCH 05/11] Narrowed header files in podspec --- ios/clevertap_plugin.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/clevertap_plugin.podspec b/ios/clevertap_plugin.podspec index e56e912..513fc75 100644 --- a/ios/clevertap_plugin.podspec +++ b/ios/clevertap_plugin.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.author = { "CleverTap" => "http://www.clevertap.com" } s.source = { :path => '.' } s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' + s.public_header_files = 'Classes/*.h' s.dependency 'Flutter' s.dependency 'CleverTap-iOS-SDK', '7.6.0' s.ios.deployment_target = '9.0' From c0b7ecfd3c98039329d5d74c426a5cdab5833d96 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Fri, 8 May 2026 15:39:28 +0530 Subject: [PATCH 06/11] Relocate Package.swift to ios/clevertap_plugin/ for Flutter SPM detection with a Classes symlink --- ios/clevertap_plugin.podspec | 1 + ios/clevertap_plugin/Classes | 1 + ios/{ => clevertap_plugin}/Package.swift | 0 3 files changed, 2 insertions(+) create mode 120000 ios/clevertap_plugin/Classes rename ios/{ => clevertap_plugin}/Package.swift (100%) diff --git a/ios/clevertap_plugin.podspec b/ios/clevertap_plugin.podspec index 513fc75..f4887cb 100644 --- a/ios/clevertap_plugin.podspec +++ b/ios/clevertap_plugin.podspec @@ -11,6 +11,7 @@ Pod::Spec.new do |s| s.author = { "CleverTap" => "http://www.clevertap.com" } s.source = { :path => '.' } s.source_files = 'Classes/**/*' + s.exclude_files = 'Classes/include/**/*' s.public_header_files = 'Classes/*.h' s.dependency 'Flutter' s.dependency 'CleverTap-iOS-SDK', '7.6.0' diff --git a/ios/clevertap_plugin/Classes b/ios/clevertap_plugin/Classes new file mode 120000 index 0000000..3578bf8 --- /dev/null +++ b/ios/clevertap_plugin/Classes @@ -0,0 +1 @@ +../Classes \ No newline at end of file diff --git a/ios/Package.swift b/ios/clevertap_plugin/Package.swift similarity index 100% rename from ios/Package.swift rename to ios/clevertap_plugin/Package.swift From dfd2cf93b21abcfcc7942e176a8c3866398a6b3a Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Tue, 19 May 2026 17:55:46 +0530 Subject: [PATCH 07/11] Add swift package name under ios in pubspec.yaml, added guards for the clevertap.h and clevertapPlugin.h in AppDelegate, remove locale parameter from StyledToast causing build failure --- example/ios/Runner/AppDelegate.m | 9 +++++++++ example/lib/main.dart | 1 - pubspec.yaml | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/example/ios/Runner/AppDelegate.m b/example/ios/Runner/AppDelegate.m index d76db9f..f9b28f8 100644 --- a/example/ios/Runner/AppDelegate.m +++ b/example/ios/Runner/AppDelegate.m @@ -2,9 +2,18 @@ #import "GeneratedPluginRegistrant.h" #import +#if __has_include() +#import +#else #import "CleverTap.h" +#endif +#if __has_include() +#import +#import +#else #import "CleverTapPlugin.h" #import "CleverTapPluginCustomTemplates.h" +#endif @implementation AppDelegate diff --git a/example/lib/main.dart b/example/lib/main.dart index 59daeec..cd138f1 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -563,7 +563,6 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { return StyledToast( - locale: const Locale('en', 'US'), child: MaterialApp( home: Scaffold( appBar: AppBar( diff --git a/pubspec.yaml b/pubspec.yaml index 1e3a71a..fa5a6ac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,6 +28,7 @@ flutter: pluginClass: CleverTapPlugin ios: pluginClass: CleverTapPlugin + swiftPackageName: clevertap_plugin web: pluginClass: CleverTapPluginWeb fileName: clevertap_plugin_web.dart From 52d2d8e982f9ddfdddcf9c34a5dd9704a9247ea1 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Tue, 23 Jun 2026 12:32:06 +0530 Subject: [PATCH 08/11] Fix Package.swift to use same version as podspec to ensure no drift --- ios/clevertap_plugin/Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/clevertap_plugin/Package.swift b/ios/clevertap_plugin/Package.swift index c16e5f2..2b17758 100644 --- a/ios/clevertap_plugin/Package.swift +++ b/ios/clevertap_plugin/Package.swift @@ -12,7 +12,7 @@ let package = Package( dependencies: [ .package( url: "https://github.com/CleverTap/clevertap-ios-sdk", - from: "7.6.0" + exact: "7.6.0" ) ], targets: [ From a7c16eea8a1045b279c355517bebb87975fab042 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Tue, 23 Jun 2026 17:15:43 +0530 Subject: [PATCH 09/11] Restructure folders and files as per the official flutter docs --- ios/.gitignore | 4 +++- ios/Classes/include/CleverTapPlugin.h | 1 - ios/Classes/include/CleverTapPluginAppFunctionPresenter.h | 1 - ios/Classes/include/CleverTapPluginCustomTemplates.h | 1 - ios/Classes/include/CleverTapPluginTemplatePresenter.h | 1 - ios/clevertap_plugin.podspec | 7 +++---- ios/clevertap_plugin/Classes | 1 - ios/clevertap_plugin/Package.swift | 8 +++----- .../Sources/clevertap_plugin}/CleverTapPlugin.m | 0 .../CleverTapPluginAppFunctionPresenter.m | 0 .../clevertap_plugin}/CleverTapPluginCustomTemplates.m | 0 .../clevertap_plugin}/CleverTapPluginTemplatePresenter.m | 0 .../include/clevertap_plugin}/CleverTapPlugin.h | 0 .../CleverTapPluginAppFunctionPresenter.h | 0 .../clevertap_plugin}/CleverTapPluginCustomTemplates.h | 0 .../clevertap_plugin}/CleverTapPluginTemplatePresenter.h | 0 pubspec.yaml | 2 +- 17 files changed, 10 insertions(+), 16 deletions(-) delete mode 120000 ios/Classes/include/CleverTapPlugin.h delete mode 120000 ios/Classes/include/CleverTapPluginAppFunctionPresenter.h delete mode 120000 ios/Classes/include/CleverTapPluginCustomTemplates.h delete mode 120000 ios/Classes/include/CleverTapPluginTemplatePresenter.h delete mode 120000 ios/clevertap_plugin/Classes rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin}/CleverTapPlugin.m (100%) rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin}/CleverTapPluginAppFunctionPresenter.m (100%) rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin}/CleverTapPluginCustomTemplates.m (100%) rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin}/CleverTapPluginTemplatePresenter.m (100%) rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin}/CleverTapPlugin.h (100%) rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin}/CleverTapPluginAppFunctionPresenter.h (100%) rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin}/CleverTapPluginCustomTemplates.h (100%) rename ios/{Classes => clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin}/CleverTapPluginTemplatePresenter.h (100%) diff --git a/ios/.gitignore b/ios/.gitignore index aa479fd..fe343d5 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -34,4 +34,6 @@ Icon? .tags* /Flutter/Generated.xcconfig -/Flutter/flutter_export_environment.sh \ No newline at end of file +/Flutter/flutter_export_environment.sh + +.swiftpm/ \ No newline at end of file diff --git a/ios/Classes/include/CleverTapPlugin.h b/ios/Classes/include/CleverTapPlugin.h deleted file mode 120000 index 66b90f0..0000000 --- a/ios/Classes/include/CleverTapPlugin.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapPlugin.h \ No newline at end of file diff --git a/ios/Classes/include/CleverTapPluginAppFunctionPresenter.h b/ios/Classes/include/CleverTapPluginAppFunctionPresenter.h deleted file mode 120000 index 9b84638..0000000 --- a/ios/Classes/include/CleverTapPluginAppFunctionPresenter.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapPluginAppFunctionPresenter.h \ No newline at end of file diff --git a/ios/Classes/include/CleverTapPluginCustomTemplates.h b/ios/Classes/include/CleverTapPluginCustomTemplates.h deleted file mode 120000 index 367fdec..0000000 --- a/ios/Classes/include/CleverTapPluginCustomTemplates.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapPluginCustomTemplates.h \ No newline at end of file diff --git a/ios/Classes/include/CleverTapPluginTemplatePresenter.h b/ios/Classes/include/CleverTapPluginTemplatePresenter.h deleted file mode 120000 index aff2c7c..0000000 --- a/ios/Classes/include/CleverTapPluginTemplatePresenter.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapPluginTemplatePresenter.h \ No newline at end of file diff --git a/ios/clevertap_plugin.podspec b/ios/clevertap_plugin.podspec index f4887cb..858a0fc 100644 --- a/ios/clevertap_plugin.podspec +++ b/ios/clevertap_plugin.podspec @@ -10,11 +10,10 @@ Pod::Spec.new do |s| s.license = { :file => '../LICENSE' } s.author = { "CleverTap" => "http://www.clevertap.com" } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.exclude_files = 'Classes/include/**/*' - s.public_header_files = 'Classes/*.h' + s.source_files = 'clevertap_plugin/Sources/clevertap_plugin/**/*.{h,m}' + s.public_header_files = 'clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/*.h' s.dependency 'Flutter' s.dependency 'CleverTap-iOS-SDK', '7.6.0' - s.ios.deployment_target = '9.0' + s.ios.deployment_target = '13.0' end diff --git a/ios/clevertap_plugin/Classes b/ios/clevertap_plugin/Classes deleted file mode 120000 index 3578bf8..0000000 --- a/ios/clevertap_plugin/Classes +++ /dev/null @@ -1 +0,0 @@ -../Classes \ No newline at end of file diff --git a/ios/clevertap_plugin/Package.swift b/ios/clevertap_plugin/Package.swift index 2b17758..476d9e1 100644 --- a/ios/clevertap_plugin/Package.swift +++ b/ios/clevertap_plugin/Package.swift @@ -4,7 +4,7 @@ import PackageDescription let package = Package( name: "clevertap_plugin", platforms: [ - .iOS("12.0") + .iOS("13.0") ], products: [ .library(name: "clevertap-plugin", targets: ["clevertap_plugin"]) @@ -21,11 +21,9 @@ let package = Package( dependencies: [ .product(name: "CleverTapSDK", package: "clevertap-ios-sdk") ], - path: "Classes", - publicHeadersPath: "include", + publicHeadersPath: "include/clevertap_plugin", cSettings: [ - .headerSearchPath("include"), - .headerSearchPath(".") + .headerSearchPath("include/clevertap_plugin") ] ) ] diff --git a/ios/Classes/CleverTapPlugin.m b/ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPlugin.m similarity index 100% rename from ios/Classes/CleverTapPlugin.m rename to ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPlugin.m diff --git a/ios/Classes/CleverTapPluginAppFunctionPresenter.m b/ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPluginAppFunctionPresenter.m similarity index 100% rename from ios/Classes/CleverTapPluginAppFunctionPresenter.m rename to ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPluginAppFunctionPresenter.m diff --git a/ios/Classes/CleverTapPluginCustomTemplates.m b/ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPluginCustomTemplates.m similarity index 100% rename from ios/Classes/CleverTapPluginCustomTemplates.m rename to ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPluginCustomTemplates.m diff --git a/ios/Classes/CleverTapPluginTemplatePresenter.m b/ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPluginTemplatePresenter.m similarity index 100% rename from ios/Classes/CleverTapPluginTemplatePresenter.m rename to ios/clevertap_plugin/Sources/clevertap_plugin/CleverTapPluginTemplatePresenter.m diff --git a/ios/Classes/CleverTapPlugin.h b/ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPlugin.h similarity index 100% rename from ios/Classes/CleverTapPlugin.h rename to ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPlugin.h diff --git a/ios/Classes/CleverTapPluginAppFunctionPresenter.h b/ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPluginAppFunctionPresenter.h similarity index 100% rename from ios/Classes/CleverTapPluginAppFunctionPresenter.h rename to ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPluginAppFunctionPresenter.h diff --git a/ios/Classes/CleverTapPluginCustomTemplates.h b/ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPluginCustomTemplates.h similarity index 100% rename from ios/Classes/CleverTapPluginCustomTemplates.h rename to ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPluginCustomTemplates.h diff --git a/ios/Classes/CleverTapPluginTemplatePresenter.h b/ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPluginTemplatePresenter.h similarity index 100% rename from ios/Classes/CleverTapPluginTemplatePresenter.h rename to ios/clevertap_plugin/Sources/clevertap_plugin/include/clevertap_plugin/CleverTapPluginTemplatePresenter.h diff --git a/pubspec.yaml b/pubspec.yaml index fa5a6ac..50fe6b5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://github.com/CleverTap/clevertap-flutter environment: sdk: '>=2.12.0 <4.0.0' - flutter: ">=1.17.0" + flutter: ">=3.41.0" dependencies: flutter: From 9e9fdf6ff971839309a5cf772b2e8604add8f1b3 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Thu, 25 Jun 2026 13:24:21 +0530 Subject: [PATCH 10/11] Fix version in package.swift to match podspec for correct version resolution for sdk --- ios/clevertap_plugin/Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/clevertap_plugin/Package.swift b/ios/clevertap_plugin/Package.swift index 476d9e1..46a36e2 100644 --- a/ios/clevertap_plugin/Package.swift +++ b/ios/clevertap_plugin/Package.swift @@ -12,7 +12,7 @@ let package = Package( dependencies: [ .package( url: "https://github.com/CleverTap/clevertap-ios-sdk", - exact: "7.6.0" + exact: "7.7.1" ) ], targets: [ From 74ecaa996346db38da9590902b1a5e333be12493 Mon Sep 17 00:00:00 2001 From: ReshabCT Date: Thu, 25 Jun 2026 14:53:26 +0530 Subject: [PATCH 11/11] Add spm integration doc for flutter --- doc/Integrate-iOS-SPM.md | 104 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 doc/Integrate-iOS-SPM.md diff --git a/doc/Integrate-iOS-SPM.md b/doc/Integrate-iOS-SPM.md new file mode 100644 index 0000000..731b144 --- /dev/null +++ b/doc/Integrate-iOS-SPM.md @@ -0,0 +1,104 @@ +## 📦 iOS Integration via Swift Package Manager (SPM) + +Starting from Flutter 3.27, Flutter supports resolving plugin dependencies via Swift Package Manager in addition to CocoaPods. The CleverTap Flutter plugin ships a `Package.swift` alongside its podspec, so both package managers resolve the same native SDK version (`CleverTap-iOS-SDK 7.7.1`). + +> **Minimum requirements** +> - Flutter 3.27+ +> - Xcode 15+ +> - iOS deployment target: 13.0+ + +--- + +### How it works + +Flutter's SPM support detects plugins that declare a `swiftPackageName` in their `pubspec.yaml`. The CleverTap plugin sets: + +```yaml +# pubspec.yaml (inside the plugin) +ios: + pluginClass: CleverTapPlugin + swiftPackageName: clevertap_plugin +``` + +Flutter then looks for a `Package.swift` under `ios//` (`ios/clevertap_plugin/Package.swift`). That manifest pins the CleverTap iOS SDK: + +```swift +.package( + url: "https://github.com/CleverTap/clevertap-ios-sdk", + exact: "7.7.1" +) +``` + +When your app is built, Flutter resolves this package automatically — no manual entry in `Package.swift` of your app is required. + +--- + +### Enabling SPM in your Flutter app + +SPM support in Flutter is opt-in. Enable it by setting the `FLTEnableSwiftPackageManagerIntegration` flag in your iOS app's `Info.plist`: + +```xml +FLTEnableSwiftPackageManagerIntegration + +``` + +Or via the Flutter CLI environment variable when running or building: + +```bash +flutter run --enable-swift-package-manager +flutter build ios --enable-swift-package-manager +``` + +After enabling, run `flutter pub get` and then open your `.xcworkspace` in Xcode. Xcode will resolve the CleverTap iOS SDK via SPM automatically. + +--- + +### AppDelegate changes when using SPM + +When Flutter resolves the plugin via SPM, the module name changes. Use conditional imports in your `AppDelegate` to support both CocoaPods and SPM builds: + +###### Objective-C + +```objc +#if __has_include() +#import +#else +#import "CleverTap.h" +#endif + +#if __has_include() +#import +#else +#import "CleverTapPlugin.h" +#endif +``` + +###### Swift + +```swift +import CleverTapSDK +import clevertap_plugin +``` + +These guards ensure your app compiles correctly regardless of which package manager resolved the dependency. + +--- + +### CocoaPods vs SPM + +| | CocoaPods | SPM | +|---|---|---| +| Config file | `ios/clevertap_plugin.podspec` | `ios/clevertap_plugin/Package.swift` | +| SDK version pinned | `7.7.1` | `7.7.1` | +| Deployment target | `13.0` | `13.0` | +| Opt-in required | No (default) | Yes (see above) | + +Both package managers resolve the same CleverTap iOS SDK version to ensure no drift between the two integration paths. + +--- + +### Troubleshooting + +- **Xcode doesn't resolve the package**: Run `flutter pub get`, then in Xcode go to **File → Packages → Resolve Package Versions**. +- **Duplicate symbol errors**: Ensure you are not using both CocoaPods and SPM for the same plugin simultaneously. If you have a `Podfile` and SPM enabled, Flutter will prefer SPM for plugins that support it. +- **Build fails with missing headers**: Verify your deployment target is set to `13.0` or higher in both your Xcode project and `Podfile`/`Package.swift`.