From d2ebec9220719b28bc31226ac2684841a5c6c415 Mon Sep 17 00:00:00 2001 From: Raja Jain Date: Fri, 18 Nov 2022 14:33:01 +0530 Subject: [PATCH 1/3] added segment-moengage integration --- android/build.gradle | 3 + .../FlutterSegmentOptions.java | 30 +++-- .../flutter_segment/FlutterSegmentPlugin.java | 111 +++++++++--------- .../ios/Flutter/flutter_export_environment.sh | 13 ++ example/pubspec.lock | 33 ++---- ios/Classes/FlutterSegmentPlugin.m | 9 ++ ios/flutter_segment.podspec | 5 +- lib/src/segment_config.dart | 3 + pubspec.lock | 51 ++++---- 9 files changed, 145 insertions(+), 113 deletions(-) create mode 100755 example/ios/Flutter/flutter_export_environment.sh diff --git a/android/build.gradle b/android/build.gradle index 17947028..3695e9bf 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -37,6 +37,9 @@ android { implementation 'com.segment.analytics.android:analytics:4.10.4' implementation 'com.segment.analytics.android.integrations:amplitude:3.1.0' implementation 'com.appsflyer:segment-android-integration:6.5.2' + implementation ("com.moengage:moengage-segment-integration:5.5.01") { + transitive = true + } } } diff --git a/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java b/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java index 2c0975d9..1abdaebf 100644 --- a/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java +++ b/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java @@ -11,17 +11,18 @@ public class FlutterSegmentOptions { private final Boolean appsflyerIntegrationEnabled; private final Boolean debug; - public FlutterSegmentOptions( + public FlutterSegmentOptions( String writeKey, Boolean trackApplicationLifecycleEvents, Boolean amplitudeIntegrationEnabled, Boolean appsflyerIntegrationEnabled, - Boolean debug - ) { + Boolean moengageIntegrationEnabled, + Boolean debug) { this.writeKey = writeKey; this.trackApplicationLifecycleEvents = trackApplicationLifecycleEvents; this.amplitudeIntegrationEnabled = amplitudeIntegrationEnabled; this.appsflyerIntegrationEnabled = appsflyerIntegrationEnabled; + this.moengageIntegrationEnabled = moengageIntegrationEnabled; this.debug = debug; } @@ -41,17 +42,28 @@ public Boolean isAppsflyerIntegrationEnabled() { return appsflyerIntegrationEnabled; } + public Boolean isMoengageIntegrationEnabled() { + return moengageIntegrationEnabled; + } + public Boolean getDebug() { return debug; } static FlutterSegmentOptions create(Bundle bundle) { String writeKey = bundle.getString("com.claimsforce.segment.WRITE_KEY"); - Boolean trackApplicationLifecycleEvents = bundle.getBoolean("com.claimsforce.segment.TRACK_APPLICATION_LIFECYCLE_EVENTS"); - Boolean isAmplitudeIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_AMPLITUDE_INTEGRATION", false); - Boolean isAppsflyerIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_APPSFLYER_INTEGRATION", false); + Boolean trackApplicationLifecycleEvents = bundle + .getBoolean("com.claimsforce.segment.TRACK_APPLICATION_LIFECYCLE_EVENTS"); + Boolean isAmplitudeIntegrationEnabled = bundle + .getBoolean("com.claimsforce.segment.ENABLE_AMPLITUDE_INTEGRATION", false); + Boolean isAppsflyerIntegrationEnabled = bundle + .getBoolean("com.claimsforce.segment.ENABLE_APPSFLYER_INTEGRATION", false); + Boolean isMoengageIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_MOENGAGE_INTEGRATION", + false); Boolean debug = bundle.getBoolean("com.claimsforce.segment.DEBUG", false); - return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, isAppsflyerIntegrationEnabled, debug); + + return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, + isAppsflyerIntegrationEnabled, isMoengageIntegrationEnabled, debug); } static FlutterSegmentOptions create(HashMap options) { @@ -59,8 +71,10 @@ static FlutterSegmentOptions create(HashMap options) { Boolean trackApplicationLifecycleEvents = (Boolean) options.get("trackApplicationLifecycleEvents"); Boolean isAmplitudeIntegrationEnabled = orFalse((Boolean) options.get("amplitudeIntegrationEnabled")); Boolean isAppsflyerIntegrationEnabled = orFalse((Boolean) options.get("appsflyerIntegrationEnabled")); + Boolean isMoengageIntegrationEnabled = orFalse((Boolean) options.get("moengageIntegrationEnabled")); Boolean debug = orFalse((Boolean) options.get("debug")); - return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, isAppsflyerIntegrationEnabled, debug); + return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, + isAppsflyerIntegrationEnabled, isMoengageIntegrationEnabled, debug); } private static Boolean orFalse(Boolean value) { diff --git a/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java b/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java index 40b92236..387d7f44 100644 --- a/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java +++ b/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java @@ -14,6 +14,7 @@ import com.segment.analytics.integrations.BasePayload; import com.segment.analytics.android.integrations.amplitude.AmplitudeIntegration; import com.segment.analytics.android.integrations.appsflyer.AppsflyerIntegration; +import com.segment.analytics.android.integrations.moengage.MoEngageIntegration; import static com.segment.analytics.Analytics.LogLevel; import androidx.annotation.NonNull; @@ -51,7 +52,7 @@ private void setupChannels(Context applicationContext, BinaryMessenger messenger try { ApplicationInfo ai = applicationContext.getPackageManager() - .getApplicationInfo(applicationContext.getPackageName(), PackageManager.GET_META_DATA); + .getApplicationInfo(applicationContext.getPackageName(), PackageManager.GET_META_DATA); Bundle bundle = ai.metaData; @@ -84,42 +85,45 @@ private void setupChannels(FlutterSegmentOptions options) { if (options.isAppsflyerIntegrationEnabled()) { analyticsBuilder.use(AppsflyerIntegration.FACTORY); } + if (options.isMoengageIntegrationEnabled()) { + analyticsBuilder.use(MoEngageIntegration.FACTORY); + } // Here we build a middleware that just appends data to the current context // using the [deepMerge] strategy. analyticsBuilder.useSourceMiddleware( - new Middleware() { - @Override - public void intercept(Chain chain) { - try { - if (appendToContextMiddleware == null) { - chain.proceed(chain.payload()); - return; - } - - BasePayload payload = chain.payload(); - Map originalContext = new LinkedHashMap<>(payload.context()); - Map mergedContext = FlutterSegmentPlugin.deepMerge( - originalContext, - appendToContextMiddleware - ); - - BasePayload newPayload = payload.toBuilder() - .context(mergedContext) - .build(); - - chain.proceed(newPayload); - } catch (Exception e) { - Log.e("FlutterSegment", e.getMessage()); - chain.proceed(chain.payload()); - } + new Middleware() { + @Override + public void intercept(Chain chain) { + try { + if (appendToContextMiddleware == null) { + chain.proceed(chain.payload()); + return; } + + BasePayload payload = chain.payload(); + Map originalContext = new LinkedHashMap<>(payload.context()); + Map mergedContext = FlutterSegmentPlugin.deepMerge( + originalContext, + appendToContextMiddleware); + + BasePayload newPayload = payload.toBuilder() + .context(mergedContext) + .build(); + + chain.proceed(newPayload); + } catch (Exception e) { + Log.e("FlutterSegment", e.getMessage()); + chain.proceed(chain.payload()); } - ); + } + }); // Set the initialized instance as globally accessible. - // It may throw an exception if we are trying to re-register a singleton Analytics instance. - // This state may happen after the app is popped (back button until the app closes) + // It may throw an exception if we are trying to re-register a singleton + // Analytics instance. + // This state may happen after the app is popped (back button until the app + // closes) // and opened again from the TaskManager. try { Analytics.setSingletonInstance(analyticsBuilder.build()); @@ -205,14 +209,13 @@ private void identify(MethodCall call, Result result) { } private void callIdentify( - String userId, - HashMap traitsData, - HashMap optionsData - ) { + String userId, + HashMap traitsData, + HashMap optionsData) { Traits traits = new Traits(); Options options = this.buildOptions(optionsData); - for(Map.Entry trait : traitsData.entrySet()) { + for (Map.Entry trait : traitsData.entrySet()) { String key = trait.getKey(); Object value = trait.getValue(); traits.putValue(key, value); @@ -234,10 +237,9 @@ private void track(MethodCall call, Result result) { } private void callTrack( - String eventName, - HashMap propertiesData, - HashMap optionsData - ) { + String eventName, + HashMap propertiesData, + HashMap optionsData) { Properties properties = propertiesMapper.buildProperties(propertiesData); Options options = this.buildOptions(optionsData); @@ -257,10 +259,9 @@ private void screen(MethodCall call, Result result) { } private void callScreen( - String screenName, - HashMap propertiesData, - HashMap optionsData - ) { + String screenName, + HashMap propertiesData, + HashMap optionsData) { Properties properties = propertiesMapper.buildProperties(propertiesData); Options options = this.buildOptions(optionsData); @@ -280,14 +281,13 @@ private void group(MethodCall call, Result result) { } private void callGroup( - String groupId, - HashMap traitsData, - HashMap optionsData - ) { + String groupId, + HashMap traitsData, + HashMap optionsData) { Traits traits = new Traits(); Options options = this.buildOptions(optionsData); - for(Map.Entry trait : traitsData.entrySet()) { + for (Map.Entry trait : traitsData.entrySet()) { String key = trait.getKey(); Object value = trait.getValue(); traits.putValue(key, value); @@ -367,8 +367,10 @@ private void disable(MethodCall call, Result result) { } /** - * Enables / disables / sets custom integration properties so Segment can properly - * interact with 3rd parties, such as Amplitude. + * Enables / disables / sets custom integration properties so Segment can + * properly + * interact with 3rd parties, such as Amplitude, MoEngage. + * * @see https://segment.com/docs/connections/sources/catalog/libraries/mobile/android/#selecting-destinations * @see https://github.com/segmentio/analytics-android/blob/master/analytics/src/main/java/com/segment/analytics/Options.java */ @@ -377,16 +379,17 @@ private Options buildOptions(HashMap optionsData) { Options options = new Options(); if (optionsData != null && - optionsData.containsKey("integrations") && - (optionsData.get("integrations") instanceof HashMap)) { - for (Map.Entry integration : ((HashMap)optionsData.get("integrations")).entrySet()) { + optionsData.containsKey("integrations") && + (optionsData.get("integrations") instanceof HashMap)) { + for (Map.Entry integration : ((HashMap) optionsData.get("integrations")) + .entrySet()) { String key = integration.getKey(); if (integration.getValue() instanceof HashMap) { - HashMap values = ((HashMap)integration.getValue()); + HashMap values = ((HashMap) integration.getValue()); options.setIntegrationOptions(key, values); } else if (integration.getValue() instanceof Boolean) { - Boolean value = ((Boolean)integration.getValue()); + Boolean value = ((Boolean) integration.getValue()); options.setIntegration(key, value); } } diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 00000000..3db45bd6 --- /dev/null +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/rajajain/development/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/rajajain/work/flutter-segment/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=0.0.1" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/example/pubspec.lock b/example/pubspec.lock index 282fc08c..43b17b24 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" boolean_selector: dependency: transitive description: @@ -21,21 +21,14 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.2.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -56,7 +49,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -68,7 +61,7 @@ packages: path: ".." relative: true source: path - version: "3.7.0" + version: "3.12.1" flutter_test: dependency: "direct dev" description: flutter @@ -92,28 +85,28 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" sky_engine: dependency: transitive description: flutter @@ -125,7 +118,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -146,21 +139,21 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" vector_math: dependency: transitive description: diff --git a/ios/Classes/FlutterSegmentPlugin.m b/ios/Classes/FlutterSegmentPlugin.m index f3be03b0..7df9e09f 100644 --- a/ios/Classes/FlutterSegmentPlugin.m +++ b/ios/Classes/FlutterSegmentPlugin.m @@ -4,6 +4,7 @@ #import #import #import +#import @implementation FlutterSegmentPlugin // Contents to be appended to the context @@ -353,6 +354,7 @@ + (SEGAnalyticsConfiguration*)createConfigFromFile { NSString *writeKey = [dict objectForKey: @"com.claimsforce.segment.WRITE_KEY"]; BOOL trackApplicationLifecycleEvents = [[dict objectForKey: @"com.claimsforce.segment.TRACK_APPLICATION_LIFECYCLE_EVENTS"] boolValue]; BOOL isAmplitudeIntegrationEnabled = [[dict objectForKey: @"com.claimsforce.segment.ENABLE_AMPLITUDE_INTEGRATION"] boolValue]; + BOOL isMoengageIntegrationEnabled = [[dict objectForKey: @"com.claimsforce.segment.ENABLE_MOENGAGE_INTEGRATION"] boolValue]; if(!writeKey) { return nil; } @@ -362,6 +364,9 @@ + (SEGAnalyticsConfiguration*)createConfigFromFile { if (isAmplitudeIntegrationEnabled) { [configuration use:[SEGAmplitudeIntegrationFactory instance]]; } + if (isMoengageIntegrationEnabled) { + [configuration use:[SEGMoEngageIntegrationFactory instance]]; + } return configuration; } @@ -371,6 +376,7 @@ + (SEGAnalyticsConfiguration*)createConfigFromDict:(NSDictionary*) dict { BOOL trackApplicationLifecycleEvents = [[dict objectForKey: @"trackApplicationLifecycleEvents"] boolValue]; BOOL isAmplitudeIntegrationEnabled = [[dict objectForKey: @"amplitudeIntegrationEnabled"] boolValue]; BOOL isAppsflyerIntegrationEnabled = [[dict objectForKey: @"appsflyerIntegrationEnabled"] boolValue]; + BOOL isMoengageIntegrationEnabled = [[dict objectForKey: @"moengageIntegrationEnabled"] boolValue]; SEGAnalyticsConfiguration *configuration = [SEGAnalyticsConfiguration configurationWithWriteKey:writeKey]; configuration.trackApplicationLifecycleEvents = trackApplicationLifecycleEvents; @@ -381,6 +387,9 @@ + (SEGAnalyticsConfiguration*)createConfigFromDict:(NSDictionary*) dict { if (isAppsflyerIntegrationEnabled) { [configuration use:[SEGAppsFlyerIntegrationFactory instance]]; } + if (isMoengageIntegrationEnabled) { + [configuration use:[SEGMoEngageIntegrationFactory instance]]; + } return configuration; } diff --git a/ios/flutter_segment.podspec b/ios/flutter_segment.podspec index cfa64ede..c063cd1c 100644 --- a/ios/flutter_segment.podspec +++ b/ios/flutter_segment.podspec @@ -20,10 +20,11 @@ Library to let Flutter apps use Segment.io s.dependency 'Analytics', '4.1.6' s.dependency 'Segment-Amplitude', '3.3.2' s.dependency 'segment-appsflyer-ios', '6.8.0' + s.dependency 'Segment-MoEngage', '6.1.0' s.ios.deployment_target = '11.0' - # Added because Segment-Amplitude dependencies on iOS cause this error: - # [!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries: (Segment-Amplitude) + # Added because Segment-Amplitude and Segment-MoEngage dependencies on iOS cause this error: + # [!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries: (Segment-Amplitude, Segment-MoEngage) s.static_framework = true end diff --git a/lib/src/segment_config.dart b/lib/src/segment_config.dart index 6dbdd660..75aa11c8 100644 --- a/lib/src/segment_config.dart +++ b/lib/src/segment_config.dart @@ -4,6 +4,7 @@ class SegmentConfig { this.trackApplicationLifecycleEvents = false, this.amplitudeIntegrationEnabled = false, this.appsflyerIntegrationEnabled = false, + this.moengageIntegrationEnabled = false, this.debug = false, }); @@ -11,6 +12,7 @@ class SegmentConfig { final bool trackApplicationLifecycleEvents; final bool amplitudeIntegrationEnabled; final bool appsflyerIntegrationEnabled; + final bool moengageIntegrationEnabled; final bool debug; Map toMap() { @@ -19,6 +21,7 @@ class SegmentConfig { 'trackApplicationLifecycleEvents': trackApplicationLifecycleEvents, 'amplitudeIntegrationEnabled': amplitudeIntegrationEnabled, 'appsflyerIntegrationEnabled': appsflyerIntegrationEnabled, + 'moengageIntegrationEnabled': moengageIntegrationEnabled, 'debug': debug, }; } diff --git a/pubspec.lock b/pubspec.lock index 2b1c3562..d79544cb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" boolean_selector: dependency: transitive description: @@ -21,35 +21,28 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.2.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -71,7 +64,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lint: dependency: "direct dev" description: @@ -85,21 +78,28 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" meta: dependency: "direct main" description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" sky_engine: dependency: transitive description: flutter @@ -111,7 +111,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -132,35 +132,28 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.12" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=1.12.13+hotfix.4" From d6281745c0cd6ae1ee5ecae1fa3de77979d06fcb Mon Sep 17 00:00:00 2001 From: Raja Jain Date: Fri, 18 Nov 2022 16:56:15 +0530 Subject: [PATCH 2/3] modified package version --- ios/flutter_segment.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/flutter_segment.podspec b/ios/flutter_segment.podspec index c063cd1c..8c803c8e 100644 --- a/ios/flutter_segment.podspec +++ b/ios/flutter_segment.podspec @@ -20,7 +20,7 @@ Library to let Flutter apps use Segment.io s.dependency 'Analytics', '4.1.6' s.dependency 'Segment-Amplitude', '3.3.2' s.dependency 'segment-appsflyer-ios', '6.8.0' - s.dependency 'Segment-MoEngage', '6.1.0' + s.dependency 'Segment-MoEngage', '8.4.0' s.ios.deployment_target = '11.0' # Added because Segment-Amplitude and Segment-MoEngage dependencies on iOS cause this error: From 47be89c60d71cd74f36109db7c4e0cc66c1e3646 Mon Sep 17 00:00:00 2001 From: Raja Jain Date: Mon, 21 Nov 2022 13:28:02 +0530 Subject: [PATCH 3/3] changed Segment-MoEngage version --- ios/flutter_segment.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/flutter_segment.podspec b/ios/flutter_segment.podspec index 8c803c8e..aa4488e4 100644 --- a/ios/flutter_segment.podspec +++ b/ios/flutter_segment.podspec @@ -20,7 +20,7 @@ Library to let Flutter apps use Segment.io s.dependency 'Analytics', '4.1.6' s.dependency 'Segment-Amplitude', '3.3.2' s.dependency 'segment-appsflyer-ios', '6.8.0' - s.dependency 'Segment-MoEngage', '8.4.0' + s.dependency 'Segment-MoEngage', '7.3.0' s.ios.deployment_target = '11.0' # Added because Segment-Amplitude and Segment-MoEngage dependencies on iOS cause this error: