diff --git a/Assets/Adjust/Adjust.cs b/Assets/Adjust/Adjust.cs index c32b85ec..4e9f542d 100644 --- a/Assets/Adjust/Adjust.cs +++ b/Assets/Adjust/Adjust.cs @@ -40,11 +40,7 @@ void Awake() { if (!this.startManually) { AdjustConfig adjustConfig; - if (this.logLevel != AdjustLogLevel.Suppress) { - adjustConfig = new AdjustConfig(this.appToken, this.environment); - } else { - adjustConfig = new AdjustConfig(this.appToken, this.environment, true); - } + adjustConfig = new AdjustConfig(this.appToken, this.environment, (this.logLevel == AdjustLogLevel.Suppress)); adjustConfig.setLogLevel(this.logLevel); adjustConfig.setSendInBackground(this.sendInBackground); diff --git a/Assets/Adjust/Android/AdjustAndroid.cs b/Assets/Adjust/Android/AdjustAndroid.cs index a1204457..048b575d 100644 --- a/Assets/Adjust/Android/AdjustAndroid.cs +++ b/Assets/Adjust/Android/AdjustAndroid.cs @@ -8,7 +8,7 @@ namespace com.adjust.sdk { #if UNITY_ANDROID public class AdjustAndroid : IAdjust { #region Fields - private const string sdkPrefix = "unity4.10.2"; + private const string sdkPrefix = "unity4.10.3"; private static bool launchDeferredDeeplink = true; @@ -46,20 +46,23 @@ public void start(AdjustConfig adjustConfig) { // Check if suppress log leve is supported. if (adjustConfig.allowSuppressLogLevel != null) { - AndroidJavaObject ajoAllowSuppressLogLevel = new AndroidJavaObject("java.lang.Boolean", adjustConfig.allowSuppressLogLevel.Value); - - ajoAdjustConfig = new AndroidJavaObject("com.adjust.sdk.AdjustConfig", ajoCurrentActivity, adjustConfig.appToken, ajoEnvironment, ajoAllowSuppressLogLevel); + ajoAdjustConfig = new AndroidJavaObject("com.adjust.sdk.AdjustConfig", ajoCurrentActivity, adjustConfig.appToken, ajoEnvironment, adjustConfig.allowSuppressLogLevel); } else { ajoAdjustConfig = new AndroidJavaObject("com.adjust.sdk.AdjustConfig", ajoCurrentActivity, adjustConfig.appToken, ajoEnvironment); } - // Check if deferred deeplink should be launched by SDK. launchDeferredDeeplink = adjustConfig.launchDeferredDeeplink; // Check log level. if (adjustConfig.logLevel != null) { - AndroidJavaObject ajoLogLevel = new AndroidJavaClass("com.adjust.sdk.LogLevel").GetStatic(adjustConfig.logLevel.Value.uppercaseToString()); + AndroidJavaObject ajoLogLevel; + + if (adjustConfig.logLevel.Value.uppercaseToString().Equals("SUPPRESS")) { + ajoLogLevel = new AndroidJavaClass("com.adjust.sdk.LogLevel").GetStatic("SUPRESS"); + } else { + ajoLogLevel = new AndroidJavaClass("com.adjust.sdk.LogLevel").GetStatic(adjustConfig.logLevel.Value.uppercaseToString()); + } if (ajoLogLevel != null) { ajoAdjustConfig.Call("setLogLevel", ajoLogLevel); @@ -147,7 +150,7 @@ public void start(AdjustConfig adjustConfig) { public void trackEvent(AdjustEvent adjustEvent) { AndroidJavaObject ajoAdjustEvent = new AndroidJavaObject("com.adjust.sdk.AdjustEvent", adjustEvent.eventToken); - if (adjustEvent.revenue != null && adjustEvent.currency != null) { + if (adjustEvent.revenue != null) { ajoAdjustEvent.Call("setRevenue", (double)adjustEvent.revenue, adjustEvent.currency); } @@ -169,6 +172,10 @@ public void trackEvent(AdjustEvent adjustEvent) { } } + if (adjustEvent.transactionId != null) { + ajoAdjustEvent.Call("setOrderId", adjustEvent.transactionId); + } + ajcAdjust.CallStatic("trackEvent", ajoAdjustEvent); } @@ -273,7 +280,7 @@ public AttributionChangeListener(Action pCallback) : base("co } public void onAttributionChanged(AndroidJavaObject attribution) { - if (callback == null) { + if (callback == null) { return; } @@ -319,7 +326,7 @@ public EventTrackingSucceededListener(Action pCallback) : ba } public void onFinishedEventTrackingSucceeded(AndroidJavaObject eventSuccessData) { - if (callback == null) { + if (callback == null) { return; } @@ -355,7 +362,7 @@ public EventTrackingFailedListener(Action pCallback) : base( } public void onFinishedEventTrackingFailed(AndroidJavaObject eventFailureData) { - if (callback == null) { + if (callback == null) { return; } @@ -392,7 +399,7 @@ public SessionTrackingSucceededListener(Action pCallback) } public void onFinishedSessionTrackingSucceeded(AndroidJavaObject sessionSuccessData) { - if (callback == null) { + if (callback == null) { return; } @@ -427,7 +434,7 @@ public SessionTrackingFailedListener(Action pCallback) : b } public void onFinishedSessionTrackingFailed(AndroidJavaObject sessionFailureData) { - if (callback == null) { + if (callback == null) { return; } diff --git a/Assets/Adjust/Android/adjust-android.jar b/Assets/Adjust/Android/adjust-android.jar index 92f3df31..30f0bb3a 100644 Binary files a/Assets/Adjust/Android/adjust-android.jar and b/Assets/Adjust/Android/adjust-android.jar differ diff --git a/Assets/Adjust/ExampleGUI/ExampleGUI.cs b/Assets/Adjust/ExampleGUI/ExampleGUI.cs index 4918316c..337e27b3 100644 --- a/Assets/Adjust/ExampleGUI/ExampleGUI.cs +++ b/Assets/Adjust/ExampleGUI/ExampleGUI.cs @@ -25,7 +25,7 @@ void OnGUI() { if (GUI.Button(new Rect(0, Screen.height * 0 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), txtManualLaunch)) { if (!string.Equals(txtManualLaunch, "SDK Launched", StringComparison.OrdinalIgnoreCase)) { - AdjustConfig adjustConfig = new AdjustConfig("{YourAppToken}", AdjustEnvironment.Sandbox); + AdjustConfig adjustConfig = new AdjustConfig("2fm9gkqubvpc", AdjustEnvironment.Sandbox); adjustConfig.setLogLevel(AdjustLogLevel.Verbose); adjustConfig.setLogDelegate(msg => Debug.Log(msg)); adjustConfig.setSendInBackground(true); @@ -46,19 +46,19 @@ void OnGUI() { } if (GUI.Button(new Rect(0, Screen.height * 1 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Simple Event")) { - AdjustEvent adjustEvent = new AdjustEvent("{YourEventToken}"); + AdjustEvent adjustEvent = new AdjustEvent("g3mfiw"); Adjust.trackEvent(adjustEvent); } if (GUI.Button(new Rect(0, Screen.height * 2 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Revenue Event")) { - AdjustEvent adjustEvent = new AdjustEvent("{YourEventToken}"); + AdjustEvent adjustEvent = new AdjustEvent("a4fd35"); adjustEvent.setRevenue(0.25, "EUR"); Adjust.trackEvent(adjustEvent); } if (GUI.Button(new Rect(0, Screen.height * 3 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Callback Event")) { - AdjustEvent adjustEvent = new AdjustEvent("{YourEventToken}"); + AdjustEvent adjustEvent = new AdjustEvent("34vgg9"); adjustEvent.addCallbackParameter("key", "value"); adjustEvent.addCallbackParameter("foo", "bar"); @@ -67,7 +67,7 @@ void OnGUI() { } if (GUI.Button(new Rect(0, Screen.height * 4 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Partner Event")) { - AdjustEvent adjustEvent = new AdjustEvent("{YourEventToken}"); + AdjustEvent adjustEvent = new AdjustEvent("w788qs"); adjustEvent.addPartnerParameter("key", "value"); adjustEvent.addPartnerParameter("foo", "bar"); diff --git a/Assets/Adjust/Metro/AdjustMetro.cs b/Assets/Adjust/Metro/AdjustMetro.cs index e97474a5..325846e8 100644 --- a/Assets/Adjust/Metro/AdjustMetro.cs +++ b/Assets/Adjust/Metro/AdjustMetro.cs @@ -8,7 +8,7 @@ namespace com.adjust.sdk { public class AdjustMetro : IAdjust { - private const string sdkPrefix = "unity4.10.2"; + private const string sdkPrefix = "unity4.10.3"; public bool isEnabled() { return AdjustWS.IsEnabled(); diff --git a/Assets/Adjust/WP8/AdjustWP8.cs b/Assets/Adjust/WP8/AdjustWP8.cs index d30f6b45..cdb859bb 100644 --- a/Assets/Adjust/WP8/AdjustWP8.cs +++ b/Assets/Adjust/WP8/AdjustWP8.cs @@ -8,7 +8,7 @@ namespace com.adjust.sdk { public class AdjustWP8 : IAdjust { - private const string sdkPrefix = "unity4.10.2"; + private const string sdkPrefix = "unity4.10.3"; public bool isEnabled() { return AdjustWP.IsEnabled(); diff --git a/Assets/Adjust/iOS/ADJConfig.h b/Assets/Adjust/iOS/ADJConfig.h index 1774c80c..7f5f9715 100644 --- a/Assets/Adjust/iOS/ADJConfig.h +++ b/Assets/Adjust/iOS/ADJConfig.h @@ -171,7 +171,6 @@ @property (nonatomic, copy) NSString *userAgent; @property (nonatomic, assign, readonly) BOOL hasResponseDelegate; -@property (nonatomic, assign, readonly) BOOL hasAttributionChangedDelegate; - (BOOL) isValid; @end diff --git a/Assets/Adjust/iOS/Adjust.h b/Assets/Adjust/iOS/Adjust.h index 0e1d6fb4..4143e7b5 100644 --- a/Assets/Adjust/iOS/Adjust.h +++ b/Assets/Adjust/iOS/Adjust.h @@ -2,6 +2,7 @@ // Adjust.h // Adjust // +// V4.10.3 // Created by Christian Wellenbrock on 2012-07-23. // Copyright (c) 2012-2014 adjust GmbH. All rights reserved. // diff --git a/Assets/Adjust/iOS/AdjustSdk.a b/Assets/Adjust/iOS/AdjustSdk.a index eeaf4755..689691fa 100644 Binary files a/Assets/Adjust/iOS/AdjustSdk.a and b/Assets/Adjust/iOS/AdjustSdk.a differ diff --git a/Assets/Adjust/iOS/AdjustUnity.h b/Assets/Adjust/iOS/AdjustUnity.h index 9170c6ac..ec923dcc 100644 --- a/Assets/Adjust/iOS/AdjustUnity.h +++ b/Assets/Adjust/iOS/AdjustUnity.h @@ -1,12 +1,5 @@ #import "Adjust.h" -@interface AdjustUnity : NSObject - -- (void)adjustAttributionChanged:(ADJAttribution *)attribution; -- (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData; -- (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData; -- (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessResponseData; -- (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseData; -- (BOOL)adjustDeeplinkResponse:(NSURL *)deeplink; +@interface AdjustUnity : NSObject @end diff --git a/Assets/Adjust/iOS/AdjustUnity.mm b/Assets/Adjust/iOS/AdjustUnity.mm index 4c94ce32..a567434b 100644 --- a/Assets/Adjust/iOS/AdjustUnity.mm +++ b/Assets/Adjust/iOS/AdjustUnity.mm @@ -1,199 +1,16 @@ #import "AdjustUnity.h" +#import "AdjustUnityDelegate.h" #import "ADJEvent.h" #import "ADJConfig.h" @implementation AdjustUnity -static char* adjustSceneName = nil; -static BOOL launchAdjustDeferredDeeplink = YES; -static id adjustUnityInstance = nil; - - (id)init { self = [super init]; return self; } -- (void)adjustAttributionChanged:(ADJAttribution *)attribution { - NSMutableDictionary *attributionDic = [NSMutableDictionary dictionary]; - - if (nil != attribution.trackerToken) { - [attributionDic setObject:attribution.trackerToken forKey:@"trackerToken"]; - } - - if (nil != attribution.trackerName) { - [attributionDic setObject:attribution.trackerName forKey:@"trackerName"]; - } - - if (nil != attribution.network) { - [attributionDic setObject:attribution.network forKey:@"network"]; - } - - if (nil != attribution.campaign) { - [attributionDic setObject:attribution.campaign forKey:@"campaign"]; - } - - if (nil != attribution.adgroup) { - [attributionDic setObject:attribution.adgroup forKey:@"adgroup"]; - } - - if (nil != attribution.creative) { - [attributionDic setObject:attribution.creative forKey:@"creative"]; - } - - if (nil != attribution.clickLabel) { - [attributionDic setObject:attribution.clickLabel forKey:@"clickLabel"]; - } - - NSData *dataAttribution = [NSJSONSerialization dataWithJSONObject:attributionDic options:0 error:nil]; - NSString *stringAttribution = [[NSString alloc] initWithBytes:[dataAttribution bytes] - length:[dataAttribution length] - encoding:NSUTF8StringEncoding]; - - const char* charArrayAttribution = [stringAttribution UTF8String]; - - UnitySendMessage(adjustSceneName, "GetNativeAttribution", charArrayAttribution); -} - -- (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData { - NSMutableDictionary *eventSuccessDataDict = [NSMutableDictionary dictionary]; - - if (eventSuccessResponseData.message != nil) { - [eventSuccessDataDict setObject:eventSuccessResponseData.message forKey:@"message"]; - } - - if (eventSuccessResponseData.timeStamp != nil) { - [eventSuccessDataDict setObject:eventSuccessResponseData.timeStamp forKey:@"timestamp"]; - } - - if (eventSuccessResponseData.adid != nil) { - [eventSuccessDataDict setObject:eventSuccessResponseData.adid forKey:@"adid"]; - } - - if (eventSuccessResponseData.eventToken != nil) { - [eventSuccessDataDict setObject:eventSuccessResponseData.eventToken forKey:@"eventToken"]; - } - - if (eventSuccessResponseData.jsonResponse != nil) { - [eventSuccessDataDict setObject:eventSuccessResponseData.jsonResponse forKey:@"jsonResponse"]; - } - - NSData *dataEventSuccess = [NSJSONSerialization dataWithJSONObject:eventSuccessDataDict options:0 error:nil]; - NSString *stringEventSuccess = [[NSString alloc] initWithBytes:[dataEventSuccess bytes] - length:[dataEventSuccess length] - encoding:NSUTF8StringEncoding]; - - const char* charArrayEventSuccess = [stringEventSuccess UTF8String]; - - UnitySendMessage(adjustSceneName, "GetNativeEventSuccess", charArrayEventSuccess); -} - -- (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData { - NSMutableDictionary *eventFailureDataDict = [NSMutableDictionary dictionary]; - - if (eventFailureResponseData.message != nil) { - [eventFailureDataDict setObject:eventFailureResponseData.message forKey:@"message"]; - } - - if (eventFailureResponseData.timeStamp != nil) { - [eventFailureDataDict setObject:eventFailureResponseData.timeStamp forKey:@"timestamp"]; - } - - if (eventFailureResponseData.adid != nil) { - [eventFailureDataDict setObject:eventFailureResponseData.adid forKey:@"adid"]; - } - - if (eventFailureResponseData.eventToken != nil) { - [eventFailureDataDict setObject:eventFailureResponseData.eventToken forKey:@"eventToken"]; - } - - if (eventFailureResponseData.jsonResponse != nil) { - [eventFailureDataDict setObject:eventFailureResponseData.jsonResponse forKey:@"jsonResponse"]; - } - - [eventFailureDataDict setObject:(eventFailureResponseData.willRetry == YES ? @"true" : @"false") - forKey:@"willRetry"]; - - NSData *dataEventFailure = [NSJSONSerialization dataWithJSONObject:eventFailureDataDict options:0 error:nil]; - NSString *stringEventFailure = [[NSString alloc] initWithBytes:[dataEventFailure bytes] - length:[dataEventFailure length] - encoding:NSUTF8StringEncoding]; - - const char* charArrayEventFailure = [stringEventFailure UTF8String]; - - UnitySendMessage(adjustSceneName, "GetNativeEventFailure", charArrayEventFailure); -} - -- (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessResponseData { - NSMutableDictionary *sessionSuccessDataDict = [NSMutableDictionary dictionary]; - - if (sessionSuccessResponseData.message != nil) { - [sessionSuccessDataDict setObject:sessionSuccessResponseData.message forKey:@"message"]; - } - - if (sessionSuccessResponseData.timeStamp != nil) { - [sessionSuccessDataDict setObject:sessionSuccessResponseData.timeStamp forKey:@"timestamp"]; - } - - if (sessionSuccessResponseData.adid != nil) { - [sessionSuccessDataDict setObject:sessionSuccessResponseData.adid forKey:@"adid"]; - } - - if (sessionSuccessResponseData.jsonResponse != nil) { - [sessionSuccessDataDict setObject:sessionSuccessResponseData.jsonResponse forKey:@"jsonResponse"]; - } - - NSData *dataSessionSuccess = [NSJSONSerialization dataWithJSONObject:sessionSuccessDataDict options:0 error:nil]; - NSString *stringSessionSuccess = [[NSString alloc] initWithBytes:[dataSessionSuccess bytes] - length:[dataSessionSuccess length] - encoding:NSUTF8StringEncoding]; - - const char* charArraySessionSuccess = [stringSessionSuccess UTF8String]; - - UnitySendMessage(adjustSceneName, "GetNativeSessionSuccess", charArraySessionSuccess); -} - -- (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseData { - NSMutableDictionary *sessionFailureDataDict = [NSMutableDictionary dictionary]; - - if (sessionFailureResponseData.message != nil) { - [sessionFailureDataDict setObject:sessionFailureResponseData.message forKey:@"message"]; - } - - if (sessionFailureResponseData.timeStamp != nil) { - [sessionFailureDataDict setObject:sessionFailureResponseData.timeStamp forKey:@"timestamp"]; - } - - if (sessionFailureResponseData.adid != nil) { - [sessionFailureDataDict setObject:sessionFailureResponseData.adid forKey:@"adid"]; - } - - if (sessionFailureResponseData.jsonResponse != nil) { - [sessionFailureDataDict setObject:sessionFailureResponseData.jsonResponse forKey:@"jsonResponse"]; - } - - [sessionFailureDataDict setObject:(sessionFailureResponseData.willRetry == YES ? @"true" : @"false") - forKey:@"willRetry"]; - - NSData *dataSessionFailure = [NSJSONSerialization dataWithJSONObject:sessionFailureDataDict options:0 error:nil]; - NSString *stringSessionFailure = [[NSString alloc] initWithBytes:[dataSessionFailure bytes] - length:[dataSessionFailure length] - encoding:NSUTF8StringEncoding]; - - const char* charArraySessionFailure = [stringSessionFailure UTF8String]; - - UnitySendMessage(adjustSceneName, "GetNativeSessionFailure", charArraySessionFailure); -} - -- (BOOL)adjustDeeplinkResponse:(NSURL *)deeplink { - NSString *stringDeeplink = [deeplink absoluteString]; - const char* charDeeplink = [stringDeeplink UTF8String]; - - UnitySendMessage(adjustSceneName, "GetNativeDeferredDeeplink", charDeeplink); - - return launchAdjustDeferredDeeplink; -} - @end // Method for converting JSON stirng parameters into NSArray object. @@ -201,27 +18,30 @@ - (BOOL)adjustDeeplinkResponse:(NSURL *)deeplink { if (cStringJsonArrayParameters == NULL) { return nil; } - + NSError *error = nil; NSArray *arrayParameters = nil; NSString *stringJsonArrayParameters = [NSString stringWithUTF8String:cStringJsonArrayParameters]; - + if (stringJsonArrayParameters != nil) { NSData *dataJson = [stringJsonArrayParameters dataUsingEncoding:NSUTF8StringEncoding]; arrayParameters = [NSJSONSerialization JSONObjectWithData:dataJson options:0 error:&error]; } - + if (error != nil) { NSString *errorMessage = @"Failed to parse json parameters!"; NSLog(@"%@", errorMessage); } - + return arrayParameters; } extern "C" { - void _AdjustLaunchApp(const char* appToken, const char* environment, const char* sdkPrefix, int allowSuppressLogLevel, int logLevel, int eventBuffering, int sendInBackground, double delayStart, const char* userAgent, int launchDeferredDeeplink, const char* sceneName) { + void _AdjustLaunchApp(const char* appToken, const char* environment, const char* sdkPrefix, int allowSuppressLogLevel, int logLevel, + int eventBuffering, int sendInBackground, double delayStart, const char* userAgent, int launchDeferredDeeplink, const char* sceneName, + int isAttributionCallbackImplemented, int isEventSuccessCallbackImplemented, int isEventFailureCallbackImplemented, + int isSessionSuccessCallbackImplemented, int isSessionFailureCallbackImplemented, int isDeferredDeeplinkCallbackImplemented) { NSString *stringSdkPrefix = [NSString stringWithUTF8String:sdkPrefix]; NSString *stringAppToken = [NSString stringWithUTF8String:appToken]; NSString *stringEnvironment = [NSString stringWithUTF8String:environment]; @@ -241,6 +61,21 @@ void _AdjustLaunchApp(const char* appToken, const char* environment, const char* [adjustConfig setSdkPrefix:stringSdkPrefix]; + // Attribution delegate & other delegates + if (isAttributionCallbackImplemented || isEventSuccessCallbackImplemented || + isEventFailureCallbackImplemented || isSessionSuccessCallbackImplemented || + isSessionFailureCallbackImplemented || isDeferredDeeplinkCallbackImplemented) { + [adjustConfig setDelegate: + [AdjustUnityDelegate getInstanceWithSwizzleOfAttributionCallback:isAttributionCallbackImplemented + eventSucceededCallback:isEventSuccessCallbackImplemented + eventFailedCallback:isEventFailureCallbackImplemented + sessionSucceededCallback:isSessionSuccessCallbackImplemented + sessionFailedCallback:isSessionFailureCallbackImplemented + deferredDeeplinkCallback:isDeferredDeeplinkCallbackImplemented + shouldLaunchDeferredDeeplink:launchDeferredDeeplink + withAdjustUnitySceneName:stringSceneName]]; + } + // Optional fields. if (logLevel != -1) { [adjustConfig setLogLevel:(ADJLogLevel)logLevel]; @@ -258,25 +93,13 @@ void _AdjustLaunchApp(const char* appToken, const char* environment, const char* [adjustConfig setDelayStart:delayStart]; } - if (launchDeferredDeeplink != -1) { - launchAdjustDeferredDeeplink = (BOOL)launchDeferredDeeplink; - } - if (stringUserAgent != NULL) { if ([stringUserAgent length] > 0) { [adjustConfig setUserAgent:stringUserAgent]; } } - if (sceneName != NULL) { - if ([stringSceneName length] > 0) { - adjustSceneName = strdup(sceneName); - adjustUnityInstance = [[AdjustUnity alloc] init]; - [adjustConfig setDelegate:(id)adjustUnityInstance]; - } - } - - NSLog(@"%@, %@, %@, %d, %d, %d, %d, %.1f, %@, %d, %@", stringAppToken, stringEnvironment, stringSdkPrefix, allowSuppressLogLevel, logLevel, eventBuffering, sendInBackground, delayStart, stringUserAgent, launchDeferredDeeplink, stringSceneName); + // NSLog(@"%@, %@, %@, %d, %d, %d, %d, %.1f, %@, %d, %@", stringAppToken, stringEnvironment, stringSdkPrefix, allowSuppressLogLevel, logLevel, eventBuffering, sendInBackground, delayStart, stringUserAgent, launchDeferredDeeplink, stringSceneName); // Launch adjust instance. [Adjust appDidLaunch:adjustConfig]; diff --git a/Assets/Adjust/iOS/AdjustUnityDelegate.h b/Assets/Adjust/iOS/AdjustUnityDelegate.h new file mode 100644 index 00000000..d9f7b2ae --- /dev/null +++ b/Assets/Adjust/iOS/AdjustUnityDelegate.h @@ -0,0 +1,26 @@ +// +// AdjustUnityDelegate.h +// Adjust +// +// Created by uerceg on 12/05/16. +// Copyright (c) 2012-2016 adjust GmbH. All rights reserved. +// + +#import "Adjust.h" + +@interface AdjustUnityDelegate : NSObject + +@property (nonatomic) BOOL shouldLaunchDeferredDeeplink; + +@property (nonatomic, copy) NSString *adjustUnitySceneName; + ++ (id)getInstanceWithSwizzleOfAttributionCallback:(BOOL)swizzleAttributionCallback + eventSucceededCallback:(BOOL)swizzleEventSucceededCallback + eventFailedCallback:(BOOL)swizzleEventFailedCallback + sessionSucceededCallback:(BOOL)swizzleSessionSucceededCallback + sessionFailedCallback:(BOOL)swizzleSessionFailedCallback + deferredDeeplinkCallback:(BOOL)swizzleDeferredDeeplinkCallback + shouldLaunchDeferredDeeplink:(BOOL)shouldLaunchDeferredDeeplink + withAdjustUnitySceneName:(NSString *)adjustUnitySceneName; + +@end diff --git a/Assets/Adjust/iOS/AdjustUnityDelegate.mm b/Assets/Adjust/iOS/AdjustUnityDelegate.mm new file mode 100644 index 00000000..320d67a3 --- /dev/null +++ b/Assets/Adjust/iOS/AdjustUnityDelegate.mm @@ -0,0 +1,234 @@ +// +// AdjustUnityDelegate.m +// Adjust +// +// Created by uerceg on 12/05/16. +// Copyright (c) 2012-2016 adjust GmbH. All rights reserved. +// + +#import +#import "AdjustUnityDelegate.h" + +@implementation AdjustUnityDelegate + ++ (id)getInstanceWithSwizzleOfAttributionCallback:(BOOL)swizzleAttributionCallback + eventSucceededCallback:(BOOL)swizzleEventSucceededCallback + eventFailedCallback:(BOOL)swizzleEventFailedCallback + sessionSucceededCallback:(BOOL)swizzleSessionSucceededCallback + sessionFailedCallback:(BOOL)swizzleSessionFailedCallback + deferredDeeplinkCallback:(BOOL)swizzleDeferredDeeplinkCallback + shouldLaunchDeferredDeeplink:(BOOL)shouldLaunchDeferredDeeplink + withAdjustUnitySceneName:(NSString *)adjustUnitySceneName { + static dispatch_once_t onceToken; + static AdjustUnityDelegate *defaultInstance = nil; + + dispatch_once(&onceToken, ^{ + defaultInstance = [[AdjustUnityDelegate alloc] init]; + + // Do the swizzling where and if needed. + if (swizzleAttributionCallback) { + [defaultInstance swizzleCallbackMethod:@selector(adjustAttributionChanged:) + swizzledSelector:@selector(adjustAttributionChangedWannabe:)]; + } + + if (swizzleEventSucceededCallback) { + [defaultInstance swizzleCallbackMethod:@selector(adjustEventTrackingSucceeded:) + swizzledSelector:@selector(adjustEventTrackingSucceededWannabe:)]; + } + + if (swizzleEventFailedCallback) { + [defaultInstance swizzleCallbackMethod:@selector(adjustEventTrackingFailed:) + swizzledSelector:@selector(adjustEventTrackingFailedWannabe:)]; + } + + if (swizzleSessionSucceededCallback) { + [defaultInstance swizzleCallbackMethod:@selector(adjustSessionTrackingSucceeded:) + swizzledSelector:@selector(adjustSessionTrackingSucceededWannabe:)]; + } + + if (swizzleSessionFailedCallback) { + [defaultInstance swizzleCallbackMethod:@selector(adjustSessionTrackingFailed:) + swizzledSelector:@selector(adjustSessionTrackingFailedWananbe:)]; + } + + if (swizzleDeferredDeeplinkCallback) { + [defaultInstance swizzleCallbackMethod:@selector(adjustDeeplinkResponse:) + swizzledSelector:@selector(adjustDeeplinkResponseWannabe:)]; + } + + [defaultInstance setShouldLaunchDeferredDeeplink:shouldLaunchDeferredDeeplink]; + [defaultInstance setAdjustUnitySceneName:adjustUnitySceneName]; + }); + + return defaultInstance; +} + +- (id)init { + self = [super init]; + + if (nil == self) { + return nil; + } + + return self; +} + +- (void)adjustAttributionChangedWannabe:(ADJAttribution *)attribution { + if (attribution == nil) { + return; + } + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + [self addValueOrEmpty:dictionary key:@"trackerToken" value:attribution.trackerToken]; + [self addValueOrEmpty:dictionary key:@"trackerName" value:attribution.trackerName]; + [self addValueOrEmpty:dictionary key:@"network" value:attribution.network]; + [self addValueOrEmpty:dictionary key:@"campaign" value:attribution.campaign]; + [self addValueOrEmpty:dictionary key:@"creative" value:attribution.creative]; + [self addValueOrEmpty:dictionary key:@"adgroup" value:attribution.adgroup]; + [self addValueOrEmpty:dictionary key:@"clickLabel" value:attribution.clickLabel]; + + NSData *dataAttribution = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; + NSString *stringAttribution = [[NSString alloc] initWithBytes:[dataAttribution bytes] + length:[dataAttribution length] + encoding:NSUTF8StringEncoding]; + + const char* charArrayAttribution = [stringAttribution UTF8String]; + + UnitySendMessage([self.adjustUnitySceneName UTF8String], "GetNativeAttribution", charArrayAttribution); +} + +- (void)adjustEventTrackingSucceededWannabe:(ADJEventSuccess *)eventSuccessResponseData { + if (nil == eventSuccessResponseData) { + return; + } + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + [self addValueOrEmpty:dictionary key:@"message" value:eventSuccessResponseData.message]; + [self addValueOrEmpty:dictionary key:@"timestamp" value:eventSuccessResponseData.timeStamp]; + [self addValueOrEmpty:dictionary key:@"adid" value:eventSuccessResponseData.adid]; + [self addValueOrEmpty:dictionary key:@"eventToken" value:eventSuccessResponseData.eventToken]; + [self addValueOrEmpty:dictionary key:@"jsonResponse" value:eventSuccessResponseData.jsonResponse]; + + NSData *dataEventSuccess = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; + NSString *stringEventSuccess = [[NSString alloc] initWithBytes:[dataEventSuccess bytes] + length:[dataEventSuccess length] + encoding:NSUTF8StringEncoding]; + + const char* charArrayEventSuccess = [stringEventSuccess UTF8String]; + + UnitySendMessage([self.adjustUnitySceneName UTF8String], "GetNativeEventSuccess", charArrayEventSuccess); +} + +- (void)adjustEventTrackingFailedWannabe:(ADJEventFailure *)eventFailureResponseData { + if (nil == eventFailureResponseData) { + return; + } + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + [self addValueOrEmpty:dictionary key:@"message" value:eventFailureResponseData.message]; + [self addValueOrEmpty:dictionary key:@"timestamp" value:eventFailureResponseData.timeStamp]; + [self addValueOrEmpty:dictionary key:@"adid" value:eventFailureResponseData.adid]; + [self addValueOrEmpty:dictionary key:@"eventToken" value:eventFailureResponseData.eventToken]; + [dictionary setObject:(eventFailureResponseData.willRetry ? @"true" : @"false") forKey:@"willRetry"]; + [self addValueOrEmpty:dictionary key:@"jsonResponse" value:eventFailureResponseData.jsonResponse]; + + NSData *dataEventFailure = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; + NSString *stringEventFailure = [[NSString alloc] initWithBytes:[dataEventFailure bytes] + length:[dataEventFailure length] + encoding:NSUTF8StringEncoding]; + + const char* charArrayEventFailure = [stringEventFailure UTF8String]; + + UnitySendMessage([self.adjustUnitySceneName UTF8String], "GetNativeEventFailure", charArrayEventFailure); +} + +- (void)adjustSessionTrackingSucceededWannabe:(ADJSessionSuccess *)sessionSuccessResponseData { + if (nil == sessionSuccessResponseData) { + return; + } + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + [self addValueOrEmpty:dictionary key:@"message" value:sessionSuccessResponseData.message]; + [self addValueOrEmpty:dictionary key:@"timestamp" value:sessionSuccessResponseData.timeStamp]; + [self addValueOrEmpty:dictionary key:@"adid" value:sessionSuccessResponseData.adid]; + [self addValueOrEmpty:dictionary key:@"jsonResponse" value:sessionSuccessResponseData.jsonResponse]; + + NSData *dataSessionSuccess = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; + NSString *stringSessionSuccess = [[NSString alloc] initWithBytes:[dataSessionSuccess bytes] + length:[dataSessionSuccess length] + encoding:NSUTF8StringEncoding]; + + const char* charArraySessionSuccess = [stringSessionSuccess UTF8String]; + + UnitySendMessage([self.adjustUnitySceneName UTF8String], "GetNativeSessionSuccess", charArraySessionSuccess); +} + +- (void)adjustSessionTrackingFailedWananbe:(ADJSessionFailure *)sessionFailureResponseData { + if (nil == sessionFailureResponseData) { + return; + } + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + [self addValueOrEmpty:dictionary key:@"message" value:sessionFailureResponseData.message]; + [self addValueOrEmpty:dictionary key:@"timestamp" value:sessionFailureResponseData.timeStamp]; + [self addValueOrEmpty:dictionary key:@"adid" value:sessionFailureResponseData.adid]; + [dictionary setObject:(sessionFailureResponseData.willRetry ? @"true" : @"false") forKey:@"willRetry"]; + [self addValueOrEmpty:dictionary key:@"jsonResponse" value:sessionFailureResponseData.jsonResponse]; + + NSData *dataSessionFailure = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; + NSString *stringSessionFailure = [[NSString alloc] initWithBytes:[dataSessionFailure bytes] + length:[dataSessionFailure length] + encoding:NSUTF8StringEncoding]; + + const char* charArraySessionFailure = [stringSessionFailure UTF8String]; + + UnitySendMessage([self.adjustUnitySceneName UTF8String], "GetNativeSessionFailure", charArraySessionFailure); +} + +- (BOOL)adjustDeeplinkResponseWannabe:(NSURL *)deeplink { + NSString *stringDeeplink = [deeplink absoluteString]; + const char* charDeeplink = [stringDeeplink UTF8String]; + + UnitySendMessage([self.adjustUnitySceneName UTF8String], "GetNativeDeferredDeeplink", charDeeplink); + + return _shouldLaunchDeferredDeeplink; +} + +- (void)swizzleCallbackMethod:(SEL)originalSelector + swizzledSelector:(SEL)swizzledSelector { + Class className = [self class]; + + Method originalMethod = class_getInstanceMethod(className, originalSelector); + Method swizzledMethod = class_getInstanceMethod(className, swizzledSelector); + + BOOL didAddMethod = class_addMethod(className, + originalSelector, + method_getImplementation(swizzledMethod), + method_getTypeEncoding(swizzledMethod)); + + if (didAddMethod) { + class_replaceMethod(className, + swizzledSelector, + method_getImplementation(originalMethod), + method_getTypeEncoding(originalMethod)); + } else { + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + +- (void)addValueOrEmpty:(NSMutableDictionary *)dictionary + key:(NSString *)key + value:(NSObject *)value { + if (nil != value) { + [dictionary setObject:[NSString stringWithFormat:@"%@", value] forKey:key]; + } else { + [dictionary setObject:@"" forKey:key]; + } +} + +@end diff --git a/Assets/Adjust/iOS/AdjustiOS.cs b/Assets/Adjust/iOS/AdjustiOS.cs index 294c72a3..53bf1a7e 100644 --- a/Assets/Adjust/iOS/AdjustiOS.cs +++ b/Assets/Adjust/iOS/AdjustiOS.cs @@ -8,15 +8,19 @@ namespace com.adjust.sdk { #if UNITY_IOS public class AdjustiOS : IAdjust { #region Fields - private const string sdkPrefix = "unity4.10.2"; + private const string sdkPrefix = "unity4.10.3"; #endregion #region External methods [DllImport("__Internal")] - private static extern void _AdjustLaunchApp(string appToken, string environment, string sdkPrefix, int allowSuppressLogLevel, int logLevel, int eventBuffering, int sendInBackground, double delayStart, string userAgent, int launchDeferredDeeplink, string sceneName); + private static extern void _AdjustLaunchApp(string appToken, string environment, string sdkPrefix, int allowSuppressLogLevel, + int logLevel, int eventBuffering, int sendInBackground, double delayStart, string userAgent, int launchDeferredDeeplink, + string sceneName, int isAttributionCallbackImplemented, int isEventSuccessCallbackImplemented,int isEventFailureCallbackImplemented, + int isSessionSuccessCallbackImplemented, int isSessionFailureCallbackImplemented, int isDeferredDeeplinkCallbackImplemented); [DllImport("__Internal")] - private static extern void _AdjustTrackEvent(string eventToken, double revenue, string currency, string receipt, string transactionId, int isReceiptSet, string jsonCallbackParameters, string jsonPartnerParameters); + private static extern void _AdjustTrackEvent(string eventToken, double revenue, string currency, string receipt, string transactionId, + int isReceiptSet, string jsonCallbackParameters, string jsonPartnerParameters); [DllImport("__Internal")] private static extern void _AdjustSetEnabled(int enabled); @@ -75,7 +79,31 @@ public void start(AdjustConfig adjustConfig) { int allowSuppressLogLevel = AdjustUtils.ConvertBool(adjustConfig.allowSuppressLogLevel); int launchDeferredDeeplink = AdjustUtils.ConvertBool(adjustConfig.launchDeferredDeeplink); - _AdjustLaunchApp(appToken, environment, sdkPrefix, allowSuppressLogLevel, logLevel, eventBufferingEnabled, sendInBackground, delayStart, userAgent, launchDeferredDeeplink, sceneName); + int isAttributionCallbackImplemented = AdjustUtils.ConvertBool(adjustConfig.getAttributionChangedDelegate() != null); + int isEventSuccessCallbackImplemented = AdjustUtils.ConvertBool(adjustConfig.getEventSuccessDelegate() != null); + int isEventFailureCallbackImplemented = AdjustUtils.ConvertBool(adjustConfig.getEventFailureDelegate() != null); + int isSessionSuccessCallbackImplemented = AdjustUtils.ConvertBool(adjustConfig.getSessionSuccessDelegate() != null); + int isSessionFailureCallbackImplemented = AdjustUtils.ConvertBool(adjustConfig.getSessionFailureDelegate() != null); + int isDeferredDeeplinkCallbackImplemented = AdjustUtils.ConvertBool(adjustConfig.getDeferredDeeplinkDelegate() != null); + + _AdjustLaunchApp( + appToken, + environment, + sdkPrefix, + allowSuppressLogLevel, + logLevel, + eventBufferingEnabled, + sendInBackground, + delayStart, + userAgent, + launchDeferredDeeplink, + sceneName, + isAttributionCallbackImplemented, + isEventSuccessCallbackImplemented, + isEventFailureCallbackImplemented, + isSessionSuccessCallbackImplemented, + isSessionFailureCallbackImplemented, + isDeferredDeeplinkCallbackImplemented); } public void trackEvent(AdjustEvent adjustEvent) { diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d4c42e8..ca652d4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +### Version 4.10.3 (7th December 2016) +#### Added +- Added method swizzling for iOS platform so that only implemented callbacks in Unity are getting implemented and called in the iOS. + +#### Fixed +- Fixed the suppress log level settings on Android platform. +- Fixed the revenue deduplication on Android platform. +- No need anymore to have attribution callback implemented in order to get deferred deep link. + +#### Changed +- Updated Native iOS SDK to version **4.10.4**. +- Updated Native Android SDK to version **4.10.3**. + +--- + ### Version 4.10.2 (31st October 2016) #### Fixed - Fixed wrong click label parameter name which was causing this parameter to be empty in iOS. diff --git a/README.md b/README.md index 42218d10..8db2ca45 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ These are the minimal steps required to integrate the adjust SDK into your Unity Download the latest version from our [releases page][releases]. In there you will find two Unity packages: -* **Adjust_v4.10.2_Unity_4.unitypackage** - Use this package if you are using **Unity IDE version 4**. -* **Adjust_v4.10.2_Unity_5.unitypackage** - Use this package if you are using **Unity IDE version 5**. +* **Adjust_v4.10.3_Unity_4.unitypackage** - Use this package if you are using **Unity IDE version 4**. +* **Adjust_v4.10.3_Unity_5.unitypackage** - Use this package if you are using **Unity IDE version 5**. ### Add the SDK to your project diff --git a/Scripts/Unity4Backup/ExampleGUI.unity b/Scripts/Unity4Backup/ExampleGUI.unity old mode 100755 new mode 100644 index 2ed5432b..3c55b417 Binary files a/Scripts/Unity4Backup/ExampleGUI.unity and b/Scripts/Unity4Backup/ExampleGUI.unity differ diff --git a/VERSION b/VERSION index 0216ba38..8540cb18 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.10.2 +4.10.3 diff --git a/doc/migrate.md b/doc/migrate.md index a0dc5e77..5985bbc2 100644 --- a/doc/migrate.md +++ b/doc/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for Unity3d to 4.10.2 from 3.4.4 +## Migrate your adjust SDK for Unity3d to 4.10.3 from 3.4.4 ### Migration procedure @@ -9,12 +9,12 @@ keeping in `Assets/Plugins` folder. For migration purposes, we have prepared two Unity packages: - * `Adjust_v4.10.2_Unity_4.unitypackage` (for Unity 4 users) - * `Adjust_v4.10.2_Unity_5.unitypackage` (for Unity 5 users) + * `Adjust_v4.10.3_Unity_4.unitypackage` (for Unity 4 users) + * `Adjust_v4.10.3_Unity_5.unitypackage` (for Unity 5 users) and the adjust SDK uninstall script written in Python (`adjust_uninstall.py`). -Migration to version 4.10.2 of our SDK requires the following steps: +Migration to version 4.10.3 of our SDK requires the following steps: 1. Copy the `adjust_uninstall.py` script to your root Unity project directory and run it. This script should delete all adjust source files from the previous SDK version you had. diff --git a/ext/Android/sdk b/ext/Android/sdk index 95a4a19e..f4f00d76 160000 --- a/ext/Android/sdk +++ b/ext/Android/sdk @@ -1 +1 @@ -Subproject commit 95a4a19e992eaf32d810d6717621f1d3f3980183 +Subproject commit f4f00d76539f84e8ee5569284ff84f41ec1e9101 diff --git a/ext/iOS/sdk b/ext/iOS/sdk index e2559e27..cfe173a3 160000 --- a/ext/iOS/sdk +++ b/ext/iOS/sdk @@ -1 +1 @@ -Subproject commit e2559e2785fcc954f22a9350eb8a3b314afcb5ac +Subproject commit cfe173a379929d3640899e43b1ab8bdaa984d14d