From 598da0929926c450c2485a2451313b538a3e711c Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Thu, 28 May 2026 15:12:55 +0300 Subject: [PATCH 01/10] MOBILE-146: Add Swift Package Manager support to mindbox_ios MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ship a Package.swift alongside the existing podspec, so the plugin resolves via SPM (Flutter ≥ 3.29) and via CocoaPods unchanged. Swift sources move to ios/mindbox_ios/Sources/mindbox_ios/ — the layout required by SwiftPM — and the podspec source_files now points there plus the legacy ObjC AppDelegate from Classes/. Drop the Objective-C plugin bridge (MindboxIosPlugin.{h,m}); the plugin registers directly through the renamed Swift class MindboxIosPlugin (the `Swift` prefix was a carry-over from the ObjC bridge era and stopped describing anything once the bridge was deleted). Flutter's GeneratedPluginRegistrant.m falls back from `#import` of the missing ObjC header to `@import mindbox_ios;`, which picks up the Swift class via the auto-generated mindbox_ios-Swift.h. The corresponding stale #import in the ObjC AppDelegate goes away too. ObjC MindboxFlutterAppDelegateObjc stays in Classes/ for existing CocoaPods consumers, marked deprecated. It is intentionally not exposed via the SPM target — gating that on Flutter ≥ 3.41 (the documented minimum for SPM ObjC plugins with FlutterFramework) is not worth bumping the SPM-minimum for a deprecated path. Misc cleanups in the moved Swift files: drop the unused 'MindboxNotifications' import in MindboxFlutterAppDelegate.swift, and simplify writeNativeLog by seeding the local 'level' var from 'Mindbox.logger.logLevel' to inherit the LogLevel type via inference. That drops the 'import MindboxLogger' from the plugin — which would otherwise fail in SPM mode since MindboxLogger is a target in ios-sdk's Package.swift but not exposed as a product. Verified locally on Flutter 3.44 (Example) and Flutter 3.29 (flutter-app) on iPhone 17 Pro simulator: both SPM and CocoaPods builds initialize the SDK, return an APNS token and device UUID. No crash, no duplicate framework load. 'pod lib lint mindbox_ios.podspec' passes after dropping the local cocoapods-spm gem (its macro_pods hook breaks unrelated specs). --- mindbox_ios/.gitignore | 5 ++ .../ios/Classes/MindboxFlutterAppDelegate.h | 1 + .../ios/Classes/MindboxFlutterAppDelegate.m | 1 - mindbox_ios/ios/Classes/MindboxIosPlugin.h | 7 -- mindbox_ios/ios/Classes/MindboxIosPlugin.m | 19 ------ mindbox_ios/ios/mindbox_ios.podspec | 2 +- mindbox_ios/ios/mindbox_ios/Package.swift | 23 +++++++ .../Sources/mindbox_ios}/Constants.swift | 0 .../MindboxFlutterAppDelegate.swift | 1 - .../mindbox_ios/MindboxIosPlugin.swift} | 67 +++++++++---------- .../inappCallbacks/Callbacks.swift | 0 11 files changed, 62 insertions(+), 64 deletions(-) delete mode 100644 mindbox_ios/ios/Classes/MindboxIosPlugin.h delete mode 100644 mindbox_ios/ios/Classes/MindboxIosPlugin.m create mode 100644 mindbox_ios/ios/mindbox_ios/Package.swift rename mindbox_ios/ios/{Classes => mindbox_ios/Sources/mindbox_ios}/Constants.swift (100%) rename mindbox_ios/ios/{Classes => mindbox_ios/Sources/mindbox_ios}/MindboxFlutterAppDelegate.swift (99%) rename mindbox_ios/ios/{Classes/SwiftMindboxIosPlugin.swift => mindbox_ios/Sources/mindbox_ios/MindboxIosPlugin.swift} (90%) rename mindbox_ios/ios/{Classes => mindbox_ios/Sources/mindbox_ios}/inappCallbacks/Callbacks.swift (100%) diff --git a/mindbox_ios/.gitignore b/mindbox_ios/.gitignore index 845d9c5..20e86f1 100644 --- a/mindbox_ios/.gitignore +++ b/mindbox_ios/.gitignore @@ -7,3 +7,8 @@ pubspec.lock .pub/ mindbox_ios.iml build/ + +# Swift Package Manager +.build/ +.swiftpm/ +Package.resolved diff --git a/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.h b/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.h index ed46c98..ad35e6d 100644 --- a/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.h +++ b/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.h @@ -1,5 +1,6 @@ #import +DEPRECATED_MSG_ATTRIBUTE("Use Swift MindboxFlutterAppDelegate instead. ObjC version will be removed in mindbox_ios 3.0.0.") @interface MindboxFlutterAppDelegateObjc : FlutterAppDelegate @end diff --git a/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.m b/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.m index b4b7a44..5c5dbbe 100644 --- a/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.m +++ b/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.m @@ -1,5 +1,4 @@ #import -#import @import Mindbox; diff --git a/mindbox_ios/ios/Classes/MindboxIosPlugin.h b/mindbox_ios/ios/Classes/MindboxIosPlugin.h deleted file mode 100644 index 2f84f1b..0000000 --- a/mindbox_ios/ios/Classes/MindboxIosPlugin.h +++ /dev/null @@ -1,7 +0,0 @@ -#import - -@interface MindboxIosPlugin : NSObject - -+ (void)pushClicked:(UNNotificationResponse*)response __attribute__((deprecated)); - -@end diff --git a/mindbox_ios/ios/Classes/MindboxIosPlugin.m b/mindbox_ios/ios/Classes/MindboxIosPlugin.m deleted file mode 100644 index 50841ea..0000000 --- a/mindbox_ios/ios/Classes/MindboxIosPlugin.m +++ /dev/null @@ -1,19 +0,0 @@ -#import "MindboxIosPlugin.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 "mindbox_ios-Swift.h" -#endif - -@implementation MindboxIosPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftMindboxIosPlugin registerWithRegistrar:registrar]; -} - -+ (void)pushClicked:(UNNotificationResponse *)response __attribute__((deprecated(""))) { -} - -@end diff --git a/mindbox_ios/ios/mindbox_ios.podspec b/mindbox_ios/ios/mindbox_ios.podspec index 1b40a94..93f5e29 100644 --- a/mindbox_ios/ios/mindbox_ios.podspec +++ b/mindbox_ios/ios/mindbox_ios.podspec @@ -13,7 +13,7 @@ The implementation of 'mindbox' plugin for the iOS platform s.license = { :file => '../LICENSE' } s.author = { 'Mindbox' => 'it@mindbox.ru' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' + s.source_files = 'mindbox_ios/Sources/mindbox_ios/**/*.swift', 'Classes/MindboxFlutterAppDelegate.{h,m}' s.dependency 'Flutter' s.dependency 'Mindbox', '2.15.1' s.dependency 'MindboxNotifications', '2.15.1' diff --git a/mindbox_ios/ios/mindbox_ios/Package.swift b/mindbox_ios/ios/mindbox_ios/Package.swift new file mode 100644 index 0000000..177b7ef --- /dev/null +++ b/mindbox_ios/ios/mindbox_ios/Package.swift @@ -0,0 +1,23 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "mindbox_ios", + platforms: [ + .iOS(.v12) + ], + products: [ + .library(name: "mindbox-ios", targets: ["mindbox_ios"]) + ], + dependencies: [ + .package(url: "https://github.com/mindbox-cloud/ios-sdk", exact: "2.15.1"), + ], + targets: [ + .target( + name: "mindbox_ios", + dependencies: [ + .product(name: "Mindbox", package: "ios-sdk"), + ] + ) + ] +) diff --git a/mindbox_ios/ios/Classes/Constants.swift b/mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/Constants.swift similarity index 100% rename from mindbox_ios/ios/Classes/Constants.swift rename to mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/Constants.swift diff --git a/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.swift b/mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/MindboxFlutterAppDelegate.swift similarity index 99% rename from mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.swift rename to mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/MindboxFlutterAppDelegate.swift index 253d07d..822039d 100644 --- a/mindbox_ios/ios/Classes/MindboxFlutterAppDelegate.swift +++ b/mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/MindboxFlutterAppDelegate.swift @@ -1,7 +1,6 @@ import UIKit import Flutter import Mindbox -import MindboxNotifications open class MindboxFlutterAppDelegate: FlutterAppDelegate { diff --git a/mindbox_ios/ios/Classes/SwiftMindboxIosPlugin.swift b/mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/MindboxIosPlugin.swift similarity index 90% rename from mindbox_ios/ios/Classes/SwiftMindboxIosPlugin.swift rename to mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/MindboxIosPlugin.swift index 5d07fa9..8c29877 100644 --- a/mindbox_ios/ios/Classes/SwiftMindboxIosPlugin.swift +++ b/mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/MindboxIosPlugin.swift @@ -1,56 +1,55 @@ import Flutter import UIKit import Mindbox -import MindboxLogger -public class SwiftMindboxIosPlugin: NSObject, FlutterPlugin { +public class MindboxIosPlugin: NSObject, FlutterPlugin { private final var channel: FlutterMethodChannel - + private final let compositeDelegate = CompositeClass() - + public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: Constants.pluginChannelName, binaryMessenger: registrar.messenger()) - let instance = SwiftMindboxIosPlugin(channel: channel) + let instance = MindboxIosPlugin(channel: channel) registrar.addMethodCallDelegate(instance, channel: channel) registrar.addApplicationDelegate(instance) - + } - + init(channel: FlutterMethodChannel) { self.channel = channel super.init() } - + @available(*, deprecated) @objc public static func pushClicked(response: UNNotificationResponse){ } - - + + public func pushClicked(response: UNNotificationResponse){ let action = response.actionIdentifier as NSString let request = response.notification.request let userInfo = request.content.userInfo - + var link: NSString? var payload: NSString? - + if let url = userInfo["clickUrl"] as? NSString { link = url } - + if let payloadData = userInfo["payload"] as? NSString { payload = payloadData } - + if(link == nil){ let aps = userInfo["aps"] as? NSDictionary link = aps?["clickUrl"] as? NSString payload = aps?["payload"] as? NSString } - + if let buttons = userInfo["buttons"] as? NSArray { buttons.forEach{ guard @@ -66,7 +65,7 @@ public class SwiftMindboxIosPlugin: NSObject, FlutterPlugin { } channel.invokeMethod("pushClicked", arguments: [link, payload]) } - + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "getSdkVersion": @@ -175,29 +174,27 @@ public class SwiftMindboxIosPlugin: NSObject, FlutterPlugin { result(FlutterError(code: "-1", message: "error", details: "Wrong argument count or type")) return } - + guard let message = args[0] as? String, let levelIndex = args[1] as? Int else { result(FlutterError(code: "-1", message: "error", details: "Wrong argument type")) return } - let logLevel: LogLevel - + + // `LogLevel` lives in MindboxLogger, which isn't exposed as a product + // in ios-sdk's Package.swift — `import MindboxLogger` fails in SPM mode. + // Seed `level` from the logger's getter so the type is inferred without + // referencing `LogLevel` explicitly. + var level = Mindbox.logger.logLevel switch levelIndex { - case 0: - logLevel = .debug - case 1: - logLevel = .info - case 2: - logLevel = .default - case 3: - logLevel = .error - case 4: - logLevel = .fault - default: - logLevel = .none + case 0: level = .debug + case 1: level = .info + case 2: level = .default + case 3: level = .error + case 4: level = .fault + default: level = .none } - Mindbox.logger.log(level: logLevel, message: message) + Mindbox.logger.log(level: level, message: message) result(0) default: @@ -206,18 +203,18 @@ public class SwiftMindboxIosPlugin: NSObject, FlutterPlugin { } } -extension SwiftMindboxIosPlugin: UNUserNotificationCenterDelegate { +extension MindboxIosPlugin: UNUserNotificationCenterDelegate { public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { completionHandler() pushClicked(response: response) } } -extension SwiftMindboxIosPlugin: InAppMessagesDelegate { +extension MindboxIosPlugin: InAppMessagesDelegate { public func inAppMessageTapAction(id: String, url: URL?, payload: String) { channel.invokeMethod("onInAppClick", arguments: [id, url?.absoluteString ?? "", payload]) } - + public func inAppMessageDismissed(id: String) { channel.invokeMethod("onInAppDismissed", arguments: id) } diff --git a/mindbox_ios/ios/Classes/inappCallbacks/Callbacks.swift b/mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/inappCallbacks/Callbacks.swift similarity index 100% rename from mindbox_ios/ios/Classes/inappCallbacks/Callbacks.swift rename to mindbox_ios/ios/mindbox_ios/Sources/mindbox_ios/inappCallbacks/Callbacks.swift From 64fbdddd59abaedc74e32880cf0d5f156bf0abce Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Thu, 28 May 2026 15:13:03 +0300 Subject: [PATCH 02/10] MOBILE-146: Widen Dart SDK upper bound to <4.0.0 across packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the artificial Dart 2 compat-mode constraint ('<3.0.0') on all four packages — mindbox, mindbox_ios, mindbox_android, mindbox_platform_interface. Lower bound (>=2.12.0) is unchanged, so this is hygiene, not a consumer-visible breaking change. Motivated by the SDK ecosystem catching up to Dart 3; clients on modern Flutter no longer need a 'dependency_overrides' shim to satisfy the constraint. --- mindbox/pubspec.yaml | 2 +- mindbox_android/pubspec.yaml | 2 +- mindbox_ios/pubspec.yaml | 2 +- mindbox_platform_interface/pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mindbox/pubspec.yaml b/mindbox/pubspec.yaml index 1975261..cb5ac16 100644 --- a/mindbox/pubspec.yaml +++ b/mindbox/pubspec.yaml @@ -6,7 +6,7 @@ repository: https://github.com/mindbox-cloud/flutter-sdk/tree/master/mindbox documentation: https://developers.mindbox.ru/docs/flutter-sdk-integration environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.12.0 <4.0.0" flutter: ">=2.0.0" flutter: diff --git a/mindbox_android/pubspec.yaml b/mindbox_android/pubspec.yaml index 4632a0b..6283506 100644 --- a/mindbox_android/pubspec.yaml +++ b/mindbox_android/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://mindbox.cloud/ repository: https://github.com/mindbox-cloud/flutter-sdk/tree/master/mindbox_android environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.12.0 <4.0.0" flutter: ">=2.0.0" flutter: diff --git a/mindbox_ios/pubspec.yaml b/mindbox_ios/pubspec.yaml index e49c476..2a6541e 100644 --- a/mindbox_ios/pubspec.yaml +++ b/mindbox_ios/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://mindbox.cloud/ repository: https://github.com/mindbox-cloud/flutter-sdk/tree/master/mindbox_ios environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.12.0 <4.0.0" flutter: ">=2.0.0" flutter: diff --git a/mindbox_platform_interface/pubspec.yaml b/mindbox_platform_interface/pubspec.yaml index dfd4b1f..5e6d711 100644 --- a/mindbox_platform_interface/pubspec.yaml +++ b/mindbox_platform_interface/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://mindbox.cloud/ repository: https://github.com/mindbox-cloud/flutter-sdk/tree/master/mindbox_platform_interface environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.12.0 <4.0.0" flutter: ">=2.0.0" dependencies: From 4e1feec2bc9597aa85ef333fb84a90b8e1f0ed21 Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 15:54:47 +0300 Subject: [PATCH 03/10] MOBILE-146: Wire example notification extensions via SPM Integrate MindboxNotifications into the example's notification extensions through Swift Package Manager instead of CocoaPods, so the example builds the SDK entirely via SPM in SPM mode. - Add the mindbox-cloud/ios-sdk package at the Xcode project level and link its products to the extension targets: MindboxNotificationsService -> MindboxNotificationServiceExtension MindboxNotificationsContent -> MindboxNotificationContentExtension Mindbox itself is NOT linked to Runner (left as "None"): the main app gets it transitively via FlutterGeneratedPluginSwiftPackage -> mindbox_ios. SPM unifies this project-level ios-sdk with the one the plugin pulls into the same package identity, so the whole app resolves to a single ios-sdk version (verified: Package.resolved lists ios-sdk once at 2.15.1). - Use an "up to next major" rule (>= 2.15.1, < 3.0.0) for that package so it auto-aligns with whatever exact version the plugin pins, surviving 2.x releases without manual pbxproj edits. A conflicting/too-narrow rule would fail resolution loudly rather than drift silently. - Drop the CocoaPods extension blocks (pod 'MindboxNotifications') from the Podfile; extensions no longer use CocoaPods. The Podfile stays only for the Runner target, since shared_preference_app_group and permission_handler_apple have no SPM support yet. - Drop the duplicate top-level pod 'Mindbox' from Runner (it double-loaded the Mindbox framework and mismatched versions, crashing inside MBDatabaseRepository on first launch). Pin platform :ios, '13.0' so CocoaPods stops auto-assigning 15.0. Hard-set flutter.config.enable-swift-package-manager: true so the example always exercises the SPM path. .gitignore picks up dev-only artifacts (pubspec_overrides.yaml, ios/.spm.pods/, **/xcshareddata/swiftpm/). pubspec.lock regenerated from the Dart SDK bound bump. Verified on Flutter 3.44, iPhone 17 Pro simulator: clean build with no Mindbox pods, NSE/NCE compile against MindboxNotifications via SPM, app launches and the SDK initializes. --- example/flutter_example/.gitignore | 16 ++- example/flutter_example/ios/Podfile | 24 ++-- example/flutter_example/ios/Podfile.lock | 28 +++++ .../ios/Runner.xcodeproj/project.pbxproj | 118 ++++++------------ .../xcshareddata/swiftpm/Package.resolved | 14 +++ .../xcshareddata/swiftpm/Package.resolved | 14 +++ example/flutter_example/pubspec.lock | 86 ++++++------- example/flutter_example/pubspec.yaml | 6 + 8 files changed, 165 insertions(+), 141 deletions(-) create mode 100644 example/flutter_example/ios/Podfile.lock create mode 100644 example/flutter_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 example/flutter_example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/example/flutter_example/.gitignore b/example/flutter_example/.gitignore index 0506d31..ee7c8dd 100644 --- a/example/flutter_example/.gitignore +++ b/example/flutter_example/.gitignore @@ -33,6 +33,19 @@ migrate_working_dir/ .pub/ /build/ +# Local pub overrides (dev-only, wires example to local packages) +pubspec_overrides.yaml + +# cocoapods-spm plugin scratch (not used by this project, left over locally if +# the global gem was previously installed) +ios/.spm.pods/ + +# Xcode/Flutter SwiftPM workspace dir. Ignore the per-machine scratch +# (configuration/) but COMMIT Package.resolved — this is an app, so its SPM +# lockfile is checked in for reproducible native-SDK resolution. +**/xcshareddata/swiftpm/* +!**/xcshareddata/swiftpm/Package.resolved + # Symbolication related app.*.symbols @@ -47,9 +60,8 @@ app.*.map.json /android/app/google-services.json /android/app/agconnect-services.json -# iOS +# iOS — Podfile.lock is committed (this is an app) for reproducible pod versions. /ios/Pods/ -/ios/Podfile.lock # FVM Version Cache .fvm/ \ No newline at end of file diff --git a/example/flutter_example/ios/Podfile b/example/flutter_example/ios/Podfile index 0370271..317e3fe 100644 --- a/example/flutter_example/ios/Podfile +++ b/example/flutter_example/ios/Podfile @@ -1,5 +1,4 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '13.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -30,8 +29,10 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! use_modular_headers! -# add this pod if doesn't use MindboxFlutterAppDelegate - pod 'Mindbox' + # Mindbox / MindboxNotifications are pulled transitively by the mindbox_ios + # plugin (Package.swift in SPM mode, podspec in CocoaPods mode). Declaring + # `pod 'Mindbox'` here on top of that produces a duplicate framework load + # and a version mismatch — leave it out. flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) # target 'RunnerTests' do # inherit! :search_paths @@ -40,15 +41,12 @@ target 'Runner' do end -target 'MindboxNotificationServiceExtension' do - use_frameworks! - pod 'MindboxNotifications' -end - -target 'MindboxNotificationContentExtension' do - use_frameworks! - pod 'MindboxNotifications' -end +# Notification extensions are integrated via Swift Package Manager, not CocoaPods: +# the mindbox-cloud/ios-sdk package is added at the Xcode project level and its +# MindboxNotificationsService / MindboxNotificationsContent products are linked +# directly onto the NSE / NCE targets (Frameworks build phase). SPM unifies that +# with the same ios-sdk that mindbox_ios pulls transitively, so the whole app +# resolves to a single ios-sdk version. No `pod 'MindboxNotifications'` needed. post_install do |installer| installer.pods_project.targets.each do |target| diff --git a/example/flutter_example/ios/Podfile.lock b/example/flutter_example/ios/Podfile.lock new file mode 100644 index 0000000..b1b602e --- /dev/null +++ b/example/flutter_example/ios/Podfile.lock @@ -0,0 +1,28 @@ +PODS: + - Flutter (1.0.0) + - permission_handler_apple (9.3.0): + - Flutter + - shared_preference_app_group (1.0.0): + - Flutter + +DEPENDENCIES: + - Flutter (from `Flutter`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - shared_preference_app_group (from `.symlinks/plugins/shared_preference_app_group/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + shared_preference_app_group: + :path: ".symlinks/plugins/shared_preference_app_group/ios" + +SPEC CHECKSUMS: + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d + shared_preference_app_group: 7422922a188e05cf680a656e18e2786dcb5c58b3 + +PODFILE CHECKSUM: b71826982cccf6a703045b0d0963c829f0a6cf8f + +COCOAPODS: 1.16.2 diff --git a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj index 6a0d24c..64a705e 100644 --- a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,16 @@ objects = { /* Begin PBXBuildFile section */ - 0C6AACD917BD622C687DAB65 /* Pods_MindboxNotificationServiceExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4AC547651623FA3602973E87 /* Pods_MindboxNotificationServiceExtension.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3A04C4242C18A6EA008FB1C3 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A04C41C2C183779008FB1C3 /* Models.swift */; }; 3AFCC3DC2C6A0B4000F047AB /* AppDelegateUsedMindboxDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AFCC3DB2C6A0B4000F047AB /* AppDelegateUsedMindboxDelegate.swift */; }; 3AFCC3E02C6A0B4000F047AB /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AFCC3DF2C6A0B4000F047AB /* SceneDelegate.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 47445E052FCDAE7D004449EC /* MindboxNotificationsContent in Frameworks */ = {isa = PBXBuildFile; productRef = 47445E042FCDAE7D004449EC /* MindboxNotificationsContent */; }; + 47445E072FCDAE7D004449EC /* MindboxNotificationsService in Frameworks */ = {isa = PBXBuildFile; productRef = 47445E062FCDAE7D004449EC /* MindboxNotificationsService */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 8B81E312DFA9C6FD4EDFB0F6 /* Pods_MindboxNotificationContentExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 201DB479D6282529C705748E /* Pods_MindboxNotificationContentExtension.framework */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -26,7 +27,6 @@ E1B395592BD985350090F3D2 /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B395582BD985350090F3D2 /* NotificationViewController.swift */; }; E1B395602BD985350090F3D2 /* MindboxNotificationContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = E1B395522BD985350090F3D2 /* MindboxNotificationContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; FDACF0FD3A7597BBE1F0C9BD /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E84BF714550B188D12C0B51 /* Pods_Runner.framework */; }; - 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -82,7 +82,6 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 1E84BF714550B188D12C0B51 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 201DB479D6282529C705748E /* Pods_MindboxNotificationContentExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MindboxNotificationContentExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3A04C41C2C183779008FB1C3 /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; @@ -90,16 +89,13 @@ 3AFCC3DB2C6A0B4000F047AB /* AppDelegateUsedMindboxDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegateUsedMindboxDelegate.swift; sourceTree = ""; }; 3AFCC3DF2C6A0B4000F047AB /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4AC547651623FA3602973E87 /* Pods_MindboxNotificationServiceExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MindboxNotificationServiceExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4C419D08BE184EB1CC17FC7F /* Pods-MindboxNotificationContentExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MindboxNotificationContentExtension.release.xcconfig"; path = "Target Support Files/Pods-MindboxNotificationContentExtension/Pods-MindboxNotificationContentExtension.release.xcconfig"; sourceTree = ""; }; 5ACBB9DBF94B5EB31B45DDF6 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 629927C00EA2133BFB755C80 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 66FD4F7514C7280086A9D4DE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6A77F4ECA7B3C83491917FD2 /* Pods-MindboxNotificationServiceExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MindboxNotificationServiceExtension.profile.xcconfig"; path = "Target Support Files/Pods-MindboxNotificationServiceExtension/Pods-MindboxNotificationServiceExtension.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9308C6307F8A90C56C003FD0 /* Pods-MindboxNotificationContentExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MindboxNotificationContentExtension.debug.xcconfig"; path = "Target Support Files/Pods-MindboxNotificationContentExtension/Pods-MindboxNotificationContentExtension.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -107,8 +103,6 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B2D711D6B1C18A53FB9ED866 /* Pods-MindboxNotificationServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MindboxNotificationServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-MindboxNotificationServiceExtension/Pods-MindboxNotificationServiceExtension.release.xcconfig"; sourceTree = ""; }; - BE3FEFAD32E64B2C5F57EACB /* Pods-MindboxNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MindboxNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-MindboxNotificationServiceExtension/Pods-MindboxNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; E19AAF922BD7F53B002D7897 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; E19AAFB92BD93664002D7897 /* MindboxNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = MindboxNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; E19AAFBB2BD93664002D7897 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; @@ -120,8 +114,6 @@ E1B395582BD985350090F3D2 /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = ""; }; E1B3955D2BD985350090F3D2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E1B395652BD985560090F3D2 /* MindboxNotificationContentExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MindboxNotificationContentExtension.entitlements; sourceTree = ""; }; - EE5FB2A6B1C9CC1DF5D97EF8 /* Pods-MindboxNotificationContentExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MindboxNotificationContentExtension.profile.xcconfig"; path = "Target Support Files/Pods-MindboxNotificationContentExtension/Pods-MindboxNotificationContentExtension.profile.xcconfig"; sourceTree = ""; }; - 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -145,7 +137,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0C6AACD917BD622C687DAB65 /* Pods_MindboxNotificationServiceExtension.framework in Frameworks */, + 47445E072FCDAE7D004449EC /* MindboxNotificationsService in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -154,8 +146,8 @@ buildActionMask = 2147483647; files = ( E1B395562BD985350090F3D2 /* UserNotificationsUI.framework in Frameworks */, + 47445E052FCDAE7D004449EC /* MindboxNotificationsContent in Frameworks */, E1B395542BD985350090F3D2 /* UserNotifications.framework in Frameworks */, - 8B81E312DFA9C6FD4EDFB0F6 /* Pods_MindboxNotificationContentExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -168,8 +160,6 @@ 3A04C4202C18A4E0008FB1C3 /* Mindbox.framework */, E1B395532BD985350090F3D2 /* UserNotifications.framework */, E1B395552BD985350090F3D2 /* UserNotificationsUI.framework */, - 201DB479D6282529C705748E /* Pods_MindboxNotificationContentExtension.framework */, - 4AC547651623FA3602973E87 /* Pods_MindboxNotificationServiceExtension.framework */, 1E84BF714550B188D12C0B51 /* Pods_Runner.framework */, ); name = Frameworks; @@ -186,12 +176,6 @@ 3C5E0DD50222A55004474656 /* Pods */ = { isa = PBXGroup; children = ( - 9308C6307F8A90C56C003FD0 /* Pods-MindboxNotificationContentExtension.debug.xcconfig */, - 4C419D08BE184EB1CC17FC7F /* Pods-MindboxNotificationContentExtension.release.xcconfig */, - EE5FB2A6B1C9CC1DF5D97EF8 /* Pods-MindboxNotificationContentExtension.profile.xcconfig */, - BE3FEFAD32E64B2C5F57EACB /* Pods-MindboxNotificationServiceExtension.debug.xcconfig */, - B2D711D6B1C18A53FB9ED866 /* Pods-MindboxNotificationServiceExtension.release.xcconfig */, - 6A77F4ECA7B3C83491917FD2 /* Pods-MindboxNotificationServiceExtension.profile.xcconfig */, 629927C00EA2133BFB755C80 /* Pods-Runner.debug.xcconfig */, 5ACBB9DBF94B5EB31B45DDF6 /* Pods-Runner.release.xcconfig */, 66FD4F7514C7280086A9D4DE /* Pods-Runner.profile.xcconfig */, @@ -297,9 +281,6 @@ productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { - packageProductDependencies = ( - 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, - ); isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -321,6 +302,9 @@ E1B3955F2BD985350090F3D2 /* PBXTargetDependency */, ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -329,7 +313,6 @@ isa = PBXNativeTarget; buildConfigurationList = E19AAFC12BD93664002D7897 /* Build configuration list for PBXNativeTarget "MindboxNotificationServiceExtension" */; buildPhases = ( - 9207252F6686FE6DD1EBF525 /* [CP] Check Pods Manifest.lock */, E19AAFB52BD93664002D7897 /* Sources */, E19AAFB62BD93664002D7897 /* Frameworks */, E19AAFB72BD93664002D7897 /* Resources */, @@ -347,7 +330,6 @@ isa = PBXNativeTarget; buildConfigurationList = E1B395642BD985360090F3D2 /* Build configuration list for PBXNativeTarget "MindboxNotificationContentExtension" */; buildPhases = ( - B5F7D46B07A2E305AB82C8EA /* [CP] Check Pods Manifest.lock */, E1B3954E2BD985350090F3D2 /* Sources */, E1B3954F2BD985350090F3D2 /* Frameworks */, E1B395502BD985350090F3D2 /* Resources */, @@ -365,9 +347,6 @@ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { - packageReferences = ( - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, - ); isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; @@ -400,6 +379,10 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */, + ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; @@ -486,28 +469,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9207252F6686FE6DD1EBF525 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-MindboxNotificationServiceExtension-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -540,28 +501,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - B5F7D46B07A2E305AB82C8EA /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-MindboxNotificationContentExtension-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; C5E781EA6DBDA6504FEE2E88 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -946,7 +885,6 @@ }; E19AAFC22BD93664002D7897 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BE3FEFAD32E64B2C5F57EACB /* Pods-MindboxNotificationServiceExtension.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1002,7 +940,6 @@ }; E19AAFC32BD93664002D7897 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B2D711D6B1C18A53FB9ED866 /* Pods-MindboxNotificationServiceExtension.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1056,7 +993,6 @@ }; E19AAFC42BD93664002D7897 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6A77F4ECA7B3C83491917FD2 /* Pods-MindboxNotificationServiceExtension.profile.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1103,7 +1039,6 @@ }; E1B395612BD985360090F3D2 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9308C6307F8A90C56C003FD0 /* Pods-MindboxNotificationContentExtension.debug.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -1146,7 +1081,6 @@ }; E1B395622BD985360090F3D2 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4C419D08BE184EB1CC17FC7F /* Pods-MindboxNotificationContentExtension.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -1186,7 +1120,6 @@ }; E1B395632BD985360090F3D2 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EE5FB2A6B1C9CC1DF5D97EF8 /* Pods-MindboxNotificationContentExtension.profile.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -1278,13 +1211,36 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + /* Begin XCLocalSwiftPackageReference section */ - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { isa = XCLocalSwiftPackageReference; relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; }; /* End XCLocalSwiftPackageReference section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/mindbox-cloud/ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.15.1; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + /* Begin XCSwiftPackageProductDependency section */ + 47445E042FCDAE7D004449EC /* MindboxNotificationsContent */ = { + isa = XCSwiftPackageProductDependency; + package = 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */; + productName = MindboxNotificationsContent; + }; + 47445E062FCDAE7D004449EC /* MindboxNotificationsService */ = { + isa = XCSwiftPackageProductDependency; + package = 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */; + productName = MindboxNotificationsService; + }; 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { isa = XCSwiftPackageProductDependency; productName = FlutterGeneratedPluginSwiftPackage; diff --git a/example/flutter_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/example/flutter_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..2d69bca --- /dev/null +++ b/example/flutter_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mindbox-cloud/ios-sdk", + "state" : { + "revision" : "062e54b831e14c70ab2a7e7f3049626c776e47c7", + "version" : "2.15.1" + } + } + ], + "version" : 2 +} diff --git a/example/flutter_example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/example/flutter_example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..2d69bca --- /dev/null +++ b/example/flutter_example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mindbox-cloud/ios-sdk", + "state" : { + "revision" : "062e54b831e14c70ab2a7e7f3049626c776e47c7", + "version" : "2.15.1" + } + } + ], + "version" : 2 +} diff --git a/example/flutter_example/pubspec.lock b/example/flutter_example/pubspec.lock index afd9d52..55aac1d 100644 --- a/example/flutter_example/pubspec.lock +++ b/example/flutter_example/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" clock: dependency: transitive description: @@ -53,10 +53,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -100,26 +100,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -132,58 +132,54 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.18.0" mindbox: dependency: "direct main" description: - name: mindbox - sha256: "65c61362fc1fe3580944656d9444692e2d935fd53a2cb23e25436eb8f895081a" - url: "https://pub.dev" - source: hosted - version: "2.11.0" + path: "../../mindbox" + relative: true + source: path + version: "2.15.2" mindbox_android: - dependency: transitive + dependency: "direct overridden" description: - name: mindbox_android - sha256: "1a9c2e6c7635c7a8fb852ee594bce27767ab5358299eb7b9f5a1def03cd24a59" - url: "https://pub.dev" - source: hosted - version: "2.11.0" + path: "../../mindbox_android" + relative: true + source: path + version: "2.15.2" mindbox_ios: - dependency: transitive + dependency: "direct overridden" description: - name: mindbox_ios - sha256: "124f66019abf979ecde73a57261925bfa8745d31fe7ab0177979dfe872723534" - url: "https://pub.dev" - source: hosted - version: "2.11.0" + path: "../../mindbox_ios" + relative: true + source: path + version: "2.15.2" mindbox_platform_interface: - dependency: transitive + dependency: "direct overridden" description: - name: mindbox_platform_interface - sha256: "48ddddca92e605f4fa75dbee1671cabb5f7b61e8506fb0ffe337ff942184c6e1" - url: "https://pub.dev" - source: hosted - version: "2.11.0" + path: "../../mindbox_platform_interface" + relative: true + source: path + version: "2.15.2" path: dependency: transitive description: @@ -393,10 +389,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.11" url_launcher: dependency: "direct main" description: @@ -465,10 +461,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -494,5 +490,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.7.0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.10.0-0 <4.0.0" + flutter: ">=3.41.0" diff --git a/example/flutter_example/pubspec.yaml b/example/flutter_example/pubspec.yaml index 5283f64..419e657 100644 --- a/example/flutter_example/pubspec.yaml +++ b/example/flutter_example/pubspec.yaml @@ -29,3 +29,9 @@ dev_dependencies: flutter: uses-material-design: true + # Per-project override of the global `flutter config` flag. Forced to true + # so the example always exercises the SPM path the plugin now ships, + # regardless of the consumer's global flutter config. Flip to false locally + # to test the CocoaPods-only path. + config: + enable-swift-package-manager: true From dc4962748bba921f231c98b751aeeeecc557670c Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 15:54:47 +0300 Subject: [PATCH 04/10] MOBILE-146: Sync Package.swift ios-sdk pin in release scripts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The native iOS SDK version prompted by the release tooling now also bumps the 'exact:' pin in mindbox_ios/ios/mindbox_ios/Package.swift, alongside the existing podspec bump. Without this hook a release would ship a podspec on the new native SDK but an SPM manifest still pinned to the previous one. Two release entry points exist and both are updated in lockstep: - git-release-branch.sh — local interactive bash script (BSD sed). - .github/workflows/manual-prepare_release_branch.yml — the actual CI-driven release prep (GNU sed on Ubuntu, runs under 'set -euo pipefail'). The substitution is addressed by the 'mindbox-cloud/ios-sdk' URL so unrelated 'exact:' pins (if more SPM dependencies are added later) stay untouched. Verified with both BSD and GNU sed against normal X.Y.Z, X.Y.Z-rc, multi-digit versions, repeated runs (idempotent), and a synthetic Package.swift with a second unrelated 'exact:' pin. --- .../manual-prepare_release_branch.yml | 14 +++++++++++++- git-release-branch.sh | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/.github/workflows/manual-prepare_release_branch.yml b/.github/workflows/manual-prepare_release_branch.yml index 9994bb0..7666e4d 100644 --- a/.github/workflows/manual-prepare_release_branch.yml +++ b/.github/workflows/manual-prepare_release_branch.yml @@ -158,6 +158,9 @@ jobs: sed -i "s/cloud.mindbox:mobile-sdk:.*/cloud.mindbox:mobile-sdk:$AND_VER'/" mindbox_android/android/build.gradle echo " After:" && grep "cloud.mindbox:mobile-sdk" mindbox_android/android/build.gradle || true + # Fail the release if a version substitution didn't land (stale pin). + assert_pin() { grep -qE "$2" "$1" || { echo "ERROR: pattern /$2/ not found in $1 — substitution failed"; exit 1; }; } + echo "→ Bumping iOS native SDK in podspec" echo " Before s.version:" && grep -E "s\.version" mindbox_ios/ios/mindbox_ios.podspec || true sed -i -E "s/(s\.version *= *')[^']+(')/\1$IO_VER\2/" mindbox_ios/ios/mindbox_ios.podspec @@ -166,10 +169,18 @@ jobs: echo " Before Mindbox dependency:" && grep "s.dependency 'Mindbox'," mindbox_ios/ios/mindbox_ios.podspec || true sed -i -E "s/(s\.dependency 'Mindbox', *')[^']+(')/\1$IO_VER\2/" mindbox_ios/ios/mindbox_ios.podspec echo " After Mindbox dependency:" && grep "s.dependency 'Mindbox'," mindbox_ios/ios/mindbox_ios.podspec || true + assert_pin mindbox_ios/ios/mindbox_ios.podspec "s\.dependency 'Mindbox', *'$IO_VER'" echo " Before Notifications dep:" && grep "MindboxNotifications" mindbox_ios/ios/mindbox_ios.podspec || true sed -i -E "s/(s\.dependency 'MindboxNotifications', *')[^']+(')/\1$IO_VER\2/" mindbox_ios/ios/mindbox_ios.podspec echo " After Notifications dep:" && grep "MindboxNotifications" mindbox_ios/ios/mindbox_ios.podspec || true + assert_pin mindbox_ios/ios/mindbox_ios.podspec "s\.dependency 'MindboxNotifications', *'$IO_VER'" + + echo "→ Bumping ios-sdk exact pin in SPM manifest" + echo " Before:" && grep "mindbox-cloud/ios-sdk" mindbox_ios/ios/mindbox_ios/Package.swift || true + sed -i "/mindbox-cloud\/ios-sdk/ s/exact: \"[^\"]*\"/exact: \"$IO_VER\"/" mindbox_ios/ios/mindbox_ios/Package.swift + echo " After:" && grep "mindbox-cloud/ios-sdk" mindbox_ios/ios/mindbox_ios/Package.swift || true + assert_pin mindbox_ios/ios/mindbox_ios/Package.swift "exact: *\"$IO_VER\"" echo "→ Now inspect pubspec.yaml versions:" echo " mindbox/pubspec.yaml:" && grep "^version\|mindbox_" mindbox/pubspec.yaml || true @@ -207,7 +218,8 @@ jobs: mindbox_ios/pubspec.yaml \ mindbox_platform_interface/pubspec.yaml \ mindbox_android/android/build.gradle \ - mindbox_ios/ios/mindbox_ios.podspec + mindbox_ios/ios/mindbox_ios.podspec \ + mindbox_ios/ios/mindbox_ios/Package.swift git commit -m "Bump SDK versions: Flutter=$VERSION, Android=$AND_VER, iOS=$IO_VER" echo "release_branch=$REL" >> $GITHUB_OUTPUT diff --git a/git-release-branch.sh b/git-release-branch.sh index 33df650..20f186a 100755 --- a/git-release-branch.sh +++ b/git-release-branch.sh @@ -72,14 +72,31 @@ sed -i '' "s/ api 'cloud.mindbox:mobile-sdk:.*/ api 'cloud.mindbox:mobile- echo "Bump $android_gradle to $android_sdk_version" +# Fail loudly if a version substitution didn't land (e.g. the line format +# changed and sed silently matched nothing, leaving a stale pin). +assert_pin() { # + grep -qE "$2" "$1" || { echo "ERROR: pattern /$2/ not found in $1 — version substitution failed"; exit 1; } +} + ios_podspec="mindbox_ios/ios/mindbox_ios.podspec" sed -i '' "s/ s.version = .*/ s.version = '$ios_sdk_version'/" $ios_podspec sed -i '' "s/ s.dependency 'Mindbox', .*/ s.dependency 'Mindbox', '$ios_sdk_version'/" $ios_podspec sed -i '' "s/ s.dependency 'MindboxNotifications', .*/ s.dependency 'MindboxNotifications', '$ios_sdk_version'/" $ios_podspec +assert_pin "$ios_podspec" "s\.dependency 'Mindbox', *'$ios_sdk_version'" +assert_pin "$ios_podspec" "s\.dependency 'MindboxNotifications', *'$ios_sdk_version'" echo "Bump $ios_podspec to $ios_sdk_version" +# Same pin in the SPM manifest. Address (/mindbox-cloud\/ios-sdk/) limits the +# substitution to the line that references the native SDK package, so unrelated +# `exact:` pins stay untouched if more dependencies are added later. +ios_package_swift="mindbox_ios/ios/mindbox_ios/Package.swift" +sed -i '' "/mindbox-cloud\/ios-sdk/ s/exact: \"[^\"]*\"/exact: \"$ios_sdk_version\"/" $ios_package_swift +assert_pin "$ios_package_swift" "exact: *\"$ios_sdk_version\"" + +echo "Bump $ios_package_swift to $ios_sdk_version" + mindbox_ios_changelog="mindbox_ios/CHANGELOG.md" mindbox_android_changelog="mindbox_android/CHANGELOG.md" mindbox_changelog="mindbox/CHANGELOG.md" @@ -95,6 +112,7 @@ echo -e "${changelog}${changelog_android}\n${changelog_ios}\n\n$(cat $mindbox_pl echo -e "${changelog}${changelog_android}\n${changelog_ios}\n\n$(cat $mindbox_changelog)" > $mindbox_changelog git add $ios_podspec +git add $ios_package_swift git add $android_gradle git add $mindbox_ios_changelog git add $mindbox_android_changelog From 6157c9fd9ae56c7c89d4301c6c9a07b4bf771c13 Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 18:03:01 +0300 Subject: [PATCH 05/10] MOBILE-146: Add SPM migration guide for iOS integrators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flutter's SPM docs don't cover the Mindbox-specific steps: wiring the notification extensions to the ios-sdk products in Xcode, and removing the CocoaPods Mindbox pods (Runner's `pod 'Mindbox'` and the extensions' `pod 'MindboxNotifications'`) so the SDK isn't loaded by both pod and SPM — which duplicates the framework and crashes at runtime. SPM_MIGRATION.md documents this (mirroring UISCENE_MIGRATION.md) and is linked from the README; the CocoaPods path is unchanged. --- README.md | 7 +++ SPM_MIGRATION.md | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 SPM_MIGRATION.md diff --git a/README.md b/README.md index fb4556d..7a5ec96 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,13 @@ flow don't need any code changes. [flutter-uiscene]: https://docs.flutter.dev/release/breaking-changes/uiscenedelegate +### iOS Swift Package Manager + +The plugin supports Swift Package Manager alongside CocoaPods. In SPM mode the +main app gets Mindbox automatically; notification extensions need a one-time +Xcode wiring step. See [SPM_MIGRATION.md](SPM_MIGRATION.md). CocoaPods users +need no changes. + ## Troubleshooting Refer to the [Example of integration(IOS)](https://github.com/mindbox-cloud/flutter-sdk/tree/develop/mindbox_ios/example) or [Example of integration(Android)](https://github.com/mindbox-cloud/flutter-sdk/tree/develop/mindbox_android/example) in case of any issues. diff --git a/SPM_MIGRATION.md b/SPM_MIGRATION.md new file mode 100644 index 0000000..adcc4f4 --- /dev/null +++ b/SPM_MIGRATION.md @@ -0,0 +1,114 @@ +# Using the Mindbox Flutter SDK with Swift Package Manager + +The plugin supports SPM alongside CocoaPods. Flutter's SPM is opt-in (off by +default as of 3.44); the [official Flutter guide][flutter-spm-app] covers the +Flutter-side setup. This document covers only the Mindbox-specific glue. + +On CocoaPods **nothing changes** — see [CocoaPods](#cocoapods) at the bottom. + +## Prerequisites + +- **Flutter ≥ 3.29.** Verified: on 3.29 the plugin resolves as an SPM product; + on 3.24 Flutter silently falls back to CocoaPods (SPM is not engaged, the SDK + comes in via the pod). +- Enable SPM: + - **Flutter ≥ 3.35** — globally with + `flutter config --enable-swift-package-manager`, or per project in + `pubspec.yaml`: + ```yaml + flutter: + config: + enable-swift-package-manager: true + ``` + - **Flutter 3.29–3.34** — use the global flag only. The per-project `config:` + block is not recognized yet and makes `flutter pub get` fail with + `Unexpected child "config" found under "flutter"`. + +## Main app — nothing to do + +The `Runner` target gets `Mindbox` transitively through the plugin; `flutter +run` / `flutter build ios` resolve and link it for you. + +If your `Podfile` declares `pod 'Mindbox'` on the `Runner` target, **remove it** +— Mindbox would then load via both CocoaPods and SPM. See +[Remove the Mindbox pods](#remove-the-mindbox-pods). + +## Notification extensions — one manual step + +An extension is a native target, so its dependencies come from your Xcode +project, not from Flutter. Wire them once in Xcode: + +1. **Runner** project → **Package Dependencies** → **+**. +2. URL: `https://github.com/mindbox-cloud/ios-sdk` +3. **Dependency Rule → Up to Next Major Version**, starting at the SDK version + you use (e.g. `2.15.1`). Use a range, not "Exact" — see [Versions](#versions). +4. **Add Package**, then in **Choose Package Products**: + + | Product | Add to target | + |---|---| + | `Mindbox` | **None** (Runner already gets it via the plugin) | + | `MindboxNotificationsService` | Notification **Service** Extension | + | `MindboxNotificationsContent` | Notification **Content** Extension | + +Then remove the extensions' CocoaPods integration — see +[Remove the Mindbox pods](#remove-the-mindbox-pods) below. + +## Remove the Mindbox pods + +Once the main app gets `Mindbox` via the plugin and the extensions are wired to +the SPM products, remove **every** Mindbox-family pod from the `Podfile` — the +`Runner` target's `pod 'Mindbox'` and each extension's +`pod 'MindboxNotifications'`: + +```ruby +# DELETE — these are provided by SPM now +pod 'Mindbox' # in the Runner target +pod 'MindboxNotifications' # in each notification-extension target +``` + +Loading the same native SDK through both CocoaPods and SPM links it twice; at +runtime you get duplicate Swift classes and a Core Data crash +(`Fatal error: ... Expected CDEvent but found CDEvent`). Keep every non-Mindbox +pod, then re-run `pod install` (or just `flutter run`). + +No `flutter clean` or `pod deintegrate` is needed: Flutter re-adds the SPM +integration on the next build and `pod install` drops the now-unused pods. + +If **all** your plugins support SPM (not just Mindbox), you can drop CocoaPods +entirely instead of keeping the hybrid setup — delete the `Podfile` and run +`pod deintegrate`. See the reference example below. + +## Versions + +SPM identifies a package by URL, so the project-level `ios-sdk` and the one the +plugin pulls in are the same package, resolved to a single version. The plugin +pins an exact version; your "Up to Next Major" range only has to include it. +Don't pin the project to a different "Exact" version — SPM fails the build with +a clear conflict error instead of shipping two versions. + +## Unchanged + +- Your `AppDelegate`, `Mindbox.shared.*` calls, push handling, in-app callbacks. +- `UISceneDelegate` migration ([UISCENE_MIGRATION.md](UISCENE_MIGRATION.md)) is + orthogonal to SPM. +- The Objective-C `MindboxFlutterAppDelegateObjc` base class is + **CocoaPods-only** and deprecated; SPM consumers use the Swift + `MindboxFlutterAppDelegate` or call `Mindbox.shared.*` from their own + AppDelegate. + +## Reference + +[`example/flutter_example`](https://github.com/mindbox-cloud/flutter-sdk/tree/develop/example/flutter_example) +is configured for **pure SPM**: both extensions wired as above and no CocoaPods +at all — every plugin it uses ships SPM, so the `Podfile` was removed +(`pod deintegrate`). A real app keeps CocoaPods only if it still depends on +plugins that don't support SPM yet. + +## CocoaPods + +If SPM is off (the default), nothing changes: the main app gets the pods via +the plugin's podspec, and your extension targets declare +`pod 'MindboxNotifications'` in the `Podfile` as before. No code or project +changes are needed to update the SDK. + +[flutter-spm-app]: https://docs.flutter.dev/packages-and-plugins/swift-package-manager/for-app-developers From b4baace61b35aefb8ab77fb5a6d21b401afb4130 Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:03:21 +0300 Subject: [PATCH 06/10] MOBILE-146: Drop CocoaPods from example, bump deps to latest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit permission_handler 12 and shared_preference_app_group 2 now ship Swift Package Manager support, so every iOS plugin in the example resolves via SPM — CocoaPods is no longer needed. Deintegrated it: removed the Podfile, the Pods xcconfig includes, the Pods workspace reference, the empty Pods group, the now-dead Pods framework/header search paths on the notification extensions, and an orphan Mindbox.framework reference. Runner.xcworkspace stays (Flutter needs it to manage SPM integration; it errors 'Xcode workspace not found' without it) but now references only Runner.xcodeproj. Bump the remaining direct deps to latest (permission_handler ^12, shared_preference_app_group ^2, flutter_lints ^6) and align the extensions' marketing version with the app (1.0.0) to clear the parent/extension version-match warning. Verified pod-free build and run on the simulator: SDK init, permission grant, and in-app all work. --- example/flutter_example/.gitignore | 7 -- .../ios/Flutter/Debug.xcconfig | 1 - .../ios/Flutter/Release.xcconfig | 1 - example/flutter_example/ios/Podfile | 70 ----------- example/flutter_example/ios/Podfile.lock | 28 ----- .../ios/Runner.xcodeproj/project.pbxproj | 119 +----------------- .../contents.xcworkspacedata | 3 - example/flutter_example/pubspec.lock | 90 ++++++------- example/flutter_example/pubspec.yaml | 6 +- 9 files changed, 54 insertions(+), 271 deletions(-) delete mode 100644 example/flutter_example/ios/Podfile delete mode 100644 example/flutter_example/ios/Podfile.lock diff --git a/example/flutter_example/.gitignore b/example/flutter_example/.gitignore index ee7c8dd..52c7fde 100644 --- a/example/flutter_example/.gitignore +++ b/example/flutter_example/.gitignore @@ -36,10 +36,6 @@ migrate_working_dir/ # Local pub overrides (dev-only, wires example to local packages) pubspec_overrides.yaml -# cocoapods-spm plugin scratch (not used by this project, left over locally if -# the global gem was previously installed) -ios/.spm.pods/ - # Xcode/Flutter SwiftPM workspace dir. Ignore the per-machine scratch # (configuration/) but COMMIT Package.resolved — this is an app, so its SPM # lockfile is checked in for reproducible native-SDK resolution. @@ -60,8 +56,5 @@ app.*.map.json /android/app/google-services.json /android/app/agconnect-services.json -# iOS — Podfile.lock is committed (this is an app) for reproducible pod versions. -/ios/Pods/ - # FVM Version Cache .fvm/ \ No newline at end of file diff --git a/example/flutter_example/ios/Flutter/Debug.xcconfig b/example/flutter_example/ios/Flutter/Debug.xcconfig index ec97fc6..592ceee 100644 --- a/example/flutter_example/ios/Flutter/Debug.xcconfig +++ b/example/flutter_example/ios/Flutter/Debug.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/example/flutter_example/ios/Flutter/Release.xcconfig b/example/flutter_example/ios/Flutter/Release.xcconfig index c4855bf..592ceee 100644 --- a/example/flutter_example/ios/Flutter/Release.xcconfig +++ b/example/flutter_example/ios/Flutter/Release.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/example/flutter_example/ios/Podfile b/example/flutter_example/ios/Podfile deleted file mode 100644 index 317e3fe..0000000 --- a/example/flutter_example/ios/Podfile +++ /dev/null @@ -1,70 +0,0 @@ -platform :ios, '13.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - # Mindbox / MindboxNotifications are pulled transitively by the mindbox_ios - # plugin (Package.swift in SPM mode, podspec in CocoaPods mode). Declaring - # `pod 'Mindbox'` here on top of that produces a duplicate framework load - # and a version mismatch — leave it out. - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -# target 'RunnerTests' do -# inherit! :search_paths -# end - -end - - -# Notification extensions are integrated via Swift Package Manager, not CocoaPods: -# the mindbox-cloud/ios-sdk package is added at the Xcode project level and its -# MindboxNotificationsService / MindboxNotificationsContent products are linked -# directly onto the NSE / NCE targets (Frameworks build phase). SPM unifies that -# with the same ios-sdk that mindbox_ios pulls transitively, so the whole app -# resolves to a single ios-sdk version. No `pod 'MindboxNotifications'` needed. - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - - target.build_configurations.each do |config| - # You can remove unused permissions here - # for more information: https://github.com/BaseflowIT/flutter-permission-handler/blob/master/permission_handler/ios/Classes/PermissionHandlerEnums.h - # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - '$(inherited)', - - ## dart: PermissionGroup.notification - 'PERMISSION_NOTIFICATIONS=1', - ] - end - end -end - - - diff --git a/example/flutter_example/ios/Podfile.lock b/example/flutter_example/ios/Podfile.lock deleted file mode 100644 index b1b602e..0000000 --- a/example/flutter_example/ios/Podfile.lock +++ /dev/null @@ -1,28 +0,0 @@ -PODS: - - Flutter (1.0.0) - - permission_handler_apple (9.3.0): - - Flutter - - shared_preference_app_group (1.0.0): - - Flutter - -DEPENDENCIES: - - Flutter (from `Flutter`) - - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - - shared_preference_app_group (from `.symlinks/plugins/shared_preference_app_group/ios`) - -EXTERNAL SOURCES: - Flutter: - :path: Flutter - permission_handler_apple: - :path: ".symlinks/plugins/permission_handler_apple/ios" - shared_preference_app_group: - :path: ".symlinks/plugins/shared_preference_app_group/ios" - -SPEC CHECKSUMS: - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d - shared_preference_app_group: 7422922a188e05cf680a656e18e2786dcb5c58b3 - -PODFILE CHECKSUM: b71826982cccf6a703045b0d0963c829f0a6cf8f - -COCOAPODS: 1.16.2 diff --git a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj index 64a705e..e996372 100644 --- a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj @@ -26,7 +26,6 @@ E1B395562BD985350090F3D2 /* UserNotificationsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E1B395552BD985350090F3D2 /* UserNotificationsUI.framework */; }; E1B395592BD985350090F3D2 /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B395582BD985350090F3D2 /* NotificationViewController.swift */; }; E1B395602BD985350090F3D2 /* MindboxNotificationContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = E1B395522BD985350090F3D2 /* MindboxNotificationContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - FDACF0FD3A7597BBE1F0C9BD /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E84BF714550B188D12C0B51 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -81,17 +80,12 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1E84BF714550B188D12C0B51 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3A04C41C2C183779008FB1C3 /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; - 3A04C4202C18A4E0008FB1C3 /* Mindbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Mindbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3AFCC3DB2C6A0B4000F047AB /* AppDelegateUsedMindboxDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegateUsedMindboxDelegate.swift; sourceTree = ""; }; 3AFCC3DF2C6A0B4000F047AB /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5ACBB9DBF94B5EB31B45DDF6 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 629927C00EA2133BFB755C80 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 66FD4F7514C7280086A9D4DE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; @@ -129,7 +123,6 @@ buildActionMask = 2147483647; files = ( 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, - FDACF0FD3A7597BBE1F0C9BD /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -157,10 +150,8 @@ 151A896A3BE0584441AE7BE7 /* Frameworks */ = { isa = PBXGroup; children = ( - 3A04C4202C18A4E0008FB1C3 /* Mindbox.framework */, E1B395532BD985350090F3D2 /* UserNotifications.framework */, E1B395552BD985350090F3D2 /* UserNotificationsUI.framework */, - 1E84BF714550B188D12C0B51 /* Pods_Runner.framework */, ); name = Frameworks; sourceTree = ""; @@ -173,16 +164,6 @@ path = RunnerTests; sourceTree = ""; }; - 3C5E0DD50222A55004474656 /* Pods */ = { - isa = PBXGroup; - children = ( - 629927C00EA2133BFB755C80 /* Pods-Runner.debug.xcconfig */, - 5ACBB9DBF94B5EB31B45DDF6 /* Pods-Runner.release.xcconfig */, - 66FD4F7514C7280086A9D4DE /* Pods-Runner.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -204,7 +185,6 @@ E1B395572BD985350090F3D2 /* MindboxNotificationContentExtension */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 3C5E0DD50222A55004474656 /* Pods */, 151A896A3BE0584441AE7BE7 /* Frameworks */, ); sourceTree = ""; @@ -284,7 +264,6 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 7A49514126B217A17B87F98E /* [CP] Check Pods Manifest.lock */, E19AAF9F2BD92C73002D7897 /* Embed Foundation Extensions */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, @@ -292,8 +271,6 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2750317145405479AAE1033 /* [CP] Embed Pods Frameworks */, - C5E781EA6DBDA6504FEE2E88 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -447,28 +424,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 7A49514126B217A17B87F98E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -484,40 +439,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - A2750317145405479AAE1033 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - C5E781EA6DBDA6504FEE2E88 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -899,19 +820,8 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 622436AMYX; ENABLE_USER_SCRIPT_SANDBOXING = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxLogger\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxNotifications\"", - ); GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxLogger/MindboxLogger.framework/Headers\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxNotifications/MindboxNotifications.framework/Headers\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxLogger/Mindbox.framework/Headers\"", - ); INFOPLIST_FILE = MindboxNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = MindboxNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; @@ -922,7 +832,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = mindbox.Flutter.Example.ServiceExtension; @@ -954,20 +864,8 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 622436AMYX; ENABLE_USER_SCRIPT_SANDBOXING = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxLogger\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxNotifications\"", - ); GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxLogger/MindboxLogger.framework/Headers\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxNotifications/MindboxNotifications.framework/Headers\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/Mindbox/Mindbox.framework/Headers\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxLogger/Mindbox.framework/Headers\"", - ); INFOPLIST_FILE = MindboxNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = MindboxNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; @@ -978,7 +876,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = mindbox.Flutter.Example.ServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1007,11 +905,6 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 622436AMYX; ENABLE_USER_SCRIPT_SANDBOXING = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxLogger\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/MindboxNotifications\"", - ); GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = MindboxNotificationServiceExtension/Info.plist; @@ -1024,7 +917,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = mindbox.Flutter.Example.ServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1064,7 +957,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = mindbox.Flutter.Example.ContentExtension; @@ -1106,7 +999,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = mindbox.Flutter.Example.ContentExtension; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1145,7 +1038,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = mindbox.Flutter.Example.ContentExtension; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/example/flutter_example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/flutter_example/ios/Runner.xcworkspace/contents.xcworkspacedata index 21a3cc1..1d526a1 100644 --- a/example/flutter_example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/example/flutter_example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,7 +4,4 @@ - - diff --git a/example/flutter_example/pubspec.lock b/example/flutter_example/pubspec.lock index 55aac1d..67e956f 100644 --- a/example/flutter_example/pubspec.lock +++ b/example/flutter_example/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.1" boolean_selector: dependency: transitive description: @@ -45,10 +45,10 @@ packages: dependency: "direct main" description: name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.9" fake_async: dependency: transitive description: @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" file: dependency: transitive description: @@ -82,10 +82,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "6.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -124,10 +124,10 @@ packages: dependency: transitive description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "6.1.0" matcher: dependency: transitive description: @@ -216,26 +216,26 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "12.0.3" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" url: "https://pub.dev" source: hosted - version: "12.1.0" + version: "13.0.1" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + sha256: e20daf680eef1ca62ffe8c8c526b778cc386d50137c77ac71c8ec9c88c13fb9d url: "https://pub.dev" source: hosted - version: "9.4.6" + version: "9.4.9" permission_handler_html: dependency: transitive description: @@ -280,34 +280,34 @@ packages: dependency: "direct main" description: name: shared_preference_app_group - sha256: "478ad76d03397a930a964d3b0e64f9d4fca816c83c1c059542032eafeb29b607" + sha256: "6e8aa2b22e05e6317340a5225899f36b23d09ea47efc95da615919492fff8512" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "2.1.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a" + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.5" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "3ec7210872c4ba945e3244982918e502fa2bfb5230dff6832459ca0e1879b7ad" + sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 url: "https://pub.dev" source: hosted - version: "2.4.8" + version: "2.4.23" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: @@ -320,10 +320,10 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" shared_preferences_web: dependency: transitive description: @@ -349,10 +349,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.2" stack_trace: dependency: transitive description: @@ -397,42 +397,42 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "1d0eae19bd7606ef60fe69ef3b312a437a16549476c42321d5dc1506c9ca3bf4" + sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" url: "https://pub.dev" source: hosted - version: "6.3.15" + version: "6.3.30" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.4.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: @@ -445,18 +445,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" vector_math: dependency: transitive description: @@ -469,10 +469,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.2.0" web: dependency: transitive description: @@ -490,5 +490,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.10.0-0 <4.0.0" + dart: ">=3.11.0 <4.0.0" flutter: ">=3.41.0" diff --git a/example/flutter_example/pubspec.yaml b/example/flutter_example/pubspec.yaml index 419e657..5b3c73d 100644 --- a/example/flutter_example/pubspec.yaml +++ b/example/flutter_example/pubspec.yaml @@ -17,15 +17,15 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.6 mindbox: ^2.13.0 #https://developers.mindbox.ru/docs/add-sdk-flutter - permission_handler: ^11.3.1 + permission_handler: ^12.0.3 url_launcher: ^6.2.6 shared_preferences: ^2.5.2 - shared_preference_app_group: ^1.1.1 + shared_preference_app_group: ^2.1.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^3.0.0 + flutter_lints: ^6.0.0 flutter: uses-material-design: true From 902fffa2640afe04b6f103c89d2d48bd77c71997 Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:54:10 +0300 Subject: [PATCH 07/10] MOBILE-146: Re-wire example ios-sdk SPM with complete product deps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The example's notification-extension targets referenced MindboxNotificationsService/Content only through their Frameworks build phase — the targets' packageProductDependencies arrays were missing (a known Xcode SPM wiring bug; see ios-app SPM-NOTES). Re-adding the ios-sdk package wires each product into both the build phase and the target's packageProductDependencies, so the structure is complete and Xcode manages add/remove correctly. Pin (Up to Next Major 2.15.1), Mindbox=None on Runner, and product→target mapping are unchanged. objectVersion bumped 54→60 to match the toolchain. Verified: pod-free build + in-app on the simulator. --- .../ios/Runner.xcodeproj/project.pbxproj | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj index e996372..a5037b5 100644 --- a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj @@ -3,18 +3,18 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 60; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 256F9F9FDB3D4DD436246818 /* MindboxNotificationsContent in Frameworks */ = {isa = PBXBuildFile; productRef = 0EA7F2BCC87452E0C5E83025 /* MindboxNotificationsContent */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 34D4D0D0DA45AF8FE0E2E2F5 /* MindboxNotificationsService in Frameworks */ = {isa = PBXBuildFile; productRef = 52D6F1212F70CD404ED943FA /* MindboxNotificationsService */; }; 3A04C4242C18A6EA008FB1C3 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A04C41C2C183779008FB1C3 /* Models.swift */; }; 3AFCC3DC2C6A0B4000F047AB /* AppDelegateUsedMindboxDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AFCC3DB2C6A0B4000F047AB /* AppDelegateUsedMindboxDelegate.swift */; }; 3AFCC3E02C6A0B4000F047AB /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AFCC3DF2C6A0B4000F047AB /* SceneDelegate.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 47445E052FCDAE7D004449EC /* MindboxNotificationsContent in Frameworks */ = {isa = PBXBuildFile; productRef = 47445E042FCDAE7D004449EC /* MindboxNotificationsContent */; }; - 47445E072FCDAE7D004449EC /* MindboxNotificationsService in Frameworks */ = {isa = PBXBuildFile; productRef = 47445E062FCDAE7D004449EC /* MindboxNotificationsService */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -130,7 +130,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 47445E072FCDAE7D004449EC /* MindboxNotificationsService in Frameworks */, + 34D4D0D0DA45AF8FE0E2E2F5 /* MindboxNotificationsService in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -139,8 +139,8 @@ buildActionMask = 2147483647; files = ( E1B395562BD985350090F3D2 /* UserNotificationsUI.framework in Frameworks */, - 47445E052FCDAE7D004449EC /* MindboxNotificationsContent in Frameworks */, E1B395542BD985350090F3D2 /* UserNotifications.framework in Frameworks */, + 256F9F9FDB3D4DD436246818 /* MindboxNotificationsContent in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -299,6 +299,9 @@ dependencies = ( ); name = MindboxNotificationServiceExtension; + packageProductDependencies = ( + 52D6F1212F70CD404ED943FA /* MindboxNotificationsService */, + ); productName = MindboxNotificationServiceExtension; productReference = E19AAFB92BD93664002D7897 /* MindboxNotificationServiceExtension.appex */; productType = "com.apple.product-type.app-extension"; @@ -316,6 +319,9 @@ dependencies = ( ); name = MindboxNotificationContentExtension; + packageProductDependencies = ( + 0EA7F2BCC87452E0C5E83025 /* MindboxNotificationsContent */, + ); productName = MindboxNotificationContentExtension; productReference = E1B395522BD985350090F3D2 /* MindboxNotificationContentExtension.appex */; productType = "com.apple.product-type.app-extension"; @@ -357,8 +363,8 @@ ); mainGroup = 97C146E51CF9000F007C117D; packageReferences = ( - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, - 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */, + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + C4A124B3CCD84B28F602BCFA /* XCRemoteSwiftPackageReference "ios-sdk" */, ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; @@ -1106,14 +1112,14 @@ /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { isa = XCLocalSwiftPackageReference; relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; }; /* End XCLocalSwiftPackageReference section */ /* Begin XCRemoteSwiftPackageReference section */ - 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */ = { + C4A124B3CCD84B28F602BCFA /* XCRemoteSwiftPackageReference "ios-sdk" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/mindbox-cloud/ios-sdk"; requirement = { @@ -1124,14 +1130,14 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 47445E042FCDAE7D004449EC /* MindboxNotificationsContent */ = { + 0EA7F2BCC87452E0C5E83025 /* MindboxNotificationsContent */ = { isa = XCSwiftPackageProductDependency; - package = 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */; + package = C4A124B3CCD84B28F602BCFA /* XCRemoteSwiftPackageReference "ios-sdk" */; productName = MindboxNotificationsContent; }; - 47445E062FCDAE7D004449EC /* MindboxNotificationsService */ = { + 52D6F1212F70CD404ED943FA /* MindboxNotificationsService */ = { isa = XCSwiftPackageProductDependency; - package = 47445E032FCDAE7D004449EC /* XCRemoteSwiftPackageReference "ios-sdk" */; + package = C4A124B3CCD84B28F602BCFA /* XCRemoteSwiftPackageReference "ios-sdk" */; productName = MindboxNotificationsService; }; 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { From 14827a5f87c691f883c9402448015cea752349b0 Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:12:57 +0300 Subject: [PATCH 08/10] MOBILE-146: Adopt Xcode recommended project settings for example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removed the obsolete ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES (the Swift runtime ships with iOS 13+), enabled String Catalog symbol generation, bumped LastUpgradeCheck. Kept CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER off at the project level — enabling it floods unfixable warnings from Flutter.framework's own quoted-include headers. Verified: clean build + in-app on the simulator. --- .../ios/Runner.xcodeproj/project.pbxproj | 11 +++++++---- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj index a5037b5..ec184c6 100644 --- a/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/flutter_example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 60; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -548,6 +548,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -570,6 +571,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -580,7 +582,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; @@ -672,6 +673,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -701,6 +703,7 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -729,6 +732,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -751,6 +755,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; @@ -763,7 +768,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; @@ -789,7 +793,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; diff --git a/example/flutter_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/flutter_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 25000c4..988fbfa 100644 --- a/example/flutter_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/flutter_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,7 +1,7 @@ + version = "1.7"> From 4b3548d8168a56e2acf7846654b8e8d23f432c48 Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:20:33 +0300 Subject: [PATCH 09/10] MOBILE-146: Fix example analyze under flutter_lints 6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit flutter_lints 6 enables strict_top_level_inference, which flags the example's static ViewModel methods that have no explicit return type — failing `flutter analyze` in CI. Add void return types to the eight methods. No behavior change. --- .../lib/view_model/view_model.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/example/flutter_example/lib/view_model/view_model.dart b/example/flutter_example/lib/view_model/view_model.dart index 980db72..eaa2cc0 100644 --- a/example/flutter_example/lib/view_model/view_model.dart +++ b/example/flutter_example/lib/view_model/view_model.dart @@ -3,7 +3,7 @@ import 'package:permission_handler/permission_handler.dart'; class ViewModel { //https://developers.mindbox.ru/docs/%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-flutter-sdk - static syncOperation() { + static void syncOperation() { Mindbox.instance.executeSyncOperation( operationSystemName: 'APIMethodForReleaseExampleIos', operationBody: { @@ -18,7 +18,7 @@ class ViewModel { ); } - static asyncOperation() { + static void asyncOperation() { Mindbox.instance.executeAsyncOperation( operationSystemName: "APIMethodForReleaseExampleIos", operationBody: { @@ -31,31 +31,31 @@ class ViewModel { } //used for send action "notification center was opened" - static asyncOperationNCOpen() { + static void asyncOperationNCOpen() { Mindbox.instance.executeAsyncOperation( operationSystemName: "mobileapp.NCOpen", operationBody: {}); } //used for send action "click on push from notification center" - static asyncOperationNCPushOpen(String pushName, String pushDate) { + static void asyncOperationNCPushOpen(String pushName, String pushDate) { Mindbox.instance.executeAsyncOperation( operationSystemName: "mobileapp.NCPushOpen", operationBody: getPushOpenOperationBody(pushName, pushDate)); } - static getSDKVersion(Function complition) { + static void getSDKVersion(Function complition) { Mindbox.instance.nativeSdkVersion.then((value) { complition(value); }); } - static getToken(Function complition) { + static void getToken(Function complition) { Mindbox.instance.getToken((value) { complition(value); }); } - static getDeviceUUID(Function complition) { + static void getDeviceUUID(Function complition) { Mindbox.instance.getDeviceUUID((value) { print(value); complition(value); @@ -72,7 +72,7 @@ class ViewModel { } //https://developers.mindbox.ru/docs/in-app - static chooseInAppCallback(ChooseInappCallback chooseInappCallback) { + static void chooseInAppCallback(ChooseInappCallback chooseInappCallback) { switch (chooseInappCallback) { case ChooseInappCallback.defaultInAppCallback: break; From 15aa4179fa2099cb2b7076617d78304d768a6862 Mon Sep 17 00:00:00 2001 From: Sergei Semko <28645140+justSmK@users.noreply.github.com> Date: Mon, 1 Jun 2026 23:43:11 +0300 Subject: [PATCH 10/10] MOBILE-146: Type example ViewModel callbacks, fix complition typo Address PR #199 review: replace the untyped 'Function complition' parameter with 'void Function(String) completion' in getSDKVersion/getToken/getDeviceUUID so callers get proper type checking, and fix the typo. flutter analyze clean. --- .../flutter_example/lib/view_model/view_model.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/example/flutter_example/lib/view_model/view_model.dart b/example/flutter_example/lib/view_model/view_model.dart index eaa2cc0..2407a02 100644 --- a/example/flutter_example/lib/view_model/view_model.dart +++ b/example/flutter_example/lib/view_model/view_model.dart @@ -43,22 +43,22 @@ class ViewModel { operationBody: getPushOpenOperationBody(pushName, pushDate)); } - static void getSDKVersion(Function complition) { + static void getSDKVersion(void Function(String) completion) { Mindbox.instance.nativeSdkVersion.then((value) { - complition(value); + completion(value); }); } - static void getToken(Function complition) { + static void getToken(void Function(String) completion) { Mindbox.instance.getToken((value) { - complition(value); + completion(value); }); } - static void getDeviceUUID(Function complition) { + static void getDeviceUUID(void Function(String) completion) { Mindbox.instance.getDeviceUUID((value) { print(value); - complition(value); + completion(value); }); }