diff --git a/CHANGELOG.md b/CHANGELOG.md index d9fa954..03bfef6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +### Version 4.30.0 (9th June 2022) +#### Added +- Added ability to mark your app as COPPA compliant. You can enable this setting by setting `coppaCompliantEnabled` member of `AdjustConfig` instance to `true`. +- Added ability to mark your Android app as app for the kids in accordance to Google Play Families policies. You can enable this setting by setting `playStoreKidsAppEnabled` member of `AdjustConfig` instance to `true`. +- Added `checkForNewAttStatus` method to `Adjust` API to allow iOS apps to instruct to SDK to check if `att_status` might have changed in the meantime. +- Added support for Generic ad revenue tracking. + +#### Changed +- Reverted `compileSdkVersion` from `32` to `31` (https://github.com/adjust/flutter_sdk/pull/77). +- Changed responses which is being returned when iOS specific API is being called on Android platform (https://github.com/adjust/flutter_sdk/issues/79 and https://github.com/adjust/flutter_sdk/issues/80). + +#### Native SDKs +- [iOS@v4.30.0][ios_sdk_v4.30.0] +- [Android@v4.30.1][android_sdk_v4.30.1] + +--- + ### Version 4.29.2 (18th February 2022) #### Added - Added support for `Unity` ad revenue tracking. @@ -256,6 +273,7 @@ [ios_sdk_v4.29.2]: https://github.com/adjust/ios_sdk/tree/v4.29.2 [ios_sdk_v4.29.6]: https://github.com/adjust/ios_sdk/tree/v4.29.6 [ios_sdk_v4.29.7]: https://github.com/adjust/ios_sdk/tree/v4.29.7 +[ios_sdk_v4.30.0]: https://github.com/adjust/ios_sdk/tree/v4.30.0 [android_sdk_v4.17.0]: https://github.com/adjust/android_sdk/tree/v4.17.0 [android_sdk_v4.18.0]: https://github.com/adjust/android_sdk/tree/v4.18.0 @@ -267,4 +285,4 @@ [android_sdk_v4.27.0]: https://github.com/adjust/android_sdk/tree/v4.27.0 [android_sdk_v4.28.1]: https://github.com/adjust/android_sdk/tree/v4.28.1 [android_sdk_v4.28.5]: https://github.com/adjust/android_sdk/tree/v4.28.5 -[android_sdk_v4.29.1]: https://github.com/adjust/android_sdk/tree/v4.29.1 +[android_sdk_v4.30.1]: https://github.com/adjust/android_sdk/tree/v4.30.1 diff --git a/README.md b/README.md index 8c0e22d..a15e727 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ This is the Flutter SDK of Adjust™. You can read more about Adjust™ at [adju * [AppTrackingTransparency framework](#af-att-framework) * [App-tracking authorisation wrapper](#af-ata-wrapper) * [Get current authorisation status](#af-ata-getter) + * [Check for ATT status change](#af-att-status-change) * [SKAdNetwork framework](#af-skadn-framework) * [Update SKAdNetwork conversion value](#af-skadn-update-conversion-value) * [Conversion value updated callback](#af-skadn-cv-updated-callback) @@ -81,6 +82,8 @@ This is the Flutter SDK of Adjust™. You can read more about Adjust™ at [adju * [Enable third-party sharing](#af-enable-third-party-sharing) * [Measurement consent](#af-measurement-consent) * [Data residency](#af-data-residency) + * [COPPA compliance](#af-coppa-compliance) + * [Play Store Kids Apps](#af-play-store-kids-apps) ### License @@ -101,7 +104,7 @@ You can add Adjust SDK to your Flutter app by adding following to your `pubspec. ```yaml dependencies: - adjust_sdk: ^4.29.2 + adjust_sdk: ^4.30.0 ``` Then navigate to your project in the terminal and run: @@ -131,12 +134,6 @@ Please add the following permissions, which the Adjust SDK needs, if they are no ``` -If you are **not targeting the Google Play Store**, please also add the following permission: - -```xml - -``` - #### Add permission to gather Google advertising ID If you are targeting Android 12 and above (API level 31), you need to add the `com.google.android.gms.AD_ID` permission to read the device's advertising ID. Add the following line to your `AndroidManifest.xml` to enable the permission. @@ -183,7 +180,7 @@ In order to correctly attribute an install of your app to its source, Adjust nee In order to support this in your app, please make sure to add following dependency to your app's `build.gradle` file for Android platform: ``` -implementation 'com.android.installreferrer:installreferrer:1.0' +implementation 'com.android.installreferrer:installreferrer:2.2' ``` Also, make sure that you have paid attention to the [Proguard settings](#qs-proguard) chapter and that you have added all the rules mentioned in it, especially the one needed for this feature: @@ -222,7 +219,6 @@ Make sure that following iOS frameworks are linked with your iOS app: * `iAd.framework` - in case you are running iAd campaigns * `AdServices.framework` - in case you are running iAd campaigns * `AdSupport.framework` - for reading iOS Advertising Id (IDFA) -* `CoreTelephony.framework` - for reading MCC and MNC information * `StoreKit.framework` - for communication with SKAdNetwork framework * `AppTrackingTransparency.framework` - to ask for user's consent to be tracked and obtain status of that consent @@ -703,6 +699,16 @@ To get the current app tracking authorization status you can call `getAppTrackin * `3`: The user authorized access to IDFA * `-1`: The status is not available +### Check for ATT status change + +**Note**: This feature exists only in iOS platform. + +In cases where you are not using [Adjust app-tracking authorization wrapper](#af-ata-wrapper), Adjust SDK will not be able to know immediately upon answering the dialog what is the new value of app-tracking status. In situations like this, if you would want Adjust SDK to read the new app-tracking status value and communicate it to our backend, make sure to make a call to this method: + +```dart +Adjust.checkForNewAttStatus(); +``` + ### SKAdNetwork framework **Note**: This feature exists only in iOS platform. @@ -1233,6 +1239,26 @@ adjustConfig.urlStrategy = AdjustConfig.DataResidencyTR; // for Turkey data resi adjustConfig.urlStrategy = AdjustConfig.DataResidencyUS; // for US data residency region ``` +### COPPA compliance + +By default Adjust SDK doesn't mark app as COPPA compliant. In order to mark your app as COPPA compliant, make sure to set `coppaCompliantEnabled` member of `AdjustConfig` instance to `true`: + +```dart +adjustConfig.coppaCompliantEnabled = true; +``` + +**Note:** By enabling this feature, third-party sharing will be automatically disabled for the users. If later during the app lifetime you decide not to mark app as COPPA compliant anymore, third-party sharing **will not be automatically re-enabled**. Instead, next to not marking your app as COPPA compliant anymore, you will need to explicitly re-enable third-party sharing in case you want to do that. + +### Play Store Kids Apps + +**Note**: This feature exists only in Android platform. + +By default Adjust SDK doesn't mark Android app as Play Store Kids App. In order to mark your app as the app which is targetting kids in Play Store, make sure to set `playStoreKidsAppEnabled` member of `AdjustConfig` instance to `true`: + +```dart +adjustConfig.playStoreKidsAppEnabled = true; +``` + [dashboard]: https://adjust.com [adjust.com]: https://adjust.com @@ -1256,7 +1282,7 @@ adjustConfig.urlStrategy = AdjustConfig.DataResidencyUS; // for US data residenc The Adjust SDK is licensed under the MIT License. -Copyright (c) 2018-2021 Adjust GmbH, https://www.adjust.com +Copyright (c) 2018-Present Adjust GmbH, https://www.adjust.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/VERSION b/VERSION index 3660d52..598ce0d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.29.2 +4.30.0 diff --git a/android/build.gradle b/android/build.gradle index e52a8a2..5facd25 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -24,7 +24,7 @@ rootProject.allprojects { } apply plugin: 'com.android.library' android { - compileSdkVersion 32 + compileSdkVersion 31 defaultConfig { minSdkVersion 16 @@ -36,5 +36,5 @@ android { } dependencies { - api 'com.adjust.sdk:adjust-android:4.29.1' + api 'com.adjust.sdk:adjust-android:4.30.1' } diff --git a/android/src/main/java/com/adjust/sdk/flutter/AdjustSdk.java b/android/src/main/java/com/adjust/sdk/flutter/AdjustSdk.java index d4e200d..cc7545c 100644 --- a/android/src/main/java/com/adjust/sdk/flutter/AdjustSdk.java +++ b/android/src/main/java/com/adjust/sdk/flutter/AdjustSdk.java @@ -195,6 +195,9 @@ public void onMethodCall(MethodCall call, final Result result) { case "trackMeasurementConsent": trackMeasurementConsent(call, result); break; + case "checkForNewAttStatus": + checkForNewAttStatus(call, result); + break; case "setTestOptions": setTestOptions(call, result); break; @@ -276,11 +279,25 @@ private void start(final MethodCall call, final Result result) { // Event buffering. if (configMap.containsKey("eventBufferingEnabled")) { - String eventBufferingEnabledString = (String) configMap.get("eventBufferingEnabled"); - boolean eventBufferingEnabled = Boolean.parseBoolean(eventBufferingEnabledString); + String strEventBufferingEnabled = (String) configMap.get("eventBufferingEnabled"); + boolean eventBufferingEnabled = Boolean.parseBoolean(strEventBufferingEnabled); adjustConfig.setEventBufferingEnabled(eventBufferingEnabled); } + // COPPA compliance. + if (configMap.containsKey("coppaCompliantEnabled")) { + String strCoppaCompliantEnabled = (String) configMap.get("coppaCompliantEnabled"); + boolean coppaCompliantEnabled = Boolean.parseBoolean(strCoppaCompliantEnabled); + adjustConfig.setCoppaCompliantEnabled(coppaCompliantEnabled); + } + + // Google Play Store kids apps. + if (configMap.containsKey("playStoreKidsAppEnabled")) { + String strPlayStoreKidsAppEnabled = (String) configMap.get("playStoreKidsAppEnabled"); + boolean playStoreKidsAppEnabled = Boolean.parseBoolean(strPlayStoreKidsAppEnabled); + adjustConfig.setPlayStoreKidsAppEnabled(playStoreKidsAppEnabled); + } + // Main process name. if (configMap.containsKey("processName")) { String processName = (String) configMap.get("processName"); @@ -682,8 +699,7 @@ private void getAdid(final Result result) { } private void getIdfa(final Result result) { - result.notImplemented(); - // result.error("0", "Error. No IDFA for Android platform!", null); + result.success("Error. No IDFA on Android platform!"); } private void getGoogleAdId(final Result result) { @@ -902,8 +918,7 @@ private void trackAdRevenueNew(final MethodCall call, final Result result) { } private void trackAppStoreSubscription(final Result result) { - result.notImplemented(); - // result.error("0", "Error. No App Store subscription tracking for Android platform!", null); + result.success("Error. No App Store subscription tracking on Android platform!"); } private void trackPlayStoreSubscription(final MethodCall call, final Result result) { @@ -1005,13 +1020,11 @@ private void trackPlayStoreSubscription(final MethodCall call, final Result resu } private void requestTrackingAuthorizationWithCompletionHandler(final Result result) { - result.notImplemented(); - // result.error("0", "Error. No requestTrackingAuthorizationWithCompletionHandler for Android platform!", null); + result.success("Error. No requestTrackingAuthorizationWithCompletionHandler on Android platform!"); } private void updateConversionValue(final Result result) { - result.notImplemented(); - // result.error("0", "Error. No updateConversionValue for Android platform!", null); + result.success("Error. No updateConversionValue on Android platform!"); } private void trackThirdPartySharing(final MethodCall call, final Result result) { @@ -1057,6 +1070,10 @@ private void trackMeasurementConsent(final MethodCall call, final Result result) result.success(null); } + private void checkForNewAttStatus(final MethodCall call, final Result result) { + result.success("Error. No checkForNewAttStatus for Android platform!"); + } + private void setTestOptions(final MethodCall call, final Result result) { AdjustTestOptions testOptions = new AdjustTestOptions(); Map testOptionsMap = (Map) call.arguments; diff --git a/example/lib/main.dart b/example/lib/main.dart index 4f6ea94..dd49a99 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -276,6 +276,12 @@ class _MyHomePageState extends State with WidgetsBindingObserver { } }); + // COPPA compliance. + // config.coppaCompliantEnabled = true; + + // Google Play Store kids apps. + // config.playStoreKidsAppEnabled = true; + // Start SDK. Adjust.start(config); } diff --git a/ios/Classes/AdjustSdk.m b/ios/Classes/AdjustSdk.m index a2346fb..61b0210 100644 --- a/ios/Classes/AdjustSdk.m +++ b/ios/Classes/AdjustSdk.m @@ -119,7 +119,9 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result result(@(isEnabled)); } else if ([@"getAdid" isEqualToString:call.method]) { result([Adjust adid]); - } else { + } else if ([@"checkForNewAttStatus" isEqualToString:call.method]) { + [Adjust checkForNewAttStatus]; + } else { result(FlutterMethodNotImplemented); } } @@ -143,6 +145,7 @@ - (void)start:(FlutterMethodCall *)call withResult:(FlutterResult)result { NSString *eventBufferingEnabled = call.arguments[@"eventBufferingEnabled"]; NSString *sendInBackground = call.arguments[@"sendInBackground"]; NSString *needsCost = call.arguments[@"needsCost"]; + NSString *coppaCompliantEnabled = call.arguments[@"coppaCompliantEnabled"]; NSString *allowiAdInfoReading = call.arguments[@"allowiAdInfoReading"]; NSString *allowAdServicesInfoReading = call.arguments[@"allowAdServicesInfoReading"]; NSString *allowIdfaReading = call.arguments[@"allowIdfaReading"]; @@ -183,6 +186,11 @@ - (void)start:(FlutterMethodCall *)call withResult:(FlutterResult)result { if ([self isFieldValid:eventBufferingEnabled]) { [adjustConfig setEventBufferingEnabled:[eventBufferingEnabled boolValue]]; } + + // COPPA compliance. + if ([self isFieldValid:coppaCompliantEnabled]) { + [adjustConfig setCoppaCompliantEnabled:[coppaCompliantEnabled boolValue]]; + } // Default tracker. if ([self isFieldValid:defaultTracker]) { diff --git a/ios/adjust_sdk.podspec b/ios/adjust_sdk.podspec index acfa605..9dbee63 100644 --- a/ios/adjust_sdk.podspec +++ b/ios/adjust_sdk.podspec @@ -1,18 +1,18 @@ Pod::Spec.new do |s| s.name = 'adjust_sdk' - s.version = '4.29.2' + s.version = '4.30.0' s.summary = 'Adjust Flutter SDK for iOS platform' s.description = <<-DESC Adjust Flutter SDK for iOS platform. DESC s.homepage = 'http://www.adjust.com' s.license = { :file => '../LICENSE' } - s.author = { 'Adjust GmbH' => 'sdk@adjust.com' } + s.author = { 'Adjust' => 'sdk@adjust.com' } s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.ios.deployment_target = '8.0' s.dependency 'Flutter' - s.dependency 'Adjust', '4.29.7' + s.dependency 'Adjust', '4.30.0' end diff --git a/lib/adjust.dart b/lib/adjust.dart index 37ffef8..7bfe1f2 100644 --- a/lib/adjust.dart +++ b/lib/adjust.dart @@ -19,7 +19,7 @@ import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; class Adjust { - static const String _sdkPrefix = 'flutter4.29.2'; + static const String _sdkPrefix = 'flutter4.30.0'; static const MethodChannel _channel = const MethodChannel('com.adjust.sdk/api'); @@ -180,6 +180,10 @@ class Adjust { 'updateConversionValue', {'conversionValue': conversionValue}); } + static void checkForNewAttStatus() { + _channel.invokeMethod('checkForNewAttStatus'); + } + // For testing purposes only. Do not use in production. @visibleForTesting static void setTestOptions(final dynamic testOptions) { diff --git a/lib/adjust_config.dart b/lib/adjust_config.dart index 621694a..946b186 100644 --- a/lib/adjust_config.dart +++ b/lib/adjust_config.dart @@ -14,6 +14,7 @@ import 'package:adjust_sdk/adjust_session_success.dart'; import 'package:flutter/services.dart'; enum AdjustLogLevel { verbose, debug, info, warn, error, suppress } + enum AdjustEnvironment { production, sandbox } typedef void AttributionCallback(AdjustAttribution attributionData); @@ -50,6 +51,7 @@ class AdjustConfig { static const String AdRevenueSourceAdMostSource = 'admost_sdk'; static const String AdRevenueSourceUnity = 'unity_sdk'; static const String AdRevenueSourceHeliumChartboost = 'helium_chartboost_sdk'; + static const String AdRevenueSourcePublisher = 'publisher_sdk'; String _appToken; AdjustEnvironment _environment; @@ -71,6 +73,8 @@ class AdjustConfig { bool? launchDeferredDeeplink; bool? needsCost; bool? preinstallTrackingEnabled; + bool? playStoreKidsAppEnabled; + bool? coppaCompliantEnabled; String? sdkPrefix; String? userAgent; String? defaultTracker; @@ -213,6 +217,12 @@ class AdjustConfig { configMap['preinstallTrackingEnabled'] = preinstallTrackingEnabled.toString(); } + if (playStoreKidsAppEnabled != null) { + configMap['playStoreKidsAppEnabled'] = playStoreKidsAppEnabled.toString(); + } + if (coppaCompliantEnabled != null) { + configMap['coppaCompliantEnabled'] = coppaCompliantEnabled.toString(); + } if (allowiAdInfoReading != null) { configMap['allowiAdInfoReading'] = allowiAdInfoReading.toString(); } diff --git a/pubspec.yaml b/pubspec.yaml index b858dd2..f8e7164 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: adjust_sdk description: This is the Flutter SDK of Adjust™. You can read more about Adjust™ at adjust.com. homepage: https://github.com/adjust/flutter_sdk -version: 4.29.2 +version: 4.30.0 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/test/app/ios/Runner.xcodeproj/project.pbxproj b/test/app/ios/Runner.xcodeproj/project.pbxproj index c478e65..c1b511a 100644 --- a/test/app/ios/Runner.xcodeproj/project.pbxproj +++ b/test/app/ios/Runner.xcodeproj/project.pbxproj @@ -175,7 +175,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { diff --git a/test/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/test/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 46d2d0d..c87d15a 100644 --- a/test/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/test/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone + diff --git a/test/app/lib/command_executor.dart b/test/app/lib/command_executor.dart index f614e8a..5a971a9 100644 --- a/test/app/lib/command_executor.dart +++ b/test/app/lib/command_executor.dart @@ -316,6 +316,16 @@ class CommandExecutor { _command.getFirstParameterValue('eventBufferingEnabled') == 'true'; } + if (_command.containsParameter('coppaCompliant')) { + adjustConfig!.coppaCompliantEnabled = + _command.getFirstParameterValue('coppaCompliant') == 'true'; + } + + if (_command.containsParameter('playStoreKids')) { + adjustConfig!.playStoreKidsAppEnabled = + _command.getFirstParameterValue('playStoreKids') == 'true'; + } + if (_command.containsParameter('sendInBackground')) { adjustConfig!.sendInBackground = _command.getFirstParameterValue('sendInBackground') == 'true'; @@ -516,17 +526,21 @@ class CommandExecutor { if (_command.containsParameter('callbackParams')) { List callbackParams = _command.getParamteters('callbackParams')!; for (int i = 0; i < callbackParams.length; i = i + 2) { - String key = callbackParams[i]; - String value = callbackParams[i + 1]; - adjustEvent!.addCallbackParameter(key, value); + if (callbackParams[i] != null && callbackParams[i + 1] != null) { + String key = callbackParams[i]; + String value = callbackParams[i + 1]; + adjustEvent!.addCallbackParameter(key, value); + } } } if (_command.containsParameter('partnerParams')) { List partnerParams = _command.getParamteters('partnerParams')!; for (int i = 0; i < partnerParams.length; i = i + 2) { - String key = partnerParams[i]; - String value = partnerParams[i + 1]; - adjustEvent!.addPartnerParameter(key, value); + if (partnerParams[i] != null && partnerParams[i + 1] != null) { + String key = partnerParams[i]; + String value = partnerParams[i + 1]; + adjustEvent!.addPartnerParameter(key, value); + } } } if (_command.containsParameter('orderId')) { @@ -680,17 +694,21 @@ class CommandExecutor { List callbackParams = _command.getParamteters('callbackParams')!; for (int i = 0; i < callbackParams.length; i = i + 2) { - String key = callbackParams[i]; - String value = callbackParams[i + 1]; - subscription.addCallbackParameter(key, value); + if (callbackParams[i] != null && callbackParams[i + 1] != null) { + String key = callbackParams[i]; + String value = callbackParams[i + 1]; + subscription.addCallbackParameter(key, value); + } } } if (_command.containsParameter('partnerParams')) { List partnerParams = _command.getParamteters('partnerParams')!; for (int i = 0; i < partnerParams.length; i = i + 2) { - String key = partnerParams[i]; - String value = partnerParams[i + 1]; - subscription.addPartnerParameter(key, value); + if (partnerParams[i] != null && partnerParams[i + 1] != null) { + String key = partnerParams[i]; + String value = partnerParams[i + 1]; + subscription.addPartnerParameter(key, value); + } } } @@ -713,17 +731,21 @@ class CommandExecutor { List callbackParams = _command.getParamteters('callbackParams')!; for (int i = 0; i < callbackParams.length; i = i + 2) { - String key = callbackParams[i]; - String value = callbackParams[i + 1]; - subscription.addCallbackParameter(key, value); + if (callbackParams[i] != null && callbackParams[i + 1] != null) { + String key = callbackParams[i]; + String value = callbackParams[i + 1]; + subscription.addCallbackParameter(key, value); + } } } if (_command.containsParameter('partnerParams')) { List partnerParams = _command.getParamteters('partnerParams')!; for (int i = 0; i < partnerParams.length; i = i + 2) { - String key = partnerParams[i]; - String value = partnerParams[i + 1]; - subscription.addPartnerParameter(key, value); + if (partnerParams[i] != null && partnerParams[i + 1] != null) { + String key = partnerParams[i]; + String value = partnerParams[i + 1]; + subscription.addPartnerParameter(key, value); + } } } @@ -743,10 +765,12 @@ class CommandExecutor { List granularOptions = _command.getParamteters('granularOptions')!; for (var i = 0; i < granularOptions.length; i += 3) { - String partnerName = granularOptions[i]; - String key = granularOptions[i + 1]; - String value = granularOptions[i + 2]; - adjustThirdPartySharing.addGranularOption(partnerName, key, value); + if (granularOptions[i] != null && granularOptions[i + 1] != null && granularOptions[i + 2] != null) { + String partnerName = granularOptions[i]; + String key = granularOptions[i + 1]; + String value = granularOptions[i + 2]; + adjustThirdPartySharing.addGranularOption(partnerName, key, value); + } } } @@ -769,17 +793,21 @@ class CommandExecutor { if (_command.containsParameter('callbackParams')) { List callbackParams = _command.getParamteters('callbackParams')!; for (int i = 0; i < callbackParams.length; i = i + 2) { - String key = callbackParams[i]; - String value = callbackParams[i + 1]; - adjustAdRevenue.addCallbackParameter(key, value); + if (callbackParams[i] != null && callbackParams[i + 1] != null) { + String key = callbackParams[i]; + String value = callbackParams[i + 1]; + adjustAdRevenue.addCallbackParameter(key, value); + } } } if (_command.containsParameter('partnerParams')) { List partnerParams = _command.getParamteters('partnerParams')!; for (int i = 0; i < partnerParams.length; i = i + 2) { - String key = partnerParams[i]; - String value = partnerParams[i + 1]; - adjustAdRevenue.addPartnerParameter(key, value); + if (partnerParams[i] != null && partnerParams[i + 1] != null) { + String key = partnerParams[i]; + String value = partnerParams[i + 1]; + adjustAdRevenue.addPartnerParameter(key, value); + } } } if (_command.containsParameter('adImpressionsCount')) { diff --git a/test/ios/test_lib.podspec b/test/ios/test_lib.podspec index b7be982..90dc4ee 100644 --- a/test/ios/test_lib.podspec +++ b/test/ios/test_lib.podspec @@ -1,20 +1,20 @@ Pod::Spec.new do |s| - s.name = 'test_lib' - s.version = '4.29.2' - s.summary = 'Adjust test library Flutter plugin' - s.description = <<-DESC -A new flutter plugin project. - DESC - s.homepage = 'http://www.adjust.com' - s.license = { :file => '../LICENSE' } - s.author = { 'Adjust GmbH' => 'srdjan@adjust.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.preserve_paths = 'AdjustTestLibrary.framework' - s.xcconfig = { 'OTHER_LDFLAGS' => '-framework AdjustTestLibrary' } - s.vendored_frameworks = 'AdjustTestLibrary.framework' + s.name = 'test_lib' + s.version = '4.30.0' + s.summary = 'Adjust test library for iOS platform' + s.description = <<-DESC + Adjust test library for iOS platform. + DESC + s.homepage = 'http://www.adjust.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Adjust' => 'sdk@adjust.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.preserve_paths = 'AdjustTestLibrary.framework' + s.xcconfig = { 'OTHER_LDFLAGS' => '-framework AdjustTestLibrary' } + s.vendored_frameworks = 'AdjustTestLibrary.framework' + s.ios.deployment_target = '8.0' s.dependency 'Flutter' - s.ios.deployment_target = '8.0' end diff --git a/test/pubspec.yaml b/test/pubspec.yaml index 719d9a7..84e8668 100644 --- a/test/pubspec.yaml +++ b/test/pubspec.yaml @@ -1,7 +1,7 @@ name: test_lib description: Flutter plugin for Adjust Testing Library. Intended exclusively for internal use. -version: 4.29.2 -author: Serj (srdjan@adjust.com) +version: 4.30.0 +author: Adjust (sdk@adjust.com) environment: sdk: ">=2.12.0 <3.0.0"