diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b570dad..09a26cc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +### Version 4.17.0 (12th December 2018) +#### Added +- Added `getSdkVersion()` method to `Adjust` interface to obtain current SDK version string. + +#### Changed +- Changed usage of `compile` keyword in plugin's `build.gradle` file into `implementation` (https://github.com/adjust/react_native_sdk/issues/47). + +#### Native SDKs +- [iOS@v4.17.1][ios_sdk_v4.17.1] +- [Android@v4.17.0][android_sdk_v4.17.0] + +--- + ### Version 4.15.0 (10th October 2018) #### Added - Added `setCallbackId` method on `AdjustEvent` object for users to set custom ID on event object which will later be reported in event success/failure callbacks. @@ -247,6 +260,7 @@ [ios_sdk_v4.13.0]: https://github.com/adjust/ios_sdk/tree/v4.13.0 [ios_sdk_v4.14.1]: https://github.com/adjust/ios_sdk/tree/v4.14.1 [ios_sdk_v4.15.0]: https://github.com/adjust/ios_sdk/tree/v4.15.0 +[ios_sdk_v4.17.1]: https://github.com/adjust/ios_sdk/tree/v4.17.1 [android_sdk_v4.10.4]: https://github.com/adjust/android_sdk/tree/v4.10.4 [android_sdk_v4.11.0]: https://github.com/adjust/android_sdk/tree/v4.11.0 @@ -261,3 +275,4 @@ [android_sdk_v4.13.0]: https://github.com/adjust/android_sdk/tree/v4.13.0 [android_sdk_v4.14.0]: https://github.com/adjust/android_sdk/tree/v4.14.0 [android_sdk_v4.15.0]: https://github.com/adjust/android_sdk/tree/v4.15.0 +[android_sdk_v4.17.0]: https://github.com/adjust/android_sdk/tree/v4.17.0 diff --git a/README.md b/README.md index 638574ee..89596bb7 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,8 @@ compile 'com.google.android.gms:play-services-analytics:10.0.1' To check whether the analytics part of the Google Play Services library has been successfully added to your app so that the Adjust SDK can read it properly, you should start your app by configuring the SDK to run in `sandbox` mode and set the log level to `verbose`. After that, track a session or some events in your app and observe the list of parameters in the verbose logs which are being read once the session or event has been tracked. If you see a parameter called `gps_adid` in there, you have successfully added the analytics part of the Google Play Services library to your app and our SDK is reading the necessary information from it. +In case you encounter any issue with attempts to read Google Advertising Identifier, feel free to open an issue in our Github repository or write an email to support@adjust.com. + ### Proguard settings If you are using Proguard, add these lines to your Proguard file: @@ -213,20 +215,6 @@ If you are using Proguard, add these lines to your Proguard file: java.lang.String getId(); boolean isLimitAdTrackingEnabled(); } --keep class dalvik.system.VMRuntime { - java.lang.String getRuntime(); -} --keep class android.os.Build { - java.lang.String[] SUPPORTED_ABIS; - java.lang.String CPU_ABI; -} --keep class android.content.res.Configuration { - android.os.LocaleList getLocales(); - java.util.Locale locale; -} --keep class android.os.LocaledList { - java.util.Locale get(int); -} -keep public class com.android.installreferrer.** { *; } ``` diff --git a/VERSION b/VERSION index 5c517bf1..43b58271 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.15.0 +4.17.0 diff --git a/android/build.gradle b/android/build.gradle index 5f6b2ebb..fb32cd7c 100755 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,6 +26,6 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.facebook.react:react-native:+' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.facebook.react:react-native:+' } diff --git a/android/libs/adjust-android.jar b/android/libs/adjust-android.jar index 5c43fbea..34fdf73e 100644 Binary files a/android/libs/adjust-android.jar and b/android/libs/adjust-android.jar differ diff --git a/android/src/main/java/com/adjust/sdk/Adjust.java b/android/src/main/java/com/adjust/sdk/Adjust.java index 577fa34b..afb7b3be 100755 --- a/android/src/main/java/com/adjust/sdk/Adjust.java +++ b/android/src/main/java/com/adjust/sdk/Adjust.java @@ -447,6 +447,16 @@ public void getAttribution(Callback callback) { callback.invoke(AdjustUtil.attributionToMap(com.adjust.sdk.Adjust.getAttribution())); } + @ReactMethod + public void getSdkVersion(String sdkPrefix, Callback callback) { + String sdkVersion = com.adjust.sdk.Adjust.getSdkVersion(); + if (sdkVersion == null) { + callback.invoke(""); + } else { + callback.invoke(sdkPrefix + "@" + sdkVersion); + } + } + @ReactMethod public void setAttributionCallbackListener() { this.attributionCallback = true; diff --git a/example/App.js b/example/App.js index 7606b17a..34420afe 100644 --- a/example/App.js +++ b/example/App.js @@ -25,6 +25,10 @@ this._onPress_getIds = this._onPress_getIds.bind(this); this._onPress_isSdkEnabled = this._onPress_isSdkEnabled.bind(this); + Adjust.getSdkVersion(function(sdkVersion) { + console.log("Adjust SDK version: " + sdkVersion); + }); + var adjustConfig = new AdjustConfig("2fm9gkqubvpc", AdjustConfig.EnvironmentSandbox); adjustConfig.setLogLevel(AdjustConfig.LogLevelVerbose); adjustConfig.setShouldLaunchDeeplink(true); diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 6183ed11..0a643d30 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -94,13 +94,13 @@ def enableSeparateBuildPerCPUArchitecture = false def enableProguardInReleaseBuilds = false android { - compileSdkVersion 26 - buildToolsVersion "26.0.3" + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.adjust.examples" - minSdkVersion 16 - targetSdkVersion 26 + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" ndk { @@ -138,11 +138,13 @@ android { dependencies { compile project(':react-native-adjust') - compile fileTree(dir: "libs", include: ["*.jar"]) - compile "com.android.support:appcompat-v7:26.+" - compile "com.facebook.react:react-native:+" // From node_modules - compile 'com.android.installreferrer:installreferrer:1.0' - compile 'com.google.android.gms:play-services-analytics:16.0.4' + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" + implementation "com.facebook.react:react-native:+" // From node_modules + + implementation project(':react-native-adjust') + implementation 'com.android.installreferrer:installreferrer:1.0' + implementation 'com.google.android.gms:play-services-analytics:16.0.4' } // Run this once to be able to run the application with BUCK diff --git a/example/android/build.gradle b/example/android/build.gradle index 4ae87374..5cc44d62 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,11 +1,19 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext { + buildToolsVersion = "27.0.3" + minSdkVersion = 17 + compileSdkVersion = 27 + targetSdkVersion = 27 + supportLibVersion = "27.1.1" + } repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:3.1.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,13 +23,17 @@ buildscript { allprojects { repositories { mavenLocal() + google() jcenter() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } - maven { - url "https://maven.google.com" - } } } + + +task wrapper(type: Wrapper) { + gradleVersion = '4.4' + distributionUrl = distributionUrl.replace("bin", "all") +} diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index dbdc05d2..b6517bb1 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 6fe2e011..da784405 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -1,5 +1,9 @@ rootProject.name = 'example' include ':react-native-adjust' project(':react-native-adjust').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-adjust/android') +include ':react-native-adjust' +project(':react-native-adjust').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-adjust/android') +include ':react-native-adjust' +project(':react-native-adjust').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-adjust/android') include ':app' diff --git a/example/yarn.lock b/example/yarn.lock index cc28204d..4fc37e40 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -4123,7 +4123,7 @@ react-is@^16.3.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" react-native-adjust@../temp: - version "4.14.0" + version "4.17.0" react-native@0.55.4: version "0.55.4" diff --git a/ext/android/sdk b/ext/android/sdk index 60275aff..09b13b9a 160000 --- a/ext/android/sdk +++ b/ext/android/sdk @@ -1 +1 @@ -Subproject commit 60275aff37d6eccc5624adfddd157a1245f068ea +Subproject commit 09b13b9af945ba13cdcc295842a484aef6951860 diff --git a/ext/ios/sdk b/ext/ios/sdk index d746f718..035cb9ea 160000 --- a/ext/ios/sdk +++ b/ext/ios/sdk @@ -1 +1 @@ -Subproject commit d746f7189ca767323d53f34a64a51ddecd7a84ab +Subproject commit 035cb9ea3162bf49cafec60db96eba87c3419043 diff --git a/index.js b/index.js index c8e20d18..e6cf43b0 100755 --- a/index.js +++ b/index.js @@ -15,7 +15,7 @@ if (Platform.OS === "android") { module_adjust_emitter = new NativeEventEmitter(NativeModules.AdjustEventEmitter); } -// Adjust // +// Adjust var Adjust = {}; @@ -23,7 +23,7 @@ Adjust.create = function(adjustConfig) { module_adjust.create(adjustConfig); }; -Adjust.trackEvent = function (adjustEvent) { +Adjust.trackEvent = function(adjustEvent) { module_adjust.trackEvent(adjustEvent); }; @@ -105,6 +105,10 @@ Adjust.getAmazonAdId = function(callback) { module_adjust.getAmazonAdId(callback); }; +Adjust.getSdkVersion = function(callback) { + module_adjust.getSdkVersion("react-native4.17.0", callback); +} + Adjust.setReferrer = function(referrer) { module_adjust.setReferrer(referrer); }; @@ -172,10 +176,10 @@ Adjust.onPause = function(testParam) { module_adjust.onPause(); }; -// AdjustConfig // +// AdjustConfig var AdjustConfig = function(appToken, environment) { - this.sdkPrefix = "react_native4.15.0"; + this.sdkPrefix = "react-native4.17.0"; this.appToken = appToken; this.environment = environment; this.logLevel = null; @@ -262,6 +266,10 @@ AdjustConfig.prototype.setDeviceKnown = function(isDeviceKnown) { this.isDeviceKnown = isDeviceKnown; }; +AdjustConfig.prototype.setSdkPrefix = function(sdkPrefix) { + this.sdkPrefix = sdkPrefix; +}; + AdjustConfig.prototype.setReadMobileEquipmentIdentity = function(readMobileEquipmentIdentity) { // this.readMobileEquipmentIdentity = readMobileEquipmentIdentity; }; @@ -324,9 +332,9 @@ AdjustConfig.prototype.setDeferredDeeplinkCallbackListener = function(deferredDe } }; -// AdjustEvent // +// AdjustEvent -var AdjustEvent = function (eventToken) { +var AdjustEvent = function(eventToken) { this.eventToken = eventToken; this.revenue = null; this.currency = null; @@ -334,35 +342,35 @@ var AdjustEvent = function (eventToken) { this.callbackId = null; this.callbackParameters = {}; this.partnerParameters = {}; +}; + +AdjustEvent.prototype.setRevenue = function(revenue, currency) { + if (revenue != null) { + this.revenue = revenue.toString(); + this.currency = currency; + } +}; + +AdjustEvent.prototype.addCallbackParameter = function(key, value) { + if (typeof key !== 'string' || typeof value !== 'string') { + return; + } + this.callbackParameters[key] = value; +}; + +AdjustEvent.prototype.addPartnerParameter = function(key, value) { + if (typeof key !== 'string' || typeof value !== 'string') { + return; + } + this.partnerParameters[key] = value; +}; + +AdjustEvent.prototype.setTransactionId = function(transactionId) { + this.transactionId = transactionId; +}; - this.setRevenue = function(revenue, currency) { - if (revenue != null) { - this.revenue = revenue.toString(); - this.currency = currency; - } - }; - - this.addCallbackParameter = function(key, value) { - if (typeof key !== 'string' || typeof value !== 'string') { - return; - } - this.callbackParameters[key] = value; - }; - - this.addPartnerParameter = function(key, value) { - if (typeof key !== 'string' || typeof value !== 'string') { - return; - } - this.partnerParameters[key] = value; - }; - - this.setTransactionId = function(transactionId) { - this.transactionId = transactionId; - }; - - this.setCallbackId = function(callbackId) { - this.callbackId = callbackId; - }; +AdjustEvent.prototype.setCallbackId = function(callbackId) { + this.callbackId = callbackId; }; module.exports = { Adjust, AdjustEvent, AdjustConfig } diff --git a/ios/Adjust/ADJActivityHandler.h b/ios/Adjust/ADJActivityHandler.h index 31541ef2..08b1fe62 100644 --- a/ios/Adjust/ADJActivityHandler.h +++ b/ios/Adjust/ADJActivityHandler.h @@ -8,6 +8,9 @@ #import "Adjust.h" #import "ADJResponseData.h" +#import "ADJActivityState.h" +#import "ADJDeviceInfo.h" +#import "ADJSessionParameters.h" @interface ADJInternalState : NSObject @@ -83,7 +86,6 @@ retriesLeft:(int)retriesLeft; - (void)setOfflineMode:(BOOL)offline; -- (ADJInternalState*) internalState; - (void)sendFirstPackages; - (void)addSessionCallbackParameter:(NSString *)key @@ -97,6 +99,11 @@ - (NSString *)getBasePath; - (NSString *)getGdprPath; +- (ADJDeviceInfo *)deviceInfo; +- (ADJActivityState *)activityState; +- (ADJConfig *)adjustConfig; +- (ADJSessionParameters *)sessionParameters; + - (void)teardown; + (void)deleteState; @end diff --git a/ios/Adjust/ADJActivityHandler.m b/ios/Adjust/ADJActivityHandler.m index 74928403..35d587c6 100644 --- a/ios/Adjust/ADJActivityHandler.m +++ b/ios/Adjust/ADJActivityHandler.m @@ -8,7 +8,6 @@ #import "ADJActivityPackage.h" #import "ADJActivityHandler.h" -#import "ADJActivityState.h" #import "ADJPackageBuilder.h" #import "ADJPackageHandler.h" #import "ADJLogger.h" @@ -20,7 +19,6 @@ #import "ADJAttributionHandler.h" #import "NSString+ADJAdditions.h" #import "ADJSdkClickHandler.h" -#import "ADJSessionParameters.h" #import "ADJUserDefaults.h" typedef void (^activityHandlerBlockI)(ADJActivityHandler * activityHandler); @@ -727,16 +725,7 @@ - (void)initI:(ADJActivityHandler *)selfI [selfI updatePackagesI:selfI]; } - double now = [NSDate.date timeIntervalSince1970]; - ADJPackageBuilder *attributionBuilder = [[ADJPackageBuilder alloc] - initWithDeviceInfo:selfI.deviceInfo - activityState:selfI.activityState - config:selfI.adjustConfig - sessionParameters:selfI.sessionParameters - createdAt:now]; - ADJActivityPackage *attributionPackage = [attributionBuilder buildAttributionPackage]; selfI.attributionHandler = [ADJAdjustFactory attributionHandlerForActivityHandler:selfI - withAttributionPackage:attributionPackage startsSending:[selfI toSendI:selfI sdkClickHandlerOnly:NO]]; @@ -1258,40 +1247,35 @@ - (void)checkStatusI:(ADJActivityHandler *)selfI - (void)appWillOpenUrlI:(ADJActivityHandler *)selfI url:(NSURL *)url clickTime:(NSDate *)clickTime { - if ([ADJUtil isNull:url]) { + if (![selfI isEnabledI:selfI]) { return; } - - if (![selfI isEnabledI:selfI]) { + if ([ADJUtil isNull:url]) { return; } - - if ([[url absoluteString] length] == 0) { + if (![ADJUtil isDeeplinkValid:url]) { return; } - NSArray* queryArray = [url.query componentsSeparatedByString:@"&"]; + NSArray *queryArray = [url.query componentsSeparatedByString:@"&"]; if (queryArray == nil) { queryArray = @[]; } - NSMutableDictionary* adjustDeepLinks = [NSMutableDictionary dictionary]; + NSMutableDictionary *adjustDeepLinks = [NSMutableDictionary dictionary]; ADJAttribution *deeplinkAttribution = [[ADJAttribution alloc] init]; - - for (NSString* fieldValuePair in queryArray) { + for (NSString *fieldValuePair in queryArray) { [selfI readDeeplinkQueryStringI:selfI queryString:fieldValuePair adjustDeepLinks:adjustDeepLinks attribution:deeplinkAttribution]; } double now = [NSDate.date timeIntervalSince1970]; double lastInterval = now - selfI.activityState.lastActivity; selfI.activityState.lastInterval = lastInterval; - - ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc] - initWithDeviceInfo:selfI.deviceInfo - activityState:selfI.activityState - config:selfI.adjustConfig - sessionParameters:selfI.sessionParameters - createdAt:now]; + ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc] initWithDeviceInfo:selfI.deviceInfo + activityState:selfI.activityState + config:selfI.adjustConfig + sessionParameters:selfI.sessionParameters + createdAt:now]; clickBuilder.deeplinkParameters = adjustDeepLinks; clickBuilder.attribution = deeplinkAttribution; clickBuilder.clickTime = clickTime; diff --git a/ios/Adjust/ADJAdjustFactory.h b/ios/Adjust/ADJAdjustFactory.h index 9628018b..fac9982a 100644 --- a/ios/Adjust/ADJAdjustFactory.h +++ b/ios/Adjust/ADJAdjustFactory.h @@ -36,7 +36,6 @@ + (ADJBackoffStrategy *)sdkClickHandlerBackoffStrategy; + (id)attributionHandlerForActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; + (BOOL)testing; + (NSTimeInterval)maxDelayStart; diff --git a/ios/Adjust/ADJAdjustFactory.m b/ios/Adjust/ADJAdjustFactory.m index d85a2ae7..34dd05e3 100644 --- a/ios/Adjust/ADJAdjustFactory.m +++ b/ios/Adjust/ADJAdjustFactory.m @@ -114,17 +114,14 @@ + (ADJBackoffStrategy *)sdkClickHandlerBackoffStrategy { } + (id)attributionHandlerForActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending { if (internalAttributionHandler == nil) { return [ADJAttributionHandler handlerWithActivityHandler:activityHandler - withAttributionPackage:attributionPackage startsSending:startsSending]; } return [internalAttributionHandler initWithActivityHandler:activityHandler - withAttributionPackage:attributionPackage startsSending:startsSending]; } diff --git a/ios/Adjust/ADJAttributionHandler.h b/ios/Adjust/ADJAttributionHandler.h index b460c63b..783e6f07 100644 --- a/ios/Adjust/ADJAttributionHandler.h +++ b/ios/Adjust/ADJAttributionHandler.h @@ -13,7 +13,6 @@ @protocol ADJAttributionHandler - (id)initWithActivityHandler:(id) activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; - (void)checkSessionResponse:(ADJSessionResponseData *)sessionResponseData; @@ -35,7 +34,6 @@ @interface ADJAttributionHandler : NSObject + (id)handlerWithActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; @end diff --git a/ios/Adjust/ADJAttributionHandler.m b/ios/Adjust/ADJAttributionHandler.m index b6fafc38..22f2b77d 100644 --- a/ios/Adjust/ADJAttributionHandler.m +++ b/ios/Adjust/ADJAttributionHandler.m @@ -12,6 +12,7 @@ #import "ADJActivityHandler.h" #import "NSString+ADJAdditions.h" #import "ADJTimerOnce.h" +#import "ADJPackageBuilder.h" static const char * const kInternalQueueName = "com.adjust.AttributionQueue"; static NSString * const kAttributionTimerName = @"Attribution timer"; @@ -22,25 +23,22 @@ @interface ADJAttributionHandler() @property (nonatomic, weak) id activityHandler; @property (nonatomic, weak) id logger; @property (nonatomic, strong) ADJTimerOnce *attributionTimer; -@property (nonatomic, strong) ADJActivityPackage * attributionPackage; @property (atomic, assign) BOOL paused; @property (nonatomic, copy) NSString *basePath; +@property (nonatomic, copy) NSString *lastInitiatedBy; @end @implementation ADJAttributionHandler + (id)handlerWithActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; { return [[ADJAttributionHandler alloc] initWithActivityHandler:activityHandler - withAttributionPackage:attributionPackage startsSending:startsSending]; } - (id)initWithActivityHandler:(id) activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; { self = [super init]; @@ -49,7 +47,6 @@ - (id)initWithActivityHandler:(id) activityHandler self.internalQueue = dispatch_queue_create(kInternalQueueName, DISPATCH_QUEUE_SERIAL); self.activityHandler = activityHandler; self.logger = ADJAdjustFactory.logger; - self.attributionPackage = attributionPackage; self.paused = !startsSending; self.basePath = [activityHandler getBasePath]; __weak __typeof__(self) weakSelf = self; @@ -97,9 +94,9 @@ - (void)getAttribution { [ADJUtil launchInQueue:self.internalQueue selfInject:self block:^(ADJAttributionHandler* selfI) { + selfI.lastInitiatedBy = @"sdk"; [selfI waitRequestAttributionWithDelayI:selfI - milliSecondsDelay:0 - isSdkAskingForIt:YES]; + milliSecondsDelay:0]; }]; } @@ -147,9 +144,9 @@ - (void)checkAttributionI:(ADJAttributionHandler*)selfI if (timerMilliseconds != nil) { [selfI.activityHandler setAskingAttribution:YES]; + selfI.lastInitiatedBy = @"backend"; [selfI waitRequestAttributionWithDelayI:selfI - milliSecondsDelay:[timerMilliseconds intValue] - isSdkAskingForIt:NO]; + milliSecondsDelay:[timerMilliseconds intValue]]; return; } @@ -188,14 +185,17 @@ - (void)requestAttributionI:(ADJAttributionHandler*)selfI { [selfI.logger debug:@"Attribution request won't be fired for forgotten user"]; return; } - [selfI.logger verbose:@"%@", selfI.attributionPackage.extendedString]; + + ADJActivityPackage* attributionPackage = [selfI buildAndGetAttributionPackageI:selfI]; + + [selfI.logger verbose:@"%@", attributionPackage.extendedString]; NSURL * baseUrl = [NSURL URLWithString:[ADJAdjustFactory baseUrl]]; [ADJUtil sendGetRequest:baseUrl basePath:selfI.basePath prefixErrorMessage:@"Failed to get attribution" - activityPackage:selfI.attributionPackage + activityPackage:attributionPackage responseDataHandler:^(ADJResponseData * responseData) { // Check if any package response contains information that user has opted out. @@ -212,20 +212,13 @@ - (void)requestAttributionI:(ADJAttributionHandler*)selfI { } - (void)waitRequestAttributionWithDelayI:(ADJAttributionHandler*)selfI - milliSecondsDelay:(int)milliSecondsDelay - isSdkAskingForIt:(BOOL)isSdkAsking { + milliSecondsDelay:(int)milliSecondsDelay { NSTimeInterval secondsDelay = milliSecondsDelay / 1000; NSTimeInterval nextAskIn = [selfI.attributionTimer fireIn]; if (nextAskIn > secondsDelay) { return; } - if (isSdkAsking) { - [selfI.attributionPackage.parameters setObject:@"sdk" forKey:@"initiated_by"]; - } else { - [selfI.attributionPackage.parameters setObject:@"backend" forKey:@"initiated_by"]; - } - if (milliSecondsDelay > 0) { [selfI.logger debug:@"Waiting to query attribution in %d milliseconds", milliSecondsDelay]; } @@ -234,6 +227,23 @@ - (void)waitRequestAttributionWithDelayI:(ADJAttributionHandler*)selfI [selfI.attributionTimer startIn:secondsDelay]; } +- (ADJActivityPackage *)buildAndGetAttributionPackageI:(ADJAttributionHandler*)selfI +{ + double now = [NSDate.date timeIntervalSince1970]; + + ADJPackageBuilder *attributionBuilder = [[ADJPackageBuilder alloc] + initWithDeviceInfo:selfI.activityHandler.deviceInfo + activityState:selfI.activityHandler.activityState + config:selfI.activityHandler.adjustConfig + sessionParameters:selfI.activityHandler.sessionParameters + createdAt:now]; + ADJActivityPackage *attributionPackage = [attributionBuilder buildAttributionPackage:selfI.lastInitiatedBy]; + + selfI.lastInitiatedBy = nil; + + return attributionPackage; +} + #pragma mark - private - (void)teardown { @@ -246,7 +256,6 @@ - (void)teardown { self.activityHandler = nil; self.logger = nil; self.attributionTimer = nil; - self.attributionPackage = nil; } @end diff --git a/ios/Adjust/ADJConfig.h b/ios/Adjust/ADJConfig.h index c44c369e..f316f833 100644 --- a/ios/Adjust/ADJConfig.h +++ b/ios/Adjust/ADJConfig.h @@ -19,6 +19,7 @@ * @brief Optional delegate that will get informed about tracking results. */ @protocol AdjustDelegate + @optional /** diff --git a/ios/Adjust/ADJPackageBuilder.h b/ios/Adjust/ADJPackageBuilder.h index a8a82194..c4be1336 100644 --- a/ios/Adjust/ADJPackageBuilder.h +++ b/ios/Adjust/ADJPackageBuilder.h @@ -1,9 +1,9 @@ // // ADJPackageBuilder.h -// Adjust +// Adjust SDK // -// Created by Christian Wellenbrock on 2013-07-03. -// Copyright (c) 2013 adjust GmbH. All rights reserved. +// Created by Christian Wellenbrock (@wellle) on 3rd July 2013. +// Copyright (c) 2013-2018 Adjust GmbH. All rights reserved. // #import "ADJEvent.h" @@ -12,17 +12,18 @@ #import "ADJActivityState.h" #import "ADJActivityPackage.h" #import "ADJSessionParameters.h" - #import @interface ADJPackageBuilder : NSObject +@property (nonatomic, copy) NSString *deeplink; + @property (nonatomic, copy) NSDate *clickTime; -@property (nonatomic, copy) NSDate *purchaseTime; -@property (nonatomic, copy) NSString *deeplink; +@property (nonatomic, copy) NSDate *purchaseTime; @property (nonatomic, strong) NSDictionary *attributionDetails; + @property (nonatomic, strong) NSDictionary *deeplinkParameters; @property (nonatomic, copy) ADJAttribution *attribution; @@ -35,19 +36,23 @@ - (ADJActivityPackage *)buildSessionPackage:(BOOL)isInDelay; -- (ADJActivityPackage *)buildAttributionPackage; - -- (ADJActivityPackage *)buildGdprPackage; - - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event isInDelay:(BOOL)isInDelay; +- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource; + - (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource; -- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource; +- (ADJActivityPackage *)buildAttributionPackage:(NSString *)initiatedBy; + +- (ADJActivityPackage *)buildGdprPackage; -+ (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key; ++ (void)parameters:(NSMutableDictionary *)parameters + setDictionary:(NSDictionary *)dictionary + forKey:(NSString *)key; -+ (void)parameters:(NSMutableDictionary *)parameters setString:(NSString *)value forKey:(NSString *)key; ++ (void)parameters:(NSMutableDictionary *)parameters + setString:(NSString *)value + forKey:(NSString *)key; @end diff --git a/ios/Adjust/ADJPackageBuilder.m b/ios/Adjust/ADJPackageBuilder.m index 8c2c45e3..6256eb51 100644 --- a/ios/Adjust/ADJPackageBuilder.m +++ b/ios/Adjust/ADJPackageBuilder.m @@ -1,9 +1,9 @@ // // ADJPackageBuilder.m -// Adjust +// Adjust SDK // -// Created by Christian Wellenbrock on 2013-07-03. -// Copyright (c) 2013 adjust GmbH. All rights reserved. +// Created by Christian Wellenbrock (@wellle) on 3rd July 2013. +// Copyright (c) 2013-2018 Adjust GmbH. All rights reserved. // #import "ADJUtil.h" @@ -38,7 +38,6 @@ - (id)initWithDeviceInfo:(ADJDeviceInfo *)deviceInfo sessionParameters:(ADJSessionParameters *)sessionParameters createdAt:(double)createdAt { self = [super init]; - if (self == nil) { return nil; } @@ -55,53 +54,18 @@ - (id)initWithDeviceInfo:(ADJDeviceInfo *)deviceInfo #pragma mark - Public methods - (ADJActivityPackage *)buildSessionPackage:(BOOL)isInDelay { - NSMutableDictionary *parameters; - parameters = [self attributableParameters:isInDelay]; - + NSMutableDictionary *parameters = [self getSessionParameters:isInDelay]; ADJActivityPackage *sessionPackage = [self defaultActivityPackage]; sessionPackage.path = @"/session"; sessionPackage.activityKind = ADJActivityKindSession; sessionPackage.suffix = @""; sessionPackage.parameters = parameters; - return sessionPackage; } - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event isInDelay:(BOOL)isInDelay { - NSMutableDictionary *parameters = [self defaultParameters]; - - [ADJPackageBuilder parameters:parameters setInt:self.activityState.eventCount forKey:@"event_count"]; - [ADJPackageBuilder parameters:parameters setNumber:event.revenue forKey:@"revenue"]; - [ADJPackageBuilder parameters:parameters setString:event.currency forKey:@"currency"]; - [ADJPackageBuilder parameters:parameters setString:event.eventToken forKey:@"event_token"]; - [ADJPackageBuilder parameters:parameters setString:event.callbackId forKey:@"event_callback_id"]; - - if (!isInDelay) { - NSDictionary *mergedCallbackParameters = [ADJUtil mergeParameters:self.sessionParameters.callbackParameters - source:event.callbackParameters - parameterName:@"Callback"]; - NSDictionary *mergedPartnerParameters = [ADJUtil mergeParameters:self.sessionParameters.partnerParameters - source:event.partnerParameters - parameterName:@"Partner"]; - - [ADJPackageBuilder parameters:parameters setDictionary:mergedCallbackParameters forKey:@"callback_params"]; - [ADJPackageBuilder parameters:parameters setDictionary:mergedPartnerParameters forKey:@"partner_params"]; - } - - if (event.emptyReceipt) { - NSString *emptyReceipt = @"empty"; - - [ADJPackageBuilder parameters:parameters setString:emptyReceipt forKey:@"receipt"]; - [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; - } - - else if (event.receipt != nil) { - NSString *receiptBase64 = [event.receipt adjEncodeBase64]; - [ADJPackageBuilder parameters:parameters setString:receiptBase64 forKey:@"receipt"]; - [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; - } - + NSMutableDictionary *parameters = [self getEventParameters:isInDelay forEventPackage:event]; ADJActivityPackage *eventPackage = [self defaultActivityPackage]; eventPackage.path = @"/event"; eventPackage.activityKind = ADJActivityKindEvent; @@ -116,205 +80,403 @@ - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event return eventPackage; } -- (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource; -{ - NSMutableDictionary *parameters = [self attributableParameters:NO]; - - [ADJPackageBuilder parameters:parameters setString:clickSource forKey:@"source"]; - [ADJPackageBuilder parameters:parameters setDictionary:self.deeplinkParameters forKey:@"params"]; - [ADJPackageBuilder parameters:parameters setDate:self.clickTime forKey:@"click_time"]; - [ADJPackageBuilder parameters:parameters setDate:self.purchaseTime forKey:@"purchase_time"]; - - if (self.attribution != nil) { - [ADJPackageBuilder parameters:parameters setString:self.attribution.trackerName forKey:@"tracker"]; - [ADJPackageBuilder parameters:parameters setString:self.attribution.campaign forKey:@"campaign"]; - [ADJPackageBuilder parameters:parameters setString:self.attribution.adgroup forKey:@"adgroup"]; - [ADJPackageBuilder parameters:parameters setString:self.attribution.creative forKey:@"creative"]; - } - - [ADJPackageBuilder parameters:parameters setDictionary:self.attributionDetails forKey:@"details"]; - [ADJPackageBuilder parameters:parameters setString:self.deeplink forKey:@"deeplink"]; - - ADJActivityPackage *clickPackage = [self defaultActivityPackage]; - clickPackage.path = @"/sdk_click"; - clickPackage.activityKind = ADJActivityKindClick; - clickPackage.suffix = @""; - clickPackage.parameters = parameters; - - return clickPackage; -} - - (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource { - NSMutableDictionary *parameters = [self idsParameters]; - - [ADJPackageBuilder parameters:parameters setString:infoSource forKey:@"source"]; - - [self injectPushToken:self.activityState intoParamters:parameters]; - + NSMutableDictionary *parameters = [self getInfoParameters:infoSource]; ADJActivityPackage *infoPackage = [self defaultActivityPackage]; infoPackage.path = @"/sdk_info"; infoPackage.activityKind = ADJActivityKindInfo; infoPackage.suffix = @""; infoPackage.parameters = parameters; - return infoPackage; } -- (ADJActivityPackage *)buildAttributionPackage { - NSMutableDictionary *parameters = [self idsParameters]; +- (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource { + NSMutableDictionary *parameters = [self getClickParameters:clickSource]; + ADJActivityPackage *clickPackage = [self defaultActivityPackage]; + clickPackage.path = @"/sdk_click"; + clickPackage.activityKind = ADJActivityKindClick; + clickPackage.suffix = @""; + clickPackage.parameters = parameters; + return clickPackage; +} +- (ADJActivityPackage *)buildAttributionPackage:(NSString *)initiatedBy { + NSMutableDictionary *parameters = [self getAttributionParameters:initiatedBy]; ADJActivityPackage *attributionPackage = [self defaultActivityPackage]; attributionPackage.path = @"/attribution"; attributionPackage.activityKind = ADJActivityKindAttribution; attributionPackage.suffix = @""; attributionPackage.parameters = parameters; - return attributionPackage; } - (ADJActivityPackage *)buildGdprPackage { - NSMutableDictionary *parameters = [self idsParameters]; - // [ADJPackageBuilder parameters:parameters setString:@"push" forKey:@"source"]; - + NSMutableDictionary *parameters = [self getGdprParameters]; ADJActivityPackage *gdprPackage = [self defaultActivityPackage]; gdprPackage.path = @"/gdpr_forget_device"; gdprPackage.activityKind = ADJActivityKindGdpr; gdprPackage.suffix = @""; gdprPackage.parameters = parameters; - return gdprPackage; } -#pragma mark - Private & helper methods - -- (ADJActivityPackage *)defaultActivityPackage { - ADJActivityPackage *activityPackage = [[ADJActivityPackage alloc] init]; - activityPackage.clientSdk = self.deviceInfo.clientSdk; ++ (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key { + if (dictionary == nil) { + return; + } + if (dictionary.count == 0) { + return; + } + if (dictionary.count == 0) { + return; + } - return activityPackage; + NSDictionary *convertedDictionary = [ADJUtil convertDictionaryValues:dictionary]; + [ADJPackageBuilder parameters:parameters setDictionaryJson:convertedDictionary forKey:key]; } -- (NSMutableDictionary *)idsParameters { - NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - - [self injectDeviceInfoIds:self.deviceInfo intoParameters:parameters]; - [self injectConfig:self.adjustConfig intoParameters:parameters]; - [self injectIosUuid:self.activityState intoParamters:parameters]; - [self injectCommonParameters:parameters]; - - return parameters; ++ (void)parameters:(NSMutableDictionary *)parameters setString:(NSString *)value forKey:(NSString *)key { + if (value == nil || [value isEqualToString:@""]) { + return; + } + [parameters setObject:value forKey:key]; } -- (NSMutableDictionary *)attributableParameters:(BOOL)isInDelay { - NSMutableDictionary *parameters = [self defaultParameters]; +#pragma mark - Private & helper methods + +- (NSMutableDictionary *)getSessionParameters:(BOOL)isInDelay { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; [ADJPackageBuilder parameters:parameters setString:[ADJUtil getUpdateTime] forKey:@"app_updated_at"]; - [ADJPackageBuilder parameters:parameters setString:[ADJUtil getInstallTime] forKey:@"installed_at"]; - [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setNumberInt:[ADJUtil readReachabilityFlags] forKey:@"connectivity_type"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.countryCode forKey:@"country"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.cpuSubtype forKey:@"cpu_type"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.defaultTracker forKey:@"default_tracker"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.fbAttributionId forKey:@"fb_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.machineModel forKey:@"hardware_name"]; + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getInstallTime] forKey:@"installed_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.languageCode forKey:@"language"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + [ADJPackageBuilder parameters:parameters setInt:self.deviceInfo.trackingEnabled forKey:@"tracking_enabled"]; + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.sessionCount forKey:@"session_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"]; + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } if (!isInDelay) { [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.callbackParameters forKey:@"callback_params"]; [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.partnerParameters forKey:@"partner_params"]; } +#if !TARGET_OS_TV + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMCC] forKey:@"mcc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMNC] forKey:@"mnc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readCurrentRadioAccessTechnology] forKey:@"network_type"]; +#endif + return parameters; } -- (NSMutableDictionary *)defaultParameters { +- (NSMutableDictionary *)getEventParameters:(BOOL)isInDelay forEventPackage:(ADJEvent *)event { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - [self injectDeviceInfo:self.deviceInfo intoParameters:parameters]; - [self injectConfig:self.adjustConfig intoParameters:parameters]; - [self injectActivityState:self.activityState intoParamters:parameters]; - [self injectCommonParameters:parameters]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setNumberInt:[ADJUtil readReachabilityFlags] forKey:@"connectivity_type"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.countryCode forKey:@"country"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.cpuSubtype forKey:@"cpu_type"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:event.currency forKey:@"currency"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:event.callbackId forKey:@"event_callback_id"]; + [ADJPackageBuilder parameters:parameters setString:event.eventToken forKey:@"event_token"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.fbAttributionId forKey:@"fb_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.machineModel forKey:@"hardware_name"]; + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.languageCode forKey:@"language"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setNumber:event.revenue forKey:@"revenue"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + [ADJPackageBuilder parameters:parameters setInt:self.deviceInfo.trackingEnabled forKey:@"tracking_enabled"]; + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setInt:self.activityState.eventCount forKey:@"event_count"]; + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.sessionCount forKey:@"session_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"]; + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + + if (!isInDelay) { + NSDictionary *mergedCallbackParameters = [ADJUtil mergeParameters:self.sessionParameters.callbackParameters + source:event.callbackParameters + parameterName:@"Callback"]; + NSDictionary *mergedPartnerParameters = [ADJUtil mergeParameters:self.sessionParameters.partnerParameters + source:event.partnerParameters + parameterName:@"Partner"]; + + [ADJPackageBuilder parameters:parameters setDictionary:mergedCallbackParameters forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDictionary:mergedPartnerParameters forKey:@"partner_params"]; + } + + if (event.emptyReceipt) { + NSString *emptyReceipt = @"empty"; + [ADJPackageBuilder parameters:parameters setString:emptyReceipt forKey:@"receipt"]; + [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; + } else if (event.receipt != nil) { + NSString *receiptBase64 = [event.receipt adjEncodeBase64]; + [ADJPackageBuilder parameters:parameters setString:receiptBase64 forKey:@"receipt"]; + [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; + } + +#if !TARGET_OS_TV + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMCC] forKey:@"mcc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMNC] forKey:@"mnc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readCurrentRadioAccessTechnology] forKey:@"network_type"]; +#endif return parameters; } -- (void)injectCommonParameters:(NSMutableDictionary *)parameters { - [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; +- (NSMutableDictionary *)getInfoParameters:(NSString *)source { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; -} + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + [ADJPackageBuilder parameters:parameters setString:source forKey:@"source"]; -- (void)injectDeviceInfoIds:(ADJDeviceInfo *)deviceInfo intoParameters:(NSMutableDictionary *)parameters { - [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.vendorId forKey:@"idfv"]; + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + + return parameters; } -- (void)injectDeviceInfo:(ADJDeviceInfo *)deviceInfo intoParameters:(NSMutableDictionary *)parameters { - [self injectDeviceInfoIds:deviceInfo intoParameters:parameters]; - - [ADJPackageBuilder parameters:parameters setString:deviceInfo.fbAttributionId forKey:@"fb_id"]; - [ADJPackageBuilder parameters:parameters setInt:deviceInfo.trackingEnabled forKey:@"tracking_enabled"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.bundeIdentifier forKey:@"bundle_id"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.bundleVersion forKey:@"app_version"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.bundleShortVersion forKey:@"app_version_short"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.deviceType forKey:@"device_type"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.deviceName forKey:@"device_name"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.osName forKey:@"os_name"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.systemVersion forKey:@"os_version"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.languageCode forKey:@"language"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.countryCode forKey:@"country"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.machineModel forKey:@"hardware_name"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.cpuSubtype forKey:@"cpu_type"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.osBuild forKey:@"os_build"]; +- (NSMutableDictionary *)getClickParameters:(NSString *)source { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getUpdateTime] forKey:@"app_updated_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.callbackParameters forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.clickTime forKey:@"click_time"]; [ADJPackageBuilder parameters:parameters setNumberInt:[ADJUtil readReachabilityFlags] forKey:@"connectivity_type"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.countryCode forKey:@"country"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.cpuSubtype forKey:@"cpu_type"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deeplink forKey:@"deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.defaultTracker forKey:@"default_tracker"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.attributionDetails forKey:@"details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.fbAttributionId forKey:@"fb_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.machineModel forKey:@"hardware_name"]; + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getInstallTime] forKey:@"installed_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.languageCode forKey:@"language"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.deeplinkParameters forKey:@"params"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.partnerParameters forKey:@"partner_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.purchaseTime forKey:@"purchase_time"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + [ADJPackageBuilder parameters:parameters setString:source forKey:@"source"]; + [ADJPackageBuilder parameters:parameters setInt:self.deviceInfo.trackingEnabled forKey:@"tracking_enabled"]; + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.sessionCount forKey:@"session_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"]; + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + + if (self.attribution != nil) { + [ADJPackageBuilder parameters:parameters setString:self.attribution.adgroup forKey:@"adgroup"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.campaign forKey:@"campaign"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.creative forKey:@"creative"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.trackerName forKey:@"tracker"]; + } + #if !TARGET_OS_TV [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMCC] forKey:@"mcc"]; [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMNC] forKey:@"mnc"]; [ADJPackageBuilder parameters:parameters setString:[ADJUtil readCurrentRadioAccessTechnology] forKey:@"network_type"]; #endif -} -- (void)injectConfig:(ADJConfig *)adjustConfig intoParameters:(NSMutableDictionary *) parameters { - [ADJPackageBuilder parameters:parameters setString:adjustConfig.appToken forKey:@"app_token"]; - [ADJPackageBuilder parameters:parameters setString:adjustConfig.environment forKey:@"environment"]; - [ADJPackageBuilder parameters:parameters setBool:adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; - if (adjustConfig.isDeviceKnown) { - [ADJPackageBuilder parameters:parameters setBool:adjustConfig.isDeviceKnown forKey:@"device_known"]; - } - [ADJPackageBuilder parameters:parameters setString:adjustConfig.secretId forKey:@"secret_id"]; - [ADJPackageBuilder parameters:parameters setString:adjustConfig.appSecret forKey:@"app_secret"]; + return parameters; } -- (void)injectActivityState:(ADJActivityState *)activityState intoParamters:(NSMutableDictionary *)parameters { - if (activityState == nil) { - return; +- (NSMutableDictionary *)getAttributionParameters:(NSString *)initiatedBy { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setString:initiatedBy forKey:@"initiated_by"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; } - [self injectIosUuid:activityState intoParamters:parameters]; - [self injectPushToken:activityState intoParamters:parameters]; + if (self.activityState != nil) { + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } - [ADJPackageBuilder parameters:parameters setInt:activityState.sessionCount forKey:@"session_count"]; - [ADJPackageBuilder parameters:parameters setInt:activityState.subsessionCount forKey:@"subsession_count"]; - [ADJPackageBuilder parameters:parameters setDuration:activityState.sessionLength forKey:@"session_length"]; - [ADJPackageBuilder parameters:parameters setDuration:activityState.timeSpent forKey:@"time_spent"]; + return parameters; } -- (void)injectIosUuid:(ADJActivityState *)activityState intoParamters:(NSMutableDictionary *)parameters { - if (activityState == nil) { - return; - } +- (NSMutableDictionary *)getGdprParameters { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - // Check if UUID was persisted or not. - // If yes, assign it to persistent_ios_uuid parameter. - // If not, assign it to ios_uuid parameter. - if (activityState.isPersisted) { - [ADJPackageBuilder parameters:parameters setString:activityState.uuid forKey:@"persistent_ios_uuid"]; - } else { - [ADJPackageBuilder parameters:parameters setString:activityState.uuid forKey:@"ios_uuid"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; } -} -- (void)injectPushToken:(ADJActivityState *)activityState intoParamters:(NSMutableDictionary *)parameters { - if (activityState == nil) { - return; + if (self.activityState != nil) { + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } } - [ADJPackageBuilder parameters:parameters setString:activityState.deviceToken forKey:@"push_token"]; + return parameters; +} + +- (ADJActivityPackage *)defaultActivityPackage { + ADJActivityPackage *activityPackage = [[ADJActivityPackage alloc] init]; + activityPackage.clientSdk = self.deviceInfo.clientSdk; + return activityPackage; } - (NSString *)eventSuffix:(ADJEvent *)event { @@ -325,19 +487,11 @@ - (NSString *)eventSuffix:(ADJEvent *)event { } } -+ (void)parameters:(NSMutableDictionary *)parameters setString:(NSString *)value forKey:(NSString *)key { - if (value == nil || [value isEqualToString:@""]) return; - - [parameters setObject:value forKey:key]; -} - + (void)parameters:(NSMutableDictionary *)parameters setInt:(int)value forKey:(NSString *)key { if (value < 0) { return; } - NSString *valueString = [NSString stringWithFormat:@"%d", value]; - [ADJPackageBuilder parameters:parameters setString:valueString forKey:key]; } @@ -345,9 +499,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setDate1970:(double)value f if (value < 0) { return; } - NSString *dateString = [ADJUtil formatSeconds1970:value]; - [ADJPackageBuilder parameters:parameters setString:dateString forKey:key]; } @@ -355,9 +507,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setDate:(NSDate *)value for if (value == nil) { return; } - NSString *dateString = [ADJUtil formatDate:value]; - [ADJPackageBuilder parameters:parameters setString:dateString forKey:key]; } @@ -365,9 +515,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setDuration:(double)value f if (value < 0) { return; } - int intValue = round(value); - [ADJPackageBuilder parameters:parameters setInt:intValue forKey:key]; } @@ -375,42 +523,20 @@ + (void)parameters:(NSMutableDictionary *)parameters setDictionaryJson:(NSDictio if (dictionary == nil) { return; } - if (dictionary.count == 0) { return; } - if (![NSJSONSerialization isValidJSONObject:dictionary]) { return; } NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; NSString *dictionaryString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - [ADJPackageBuilder parameters:parameters setString:dictionaryString forKey:key]; } -+ (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key { - if (dictionary == nil) { - return; - } - - if (dictionary.count == 0) { - return; - } - - if (dictionary.count == 0) { - return; - } - - NSDictionary *convertedDictionary = [ADJUtil convertDictionaryValues:dictionary]; - - [ADJPackageBuilder parameters:parameters setDictionaryJson:convertedDictionary forKey:key]; -} - + (void)parameters:(NSMutableDictionary *)parameters setBool:(BOOL)value forKey:(NSString *)key { int valueInt = [[NSNumber numberWithBool:value] intValue]; - [ADJPackageBuilder parameters:parameters setInt:valueInt forKey:key]; } @@ -418,9 +544,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setNumber:(NSNumber *)value if (value == nil) { return; } - NSString *numberString = [NSString stringWithFormat:@"%.5f", [value doubleValue]]; - [ADJPackageBuilder parameters:parameters setString:numberString forKey:key]; } @@ -428,7 +552,6 @@ + (void)parameters:(NSMutableDictionary *)parameters setNumberInt:(NSNumber *)va if (value == nil) { return; } - [ADJPackageBuilder parameters:parameters setInt:[value intValue] forKey:key]; } diff --git a/ios/Adjust/ADJReachability.h b/ios/Adjust/ADJReachability.h index b704957a..92f96a07 100644 --- a/ios/Adjust/ADJReachability.h +++ b/ios/Adjust/ADJReachability.h @@ -17,12 +17,6 @@ typedef enum : NSInteger { ADJReachableViaWWAN } ADJNetworkStatus; -#pragma mark IPv6 Support -//Reachability fully support IPv6. For full details, see ReadMe.md. - - -extern NSString *kADJReachabilityChangedNotification; - @interface ADJReachability : NSObject diff --git a/ios/Adjust/ADJReachability.m b/ios/Adjust/ADJReachability.m index 75e8e166..1c2a029a 100644 --- a/ios/Adjust/ADJReachability.m +++ b/ios/Adjust/ADJReachability.m @@ -15,10 +15,6 @@ #import "ADJReachability.h" -#pragma mark IPv6 Support - -NSString *kADJReachabilityChangedNotification = @"kNetworkReachabilityChangedNotification"; - #pragma mark - Supporting functions #define kShouldPrintReachabilityFlags 1 @@ -43,19 +39,6 @@ static void PrintReachabilityFlags(SCNetworkReachabilityFlags flags, const char* #endif } - -static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) -{ -#pragma unused (target, flags) - NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback"); - NSCAssert([(__bridge NSObject*) info isKindOfClass: [ADJReachability class]], @"info was wrong class in ReachabilityCallback"); - - ADJReachability* noteObject = (__bridge ADJReachability *)info; - // Post a notification to notify the client that the network reachability changed. - [[NSNotificationCenter defaultCenter] postNotificationName: kADJReachabilityChangedNotification object: noteObject]; -} - - #pragma mark - Reachability implementation @implementation ADJReachability @@ -121,7 +104,7 @@ - (BOOL)startNotifier BOOL returnValue = NO; SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; - if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) + if (SCNetworkReachabilitySetCallback(_reachabilityRef, NULL, &context)) { if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) { diff --git a/ios/Adjust/ADJUtil.h b/ios/Adjust/ADJUtil.h index 784e86f7..dc5082c0 100644 --- a/ios/Adjust/ADJUtil.h +++ b/ios/Adjust/ADJUtil.h @@ -112,6 +112,10 @@ typedef void (^isInactiveInjected)(BOOL); + (NSNumber *)readReachabilityFlags; ++ (BOOL)isDeeplinkValid:(NSURL *)url; + ++ (NSString *)sdkVersion; + #if !TARGET_OS_TV + (NSString *)readMCC; diff --git a/ios/Adjust/ADJUtil.m b/ios/Adjust/ADJUtil.m index 00a58f80..89b7c3c1 100644 --- a/ios/Adjust/ADJUtil.m +++ b/ios/Adjust/ADJUtil.m @@ -32,6 +32,7 @@ static NSNumberFormatter *secondsNumberFormatter = nil; static NSRegularExpression *optionalRedirectRegex = nil; static NSRegularExpression *shortUniversalLinkRegex = nil; +static NSRegularExpression *excludedDeeplinkRegex = nil; static NSURLSessionConfiguration *urlSessionConfiguration = nil; #if !TARGET_OS_TV @@ -39,13 +40,14 @@ static CTTelephonyNetworkInfo *networkInfo = nil; #endif -static NSString * const kClientSdk = @"ios4.15.0"; +static NSString * const kClientSdk = @"ios4.17.1"; static NSString * const kDeeplinkParam = @"deep_link="; static NSString * const kSchemeDelimiter = @"://"; static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; static NSString * const kUniversalLinkPattern = @"https://[^.]*\\.ulink\\.adjust\\.com/ulink/?(.*)"; static NSString * const kOptionalRedirectPattern = @"adjust_redirect=[^&#]*"; static NSString * const kShortUniversalLinkPattern = @"http[s]?://[a-z0-9]{4}\\.adj\\.st/?(.*)"; +static NSString * const kExcludedDeeplinksPattern = @"^(fb|vk)[0-9]{5,}[^:]*://authorize.*access_token=.*"; static NSString * const kDateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z"; @implementation ADJUtil @@ -59,6 +61,7 @@ + (void)initialize { [self initializeSecondsNumberFormatter]; [self initializeShortUniversalLinkRegex]; [self initializeOptionalRedirectRegex]; + [self initializeExcludedDeeplinkRegex]; [self initializeUrlSessionConfiguration]; [self initializeReachability]; #if !TARGET_OS_TV @@ -116,6 +119,18 @@ + (void)initializeOptionalRedirectRegex { optionalRedirectRegex = regex; } ++ (void)initializeExcludedDeeplinkRegex { + NSError *error = NULL; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:kExcludedDeeplinksPattern + options:NSRegularExpressionCaseInsensitive + error:&error]; + if ([ADJUtil isNotNull:error]) { + [ADJAdjustFactory.logger error:@"Excluded deep link regex rule error (%@)", [error description]]; + return; + } + excludedDeeplinkRegex = regex; +} + + (void)initializeSecondsNumberFormatter { secondsNumberFormatter = [[NSNumberFormatter alloc] init]; [secondsNumberFormatter setPositiveFormat:@"0.0"]; @@ -1264,6 +1279,34 @@ + (NSNumber *)readReachabilityFlags { return [reachability currentReachabilityFlags]; } ++ (BOOL)isDeeplinkValid:(NSURL *)url { + if (url == nil) { + return NO; + } + if ([[url absoluteString] length] == 0) { + return NO; + } + if (excludedDeeplinkRegex == nil) { + [ADJAdjustFactory.logger error:@"Excluded deep link regex not correctly configured"]; + return NO; + } + + NSString *urlString = [url absoluteString]; + NSArray *matches = [excludedDeeplinkRegex matchesInString:urlString + options:0 + range:NSMakeRange(0, [urlString length])]; + if ([matches count] > 0) { + [ADJAdjustFactory.logger debug:@"Deep link (%@) processing skipped", urlString]; + return NO; + } + + return YES; +} + ++ (NSString *)sdkVersion { + return kClientSdk; +} + #if !TARGET_OS_TV + (NSString *)readMCC { if (carrier == nil) { diff --git a/ios/Adjust/Adjust.h b/ios/Adjust/Adjust.h index b7b20046..0454255a 100644 --- a/ios/Adjust/Adjust.h +++ b/ios/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust // -// V4.15.0 +// V4.17.1 // Created by Christian Wellenbrock (wellle) on 23rd July 2013. // Copyright © 2012-2017 Adjust GmbH. All rights reserved. // @@ -152,6 +152,13 @@ extern NSString * __nonnull const ADJEnvironmentProduction; */ + (nullable ADJAttribution *)attribution; +/** + * @brief Get current Adjust SDK version string. + * + * @return Adjust SDK version string (iosX.Y.Z). + */ ++ (nullable NSString *)sdkVersion; + /** * @brief Convert a universal link style URL to a deeplink style URL with the corresponding scheme. * @@ -271,6 +278,8 @@ extern NSString * __nonnull const ADJEnvironmentProduction; - (nullable NSString *)idfa; +- (nullable NSString *)sdkVersion; + - (nullable ADJAttribution *)attribution; - (nullable NSURL *)convertUniversalLink:(nonnull NSURL *)url scheme:(nonnull NSString *)scheme; diff --git a/ios/Adjust/Adjust.m b/ios/Adjust/Adjust.m index a1869bfa..3bdd8700 100644 --- a/ios/Adjust/Adjust.m +++ b/ios/Adjust/Adjust.m @@ -114,6 +114,10 @@ + (NSString *)idfa { return [[Adjust getInstance] idfa]; } ++ (NSString *)sdkVersion { + return [[Adjust getInstance] sdkVersion]; +} + + (NSURL *)convertUniversalLink:(NSURL *)url scheme:(NSString *)scheme { return [[Adjust getInstance] convertUniversalLink:url scheme:scheme]; } @@ -398,6 +402,10 @@ - (NSString *)adid { return [self.activityHandler adid]; } +- (NSString *)sdkVersion { + return [ADJUtil sdkVersion]; +} + - (void)teardown { if (self.activityHandler == nil) { [self.logger error:@"Adjust already down or not initialized"]; diff --git a/ios/AdjustSdk.m b/ios/AdjustSdk.m index d2558c7f..58b1a4e3 100644 --- a/ios/AdjustSdk.m +++ b/ios/AdjustSdk.m @@ -287,6 +287,15 @@ @implementation AdjustSdk } } +RCT_EXPORT_METHOD(getSdkVersion:(NSString *)sdkPrefix callback:(RCTResponseSenderBlock)callback) { + NSString *sdkVersion = [Adjust sdkVersion]; + if (nil == sdkVersion) { + callback(@[@""]); + } else { + callback(@[[NSString stringWithFormat:@"%@@%@", sdkPrefix, sdkVersion]]); + } +} + RCT_EXPORT_METHOD(setReferrer:(NSString *)referrer) {} RCT_EXPORT_METHOD(getAttribution:(RCTResponseSenderBlock)callback) { diff --git a/package.json b/package.json index 886d7478..facf26a0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "react-native-adjust", "description": "Adjust React Native SDK", - "version": "4.15.0", + "version": "4.17.0", "main": "index.js", "author": "adjust GmbH", "license": "MIT", diff --git a/react-native-adjust.podspec b/react-native-adjust.podspec index 27d9db9e..ff005e90 100644 --- a/react-native-adjust.podspec +++ b/react-native-adjust.podspec @@ -18,6 +18,6 @@ Pod::Spec.new do |s| s.preserve_paths = 'LICENSE', 'README.md', 'package.json', 'index.js' s.source_files = 'ios/*.{h,m}' - s.dependency 'Adjust', '~> 4.15.0' + s.dependency 'Adjust', '~> 4.17.1' s.dependency 'React' end diff --git a/scripts/build_sdk.py b/scripts/build_sdk.py old mode 100644 new mode 100755 index ef11fd2b..d3aef17c --- a/scripts/build_sdk.py +++ b/scripts/build_sdk.py @@ -1,3 +1,5 @@ +#!/usr/bin/python + import os, sys from scripting_utils import * import build_sdk_android as android diff --git a/scripts/build_sdk_android.py b/scripts/build_sdk_android.py index a14b0dcb..8b2b56ed 100644 --- a/scripts/build_sdk_android.py +++ b/scripts/build_sdk_android.py @@ -14,20 +14,24 @@ def build(root_dir, android_submodule_dir, with_test_lib, is_release = True): # ------------------------------------------------------------------ # Running make*Jar Gradle task ... if is_release: - debug_green('Running makeReleaseJar Gradle task ...') - jar_in_dir = '{0}/adjust/build/intermediates/intermediate-jars/release'.format(build_dir) - subprocess.call(['./gradlew', 'makeReleaseJar']) + debug_green('Running adjustSdkNonNativeJarRelease Gradle task ...') + jar_in_dir = '{0}/sdk-core/build/libs'.format(build_dir) + subprocess.call(['./gradlew', 'adjustSdkNonNativeJarRelease']) else: - debug_green('Running makeDebugJar Gradle task ...') - jar_in_dir = '{0}/adjust/build/intermediates/intermediate-jars/debug'.format(build_dir) - subprocess.call(['./gradlew', 'makeDebugJar']) + debug_green('Running adjustSdkNonNativeJarDebug Gradle task ...') + jar_in_dir = '{0}/sdk-core/build/libs'.format(build_dir) + subprocess.call(['./gradlew', 'adjustSdkNonNativeJarDebug']) # ------------------------------------------------------------------ # Moving Android SDK JAR from jarIn to jarOut dir debug_green('Moving Android SDK JAR from {0} to {1} dir ...'.format(jar_in_dir, jar_out_dir)) clear_dir(jar_out_dir) - copy_files('classes.jar', jar_in_dir, jar_out_dir) - rename_file('classes.jar', 'adjust-android.jar', jar_out_dir) + if is_release: + copy_files('adjust-sdk-release.jar', jar_in_dir, jar_out_dir) + rename_file('adjust-sdk-release.jar', 'adjust-android.jar', jar_out_dir) + else: + copy_files('adjust-sdk-debug.jar', jar_in_dir, jar_out_dir) + rename_file('adjust-sdk-debug.jar', 'adjust-android.jar', jar_out_dir) if with_test_lib: # ------------------------------------------------------------------ @@ -35,20 +39,20 @@ def build(root_dir, android_submodule_dir, with_test_lib, is_release = True): set_log_tag('ANROID-TEST-LIB-BUILD') waiting_animation(duration=4.0, step=0.025) debug_green('Building Test Library started ...') - test_jar_in_dir = '{0}/testlibrary/build/outputs'.format(build_dir) + test_jar_in_dir = '{0}/test-library/build/libs'.format(build_dir) test_jar_out_dir = '{0}/test/lib/android/libs'.format(root_dir) if not os.path.exists(test_jar_out_dir): os.makedirs(test_jar_out_dir) # ------------------------------------------------------------------ - # Running Gradle tasks: clean testlibrary:makeJar ... - debug_green('Running Gradle tasks: clean testlibrary:makeJar ...') + # Running Gradle tasks: clean test-library:adjustMakeJarDebug. + debug_green('Running Gradle tasks: clean test-library:adjustMakeJarDebug ...') os.chdir(build_dir) - subprocess.call(['./gradlew', 'clean', ':testlibrary:makeJar']) + subprocess.call(['./gradlew', 'clean', ':test-library:adjustMakeJarDebug']) # ------------------------------------------------------------------ # Moving the generated Android SDK JAR from jar in to jar out dir ... debug_green('Moving the generated Android SDK JAR from {0} to {1} dir ...'.format(test_jar_in_dir, test_jar_out_dir)) - copy_files('*.jar', test_jar_in_dir, test_jar_out_dir) - rename_file('*.jar', 'adjust-testing.jar', test_jar_out_dir) + copy_files('test-library-debug.jar', test_jar_in_dir, test_jar_out_dir) + rename_file('test-library-debug.jar', 'adjust-test.jar', test_jar_out_dir) diff --git a/scripts/build_sdk_ios.py b/scripts/build_sdk_ios.py index 9ea4eac7..d32bd432 100644 --- a/scripts/build_sdk_ios.py +++ b/scripts/build_sdk_ios.py @@ -4,8 +4,8 @@ def build(root_dir, ios_submodule_dir, with_test_lib): # ------------------------------------------------------------------ # paths - src_dir = '{0}/sdk/Adjust'.format(ios_submodule_dir) - src_out_dir = '{0}/ios/Adjust'.format(root_dir) + src_dir = '{0}/sdk/Adjust'.format(ios_submodule_dir) + src_out_dir = '{0}/ios/Adjust'.format(root_dir) # ------------------------------------------------------------------ # Copying iOS SDK source files from src in dir to src out dir ... @@ -17,7 +17,6 @@ def build(root_dir, ios_submodule_dir, with_test_lib): # Test Library paths set_log_tag('IOS-TEST-LIB-BUILD') debug_green('Building Test Library started ...') - waiting_animation(duration=1.5, step=0.025) test_lib_in_dir = '{0}/sdk/AdjustTests/AdjustTestLibrary/AdjustTestLibrary/'.format(ios_submodule_dir) test_lib_out_dir = '{0}/test/lib/ios/AdjustTestLibrary/'.format(root_dir) diff --git a/scripts/run.py b/scripts/run.py old mode 100644 new mode 100755 index 8687c6a0..5cff9aad --- a/scripts/run.py +++ b/scripts/run.py @@ -1,3 +1,5 @@ +#!/usr/bin/python + import os, sys from scripting_utils import * import run_android as android diff --git a/scripts/run_android.py b/scripts/run_android.py index 2bcd17ae..51948c20 100644 --- a/scripts/run_android.py +++ b/scripts/run_android.py @@ -67,8 +67,8 @@ def run_example(_root_dir, _sdk_plugin_name, skip_uninstall): __copy_rn_content_to_temp() # ------------------------------------------------------------------ - # Adding react-native-adjust to test app - debug_green('Adding react-native-adjust to test app ...') + # Adding react-native-adjust to example app + debug_green('Adding react-native-adjust to example app ...') os.chdir(example_app_dir) subprocess.call(['yarn', 'add', '../temp']) @@ -83,8 +83,8 @@ def run_example(_root_dir, _sdk_plugin_name, skip_uninstall): remove_dir_if_exists(temp_dir) # ------------------------------------------------------------------ - # Building and running test app on device/emulator - debug_green('Building and running test app on device/emulator ...') + # Building and running example app on device/emulator + debug_green('Building and running example app on device/emulator ...') subprocess.call(['react-native', 'run-android']) def run_testapp(_root_dir, _sdk_plugin_name, _test_plugin_name, skip_uninstall): diff --git a/test/app/App.js b/test/app/App.js index 18de8f3c..d989edb0 100644 --- a/test/app/App.js +++ b/test/app/App.js @@ -44,16 +44,18 @@ var baseUrl = ""; var gdprUrl = ""; if (Platform.OS === "android") { - baseUrl = "https://10.0.2.2:8443"; - gdprUrl = "https://10.0.2.2:8443"; + baseUrl = "https://192.168.8.197:8443"; + gdprUrl = "https://192.168.8.197:8443"; } else if (Platform.OS === "ios") { - baseUrl = "http://127.0.0.1:8080"; - gdprUrl = "http://127.0.0.1:8080"; + baseUrl = "http://192.168.8.197:8080"; + gdprUrl = "http://192.168.8.197:8080"; } // AdjustSdkTest.addTestDirectory("current/appSecret/"); // AdjustSdkTest.addTest("current/event/Test_Event_EventToken_Malformed"); - AdjustSdkTest.startTestSession(baseUrl); + Adjust.getSdkVersion(function(sdkVersion) { + AdjustSdkTest.startTestSession(baseUrl, sdkVersion); + }); const commandExecutor = new CommandExecutor(baseUrl, gdprUrl); emitterSubscription = AdjustSdkTestEmitter.addListener('command', (json) => { @@ -61,7 +63,6 @@ const functionName = json["functionName"]; const params = json["params"]; const order = json["order"]; - commandExecutor.scheduleCommand(className, functionName, params, order); }); } diff --git a/test/app/android/app/build.gradle b/test/app/android/app/build.gradle index 1a467af7..ef3f4f25 100644 --- a/test/app/android/app/build.gradle +++ b/test/app/android/app/build.gradle @@ -94,13 +94,13 @@ def enableSeparateBuildPerCPUArchitecture = false def enableProguardInReleaseBuilds = false android { - compileSdkVersion 26 - buildToolsVersion "26.0.3" + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.adjust.testapp" - minSdkVersion 16 - targetSdkVersion 26 + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" ndk { @@ -139,10 +139,15 @@ android { dependencies { compile project(':react-native-adjust-test') compile project(':react-native-adjust') - compile fileTree(dir: "libs", include: ["*.jar"]) - compile "com.android.support:appcompat-v7:26+" - compile "com.facebook.react:react-native:+" // From node_modules - compile "com.google.code.gson:gson:+" + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" + implementation "com.facebook.react:react-native:+" // From node_modules + implementation "com.google.code.gson:gson:+" + + implementation project(':react-native-adjust') + implementation project(':react-native-adjust-test') + implementation 'com.android.installreferrer:installreferrer:1.0' + implementation 'com.google.android.gms:play-services-analytics:16.0.4' } // Run this once to be able to run the application with BUCK diff --git a/test/app/android/build.gradle b/test/app/android/build.gradle index eed9972b..5cc44d62 100644 --- a/test/app/android/build.gradle +++ b/test/app/android/build.gradle @@ -1,11 +1,19 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext { + buildToolsVersion = "27.0.3" + minSdkVersion = 17 + compileSdkVersion = 27 + targetSdkVersion = 27 + supportLibVersion = "27.1.1" + } repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:3.1.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,6 +23,7 @@ buildscript { allprojects { repositories { mavenLocal() + google() jcenter() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm @@ -22,3 +31,9 @@ allprojects { } } } + + +task wrapper(type: Wrapper) { + gradleVersion = '4.4' + distributionUrl = distributionUrl.replace("bin", "all") +} diff --git a/test/app/android/settings.gradle b/test/app/android/settings.gradle index 6cd25a28..ac93dd15 100644 --- a/test/app/android/settings.gradle +++ b/test/app/android/settings.gradle @@ -3,5 +3,9 @@ include ':react-native-adjust-test' project(':react-native-adjust-test').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-adjust-test/android') include ':react-native-adjust' project(':react-native-adjust').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-adjust/android') +include ':react-native-adjust-test' +project(':react-native-adjust-test').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-adjust-test/android') +include ':react-native-adjust' +project(':react-native-adjust').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-adjust/android') include ':app' diff --git a/test/app/command_executor.js b/test/app/command_executor.js index 36e49761..800ac2c8 100644 --- a/test/app/command_executor.js +++ b/test/app/command_executor.js @@ -592,8 +592,7 @@ AdjustCommandExecutor.prototype.sendReferrer = function(params) { Adjust.setReferrer(referrer); }; -//Util -//====================== +// Util function getValueFromKey(params, key) { if (key in params) { return params[key]; @@ -613,5 +612,3 @@ function getFirstParameterValue(params, key) { return null; } - -//export default CommandExecutor; diff --git a/test/app/ios/AdjustTest.xcodeproj/project.pbxproj b/test/app/ios/AdjustTest.xcodeproj/project.pbxproj index c2f6ea45..62929e42 100644 --- a/test/app/ios/AdjustTest.xcodeproj/project.pbxproj +++ b/test/app/ios/AdjustTest.xcodeproj/project.pbxproj @@ -22,7 +22,6 @@ 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 1DFDCFF885CC4661AE49DEE4 /* libAdjustSdkTest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8360D660BD7D432C96ED3224 /* libAdjustSdkTest.a */; }; 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; @@ -36,10 +35,11 @@ 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; }; 2DCD954D1E0B4F2C00145EB5 /* AdjustTestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* AdjustTestTests.m */; }; 2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; - 3AD726364B1A450CB625DBA4 /* libAdjustSdk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E641C178EE5F43FF958D5361 /* libAdjustSdk.a */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + 8C0C8C47992B4F37B88374A4 /* libAdjustSdk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7D1815C9754C6883D97170 /* libAdjustSdk.a */; }; ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; + DFBC516EF1BC484695B2813F /* libAdjustSdkTest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B1622E97767541AD9D5C19AA /* libAdjustSdkTest.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -309,16 +309,16 @@ remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteInfo = RCTText; }; - 9DA4EE78216790C100B1A04D /* PBXContainerItemProxy */ = { + 9DEC33EE21C13E9400937C4D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 76D6CFB5851641779C048285 /* AdjustSdk.xcodeproj */; + containerPortal = E1B43F76C77B45C2B97B29BC /* AdjustSdk.xcodeproj */; proxyType = 2; remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = AdjustSdk; }; - 9DA4EE7B216790C100B1A04D /* PBXContainerItemProxy */ = { + 9DEC33F121C13E9400937C4D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D8AFDE86F1E24AC8A137E2A1 /* AdjustSdkTest.xcodeproj */; + containerPortal = 47BF8CED53724E80B52CA5DC /* AdjustSdkTest.xcodeproj */; proxyType = 2; remoteGlobalIDString = 9D13E90120CE887F00B58F3A; remoteInfo = AdjustSdkTest; @@ -355,14 +355,14 @@ 2D02E47B1E0B4A5D006451C7 /* AdjustTest-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AdjustTest-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* AdjustTest-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AdjustTest-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 47BF8CED53724E80B52CA5DC /* AdjustSdkTest.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = AdjustSdkTest.xcodeproj; path = "../node_modules/react-native-adjust-test/ios/AdjustSdkTest.xcodeproj"; sourceTree = ""; }; 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; - 76D6CFB5851641779C048285 /* AdjustSdk.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = AdjustSdk.xcodeproj; path = "../node_modules/react-native-adjust/ios/AdjustSdk.xcodeproj"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - 8360D660BD7D432C96ED3224 /* libAdjustSdkTest.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libAdjustSdkTest.a; sourceTree = ""; }; ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; - D8AFDE86F1E24AC8A137E2A1 /* AdjustSdkTest.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = AdjustSdkTest.xcodeproj; path = "../node_modules/react-native-adjust-test/ios/AdjustSdkTest.xcodeproj"; sourceTree = ""; }; - E641C178EE5F43FF958D5361 /* libAdjustSdk.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libAdjustSdk.a; sourceTree = ""; }; + B1622E97767541AD9D5C19AA /* libAdjustSdkTest.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libAdjustSdkTest.a; sourceTree = ""; }; + E1B43F76C77B45C2B97B29BC /* AdjustSdk.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = AdjustSdk.xcodeproj; path = "../node_modules/react-native-adjust/ios/AdjustSdk.xcodeproj"; sourceTree = ""; }; + ED7D1815C9754C6883D97170 /* libAdjustSdk.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libAdjustSdk.a; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -391,8 +391,8 @@ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - 3AD726364B1A450CB625DBA4 /* libAdjustSdk.a in Frameworks */, - 1DFDCFF885CC4661AE49DEE4 /* libAdjustSdkTest.a in Frameworks */, + 8C0C8C47992B4F37B88374A4 /* libAdjustSdk.a in Frameworks */, + DFBC516EF1BC484695B2813F /* libAdjustSdkTest.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -579,8 +579,8 @@ 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - 76D6CFB5851641779C048285 /* AdjustSdk.xcodeproj */, - D8AFDE86F1E24AC8A137E2A1 /* AdjustSdkTest.xcodeproj */, + E1B43F76C77B45C2B97B29BC /* AdjustSdk.xcodeproj */, + 47BF8CED53724E80B52CA5DC /* AdjustSdkTest.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -623,24 +623,24 @@ 9D13E7DF20CE7B2300B58F3A /* Recovered References */ = { isa = PBXGroup; children = ( - E641C178EE5F43FF958D5361 /* libAdjustSdk.a */, - 8360D660BD7D432C96ED3224 /* libAdjustSdkTest.a */, + ED7D1815C9754C6883D97170 /* libAdjustSdk.a */, + B1622E97767541AD9D5C19AA /* libAdjustSdkTest.a */, ); name = "Recovered References"; sourceTree = ""; }; - 9DA4EE73216790C000B1A04D /* Products */ = { + 9DEC33E921C13E9400937C4D /* Products */ = { isa = PBXGroup; children = ( - 9DA4EE79216790C100B1A04D /* libAdjustSdk.a */, + 9DEC33EF21C13E9400937C4D /* libAdjustSdk.a */, ); name = Products; sourceTree = ""; }; - 9DA4EE75216790C000B1A04D /* Products */ = { + 9DEC33EB21C13E9400937C4D /* Products */ = { isa = PBXGroup; children = ( - 9DA4EE7C216790C100B1A04D /* libAdjustSdkTest.a */, + 9DEC33F221C13E9400937C4D /* libAdjustSdkTest.a */, ); name = Products; sourceTree = ""; @@ -769,12 +769,12 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = 9DA4EE73216790C000B1A04D /* Products */; - ProjectRef = 76D6CFB5851641779C048285 /* AdjustSdk.xcodeproj */; + ProductGroup = 9DEC33E921C13E9400937C4D /* Products */; + ProjectRef = E1B43F76C77B45C2B97B29BC /* AdjustSdk.xcodeproj */; }, { - ProductGroup = 9DA4EE75216790C000B1A04D /* Products */; - ProjectRef = D8AFDE86F1E24AC8A137E2A1 /* AdjustSdkTest.xcodeproj */; + ProductGroup = 9DEC33EB21C13E9400937C4D /* Products */; + ProjectRef = 47BF8CED53724E80B52CA5DC /* AdjustSdkTest.xcodeproj */; }, { ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; @@ -1088,18 +1088,18 @@ remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 9DA4EE79216790C100B1A04D /* libAdjustSdk.a */ = { + 9DEC33EF21C13E9400937C4D /* libAdjustSdk.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libAdjustSdk.a; - remoteRef = 9DA4EE78216790C100B1A04D /* PBXContainerItemProxy */; + remoteRef = 9DEC33EE21C13E9400937C4D /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 9DA4EE7C216790C100B1A04D /* libAdjustSdkTest.a */ = { + 9DEC33F221C13E9400937C4D /* libAdjustSdkTest.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libAdjustSdkTest.a; - remoteRef = 9DA4EE7B216790C100B1A04D /* PBXContainerItemProxy */; + remoteRef = 9DEC33F121C13E9400937C4D /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { diff --git a/test/app/yarn.lock b/test/app/yarn.lock index b8e5782a..1f46a3af 100644 --- a/test/app/yarn.lock +++ b/test/app/yarn.lock @@ -4166,10 +4166,10 @@ react-is@^16.3.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.0.tgz#cc9fdc855ac34d2e7d9d2eb7059bbc240d35ffcf" react-native-adjust-test@../lib: - version "1.0.0" + version "4.17.0" react-native-adjust@../../temp: - version "4.14.0" + version "4.17.0" react-native@0.55.4: version "0.55.4" diff --git a/test/lib/android/build.gradle b/test/lib/android/build.gradle index 12dcf44d..fb32cd7c 100755 --- a/test/lib/android/build.gradle +++ b/test/lib/android/build.gradle @@ -1,12 +1,19 @@ apply plugin: 'com.android.library' +def _ext = rootProject.ext + +def _compileSdkVersion = _ext.has('compileSdkVersion') ? _ext.compileSdkVersion : 26 +def _buildToolsVersion = _ext.has('buildToolsVersion') ? _ext.buildToolsVersion : "26.0.3" +def _minSdkVersion = _ext.has('minSdkVersion') ? _ext.minSdkVersion : 16 +def _targetSdkVersion = _ext.has('targetSdkVersion') ? _ext.targetSdkVersion : 26 + android { - compileSdkVersion 23 - buildToolsVersion "23.0.1" + compileSdkVersion _compileSdkVersion + buildToolsVersion _buildToolsVersion defaultConfig { - minSdkVersion 16 - targetSdkVersion 22 + minSdkVersion _minSdkVersion + targetSdkVersion _targetSdkVersion versionCode 1 versionName "1.0" } @@ -19,6 +26,6 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.facebook.react:react-native:+' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.facebook.react:react-native:+' } diff --git a/test/lib/android/src/main/java/com/adjust/test/AdjustSdkTest.java b/test/lib/android/src/main/java/com/adjust/test/AdjustSdkTest.java index 1cec7c59..8e7d1296 100755 --- a/test/lib/android/src/main/java/com/adjust/test/AdjustSdkTest.java +++ b/test/lib/android/src/main/java/com/adjust/test/AdjustSdkTest.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import com.facebook.react.bridge.*; import com.facebook.react.modules.core.*; -import com.adjust.testlibrary.TestLibrary; +import com.adjust.test.TestLibrary; public class AdjustSdkTest extends ReactContextBaseJavaModule { private static final String TAG = "AdjustSdkTest"; @@ -31,7 +31,7 @@ public String getName() { } @ReactMethod - public void startTestSession(String baseUrl) { + public void startTestSession(String baseUrl, String sdkVersion) { testLibrary = new TestLibrary(baseUrl, new CommandListener(getReactApplicationContext())); for (int i = 0; i < selectedTests.size(); i++) { testLibrary.addTest(selectedTests.get(i)); @@ -39,7 +39,7 @@ public void startTestSession(String baseUrl) { for (int i = 0; i < selectedTestDirs.size(); i++) { testLibrary.addTestDirectory(selectedTestDirs.get(i)); } - testLibrary.startTestSession("react_native4.15.0@android4.15.0"); + testLibrary.startTestSession(sdkVersion); } @ReactMethod diff --git a/test/lib/android/src/main/java/com/adjust/test/BundleJSONConverter.java b/test/lib/android/src/main/java/com/adjust/test/BundleJSONConverter.java index f6294eaf..fbac5662 100644 --- a/test/lib/android/src/main/java/com/adjust/test/BundleJSONConverter.java +++ b/test/lib/android/src/main/java/com/adjust/test/BundleJSONConverter.java @@ -1,4 +1,4 @@ -//steal from https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/main/java/com/facebook/internal/BundleJSONConverter.java +// Taken from https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/main/java/com/facebook/internal/BundleJSONConverter.java /** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. diff --git a/test/lib/android/src/main/java/com/adjust/test/CommandListener.java b/test/lib/android/src/main/java/com/adjust/test/CommandListener.java index b202b00c..033a34a1 100644 --- a/test/lib/android/src/main/java/com/adjust/test/CommandListener.java +++ b/test/lib/android/src/main/java/com/adjust/test/CommandListener.java @@ -20,7 +20,7 @@ import org.json.JSONException; import com.facebook.react.bridge.*; import com.facebook.react.modules.core.*; -import com.adjust.testlibrary.ICommandJsonListener; +import com.adjust.test.ICommandJsonListener; public class CommandListener implements ICommandJsonListener { private static String TAG = "CommandListener"; diff --git a/test/lib/ios/AdjustSdkTest/AdjustSdkTest.m b/test/lib/ios/AdjustSdkTest/AdjustSdkTest.m index c75e2811..0298d3d7 100644 --- a/test/lib/ios/AdjustSdkTest/AdjustSdkTest.m +++ b/test/lib/ios/AdjustSdkTest/AdjustSdkTest.m @@ -21,7 +21,7 @@ @implementation AdjustSdkTest { #pragma mark - Public methods -RCT_EXPORT_METHOD(startTestSession:(NSString *)baseUrl) { +RCT_EXPORT_METHOD(startTestSession:(NSString *)baseUrl sdkVersion:(NSString *)sdkVersion) { if (![self isFieldValid:baseUrl]) { return; } @@ -38,7 +38,7 @@ @implementation AdjustSdkTest { } // Start test session. - [testLibrary startTestSession:@"react_native4.15.0@ios4.15.0"]; + [testLibrary startTestSession:sdkVersion]; } RCT_EXPORT_METHOD(addInfoToSend:(NSString *)key value:(NSString *)value) { diff --git a/test/lib/package.json b/test/lib/package.json index d99339cc..55b38c95 100644 --- a/test/lib/package.json +++ b/test/lib/package.json @@ -1,7 +1,7 @@ { "name": "react-native-adjust-test", - "description": "Adjust Testing React Native SDK", - "version": "1.0.0", + "description": "Adjust Test Plugin For React Native SDK", + "version": "4.17.0", "author": "adjust GmbH", "license": "MIT", "keywords": [