From 33919dfcb7ca731290f0569bb92d4ca9cc27f319 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 20 Apr 2020 15:40:25 +0200 Subject: [PATCH 01/14] Synchronise access to callback/partner parameters in ADJEvent instance --- Adjust/ADJEvent.m | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/Adjust/ADJEvent.m b/Adjust/ADJEvent.m index 87132abb1..db525f211 100644 --- a/Adjust/ADJEvent.m +++ b/Adjust/ADJEvent.m @@ -47,15 +47,17 @@ - (void) addCallbackParameter:(NSString *)key attributeType:@"value" parameterName:@"Callback"]) return; - if (self.callbackMutableParameters == nil) { - self.callbackMutableParameters = [[NSMutableDictionary alloc] init]; - } + @synchronized (self) { + if (self.callbackMutableParameters == nil) { + self.callbackMutableParameters = [[NSMutableDictionary alloc] init]; + } - if ([self.callbackMutableParameters objectForKey:key]) { - [self.logger warn:@"key %@ was overwritten", key]; - } + if ([self.callbackMutableParameters objectForKey:key]) { + [self.logger warn:@"key %@ was overwritten", key]; + } - [self.callbackMutableParameters setObject:value forKey:key]; + [self.callbackMutableParameters setObject:value forKey:key]; + } } - (void) addPartnerParameter:(NSString *)key @@ -69,15 +71,17 @@ - (void) addPartnerParameter:(NSString *)key attributeType:@"value" parameterName:@"Partner"]) return; - if (self.partnerMutableParameters == nil) { - self.partnerMutableParameters = [[NSMutableDictionary alloc] init]; - } + @synchronized (self) { + if (self.partnerMutableParameters == nil) { + self.partnerMutableParameters = [[NSMutableDictionary alloc] init]; + } - if ([self.partnerMutableParameters objectForKey:key]) { - [self.logger warn:@"key %@ was overwritten", key]; - } + if ([self.partnerMutableParameters objectForKey:key]) { + [self.logger warn:@"key %@ was overwritten", key]; + } - [self.partnerMutableParameters setObject:value forKey:key]; + [self.partnerMutableParameters setObject:value forKey:key]; + } } - (void) setRevenue:(double) amount currency:(NSString *)currency{ @@ -98,11 +102,15 @@ - (void)setCallbackId:(NSString *)callbackId { } - (NSDictionary *) callbackParameters { - return (NSDictionary *) self.callbackMutableParameters; + @synchronized (self) { + return (NSDictionary *) self.callbackMutableParameters; + } } - (NSDictionary *) partnerParameters { - return (NSDictionary *) self.partnerMutableParameters; + @synchronized (self) { + return (NSDictionary *) self.partnerMutableParameters; + } } - (BOOL)checkEventToken:(NSString *)eventToken { From 58e9a650aade47d7c3154c92d6462fe166551abb Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 20 Apr 2020 16:13:29 +0200 Subject: [PATCH 02/14] Copying user's input in ADJEvent and minor cleanup --- Adjust/ADJEvent.m | 117 +++++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 54 deletions(-) diff --git a/Adjust/ADJEvent.m b/Adjust/ADJEvent.m index db525f211..117b0cce6 100644 --- a/Adjust/ADJEvent.m +++ b/Adjust/ADJEvent.m @@ -10,11 +10,12 @@ #import "ADJAdjustFactory.h" #import "ADJUtil.h" -#pragma mark - @interface ADJEvent() + @property (nonatomic, weak) id logger; -@property (nonatomic, strong) NSMutableDictionary* callbackMutableParameters; -@property (nonatomic, strong) NSMutableDictionary* partnerMutableParameters; +@property (nonatomic, strong) NSMutableDictionary *callbackMutableParameters; +@property (nonatomic, strong) NSMutableDictionary *partnerMutableParameters; + @end @implementation ADJEvent @@ -25,91 +26,100 @@ + (ADJEvent *)eventWithEventToken:(NSString *)eventToken { - (id) initWithEventToken:(NSString *)eventToken { self = [super init]; - if (self == nil) return nil; + if (self == nil) { + return nil; + } self.logger = ADJAdjustFactory.logger; - if (![self checkEventToken:eventToken]) return self; + if (![self checkEventToken:eventToken]) { + return self; + } - _eventToken = eventToken; + _eventToken = [[NSString alloc] initWithString:eventToken]; return self; } -- (void) addCallbackParameter:(NSString *)key - value:(NSString *)value -{ - if (![ADJUtil isValidParameter:key - attributeType:@"key" - parameterName:@"Callback"]) return; +- (void)addCallbackParameter:(NSString *)key value:(NSString *)value { + NSString *immutableKey = [NSString stringWithString:key]; + NSString *immutableValue = [NSString stringWithString:value]; - if (![ADJUtil isValidParameter:value + if (![ADJUtil isValidParameter:immutableKey + attributeType:@"key" + parameterName:@"Callback"]) { + return; + } + if (![ADJUtil isValidParameter:immutableValue attributeType:@"value" - parameterName:@"Callback"]) return; + parameterName:@"Callback"]) { + return; + } @synchronized (self) { if (self.callbackMutableParameters == nil) { self.callbackMutableParameters = [[NSMutableDictionary alloc] init]; } - - if ([self.callbackMutableParameters objectForKey:key]) { - [self.logger warn:@"key %@ was overwritten", key]; + if ([self.callbackMutableParameters objectForKey:immutableKey]) { + [self.logger warn:@"Callback parameter key %@ was overwritten", immutableKey]; } - - [self.callbackMutableParameters setObject:value forKey:key]; + [self.callbackMutableParameters setObject:immutableValue forKey:immutableKey]; } } -- (void) addPartnerParameter:(NSString *)key - value:(NSString *)value { +- (void)addPartnerParameter:(NSString *)key value:(NSString *)value { + NSString *immutableKey = [NSString stringWithString:key]; + NSString *immutableValue = [NSString stringWithString:value]; - if (![ADJUtil isValidParameter:key + if (![ADJUtil isValidParameter:immutableKey attributeType:@"key" - parameterName:@"Partner"]) return; - + parameterName:@"Partner"]) { + return; + } if (![ADJUtil isValidParameter:value attributeType:@"value" - parameterName:@"Partner"]) return; + parameterName:@"Partner"]) { + return; + } @synchronized (self) { if (self.partnerMutableParameters == nil) { self.partnerMutableParameters = [[NSMutableDictionary alloc] init]; } - - if ([self.partnerMutableParameters objectForKey:key]) { - [self.logger warn:@"key %@ was overwritten", key]; + if ([self.partnerMutableParameters objectForKey:immutableKey]) { + [self.logger warn:@"Partner parameter key %@ was overwritten", immutableKey]; } - - [self.partnerMutableParameters setObject:value forKey:key]; + [self.partnerMutableParameters setObject:immutableValue forKey:immutableKey]; } } -- (void) setRevenue:(double) amount currency:(NSString *)currency{ - NSNumber * revenue = [NSNumber numberWithDouble:amount]; - - if (![self checkRevenue:revenue currency:currency]) return; +- (void)setRevenue:(double)amount currency:(NSString *)currency { + NSNumber *revenue = [NSNumber numberWithDouble:amount]; + if (![self checkRevenue:revenue currency:currency]) { + return; + } _revenue = revenue; - _currency = currency; + _currency = [NSString stringWithString:currency]; } -- (void) setTransactionId:(NSString *)transactionId { - _transactionId = transactionId; +- (void)setTransactionId:(NSString *)transactionId { + _transactionId = [NSString stringWithString:transactionId]; } - (void)setCallbackId:(NSString *)callbackId { - _callbackId = callbackId; + _callbackId = [NSString stringWithString:callbackId]; } -- (NSDictionary *) callbackParameters { +- (NSDictionary *)callbackParameters { @synchronized (self) { - return (NSDictionary *) self.callbackMutableParameters; + return (NSDictionary *)self.callbackMutableParameters; } } -- (NSDictionary *) partnerParameters { +- (NSDictionary *)partnerParameters { @synchronized (self) { - return (NSDictionary *) self.partnerMutableParameters; + return (NSDictionary *)self.partnerMutableParameters; } } @@ -125,21 +135,17 @@ - (BOOL)checkEventToken:(NSString *)eventToken { return YES; } -- (BOOL) checkRevenue:(NSNumber*) revenue - currency:(NSString*) currency -{ +- (BOOL)checkRevenue:(NSNumber *)revenue currency:(NSString *)currency { if (![ADJUtil isNull:revenue]) { double amount = [revenue doubleValue]; if (amount < 0.0) { [self.logger error:@"Invalid amount %.5f", amount]; return NO; } - if ([ADJUtil isNull:currency]) { [self.logger error:@"Currency must be set with revenue"]; return NO; } - if ([currency isEqualToString:@""]) { [self.logger error:@"Currency is empty"]; return NO; @@ -154,12 +160,14 @@ - (BOOL) checkRevenue:(NSNumber*) revenue return YES; } -- (BOOL) isValid { +- (BOOL)isValid { return self.eventToken != nil; } -- (void) setReceipt:(NSData *)receipt transactionId:(NSString *)transactionId { - if (![self checkReceipt:receipt transactionId:transactionId]) return; +- (void)setReceipt:(NSData *)receipt transactionId:(NSString *)transactionId { + if (![self checkReceipt:receipt transactionId:transactionId]) { + return; + } if ([ADJUtil isNull:receipt] || [receipt length] == 0) { _emptyReceipt = YES; @@ -168,7 +176,7 @@ - (void) setReceipt:(NSData *)receipt transactionId:(NSString *)transactionId { _transactionId = transactionId; } -- (BOOL) checkReceipt:(NSData *)receipt transactionId:(NSString *)transactionId { +- (BOOL)checkReceipt:(NSData *)receipt transactionId:(NSString *)transactionId { if ([ADJUtil isNotNull:receipt] && [ADJUtil isNull:transactionId]) { [self.logger error:@"Missing transactionId"]; return NO; @@ -176,9 +184,9 @@ - (BOOL) checkReceipt:(NSData *)receipt transactionId:(NSString *)transactionId return YES; } --(id)copyWithZone:(NSZone *)zone -{ - ADJEvent* copy = [[[self class] allocWithZone:zone] init]; +- (id)copyWithZone:(NSZone *)zone { + ADJEvent *copy = [[[self class] allocWithZone:zone] init]; + if (copy) { copy->_eventToken = [self.eventToken copyWithZone:zone]; copy->_revenue = [self.revenue copyWithZone:zone]; @@ -189,6 +197,7 @@ -(id)copyWithZone:(NSZone *)zone copy->_receipt = [self.receipt copyWithZone:zone]; copy->_emptyReceipt = self.emptyReceipt; } + return copy; } From d7f1434382befdca698df1d82c237ccbf6121130 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 20 Apr 2020 16:15:58 +0200 Subject: [PATCH 03/14] Fix to use immutable value --- Adjust/ADJEvent.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adjust/ADJEvent.m b/Adjust/ADJEvent.m index 117b0cce6..52a66db78 100644 --- a/Adjust/ADJEvent.m +++ b/Adjust/ADJEvent.m @@ -24,7 +24,7 @@ + (ADJEvent *)eventWithEventToken:(NSString *)eventToken { return [[ADJEvent alloc] initWithEventToken:eventToken]; } -- (id) initWithEventToken:(NSString *)eventToken { +- (id)initWithEventToken:(NSString *)eventToken { self = [super init]; if (self == nil) { return nil; @@ -76,7 +76,7 @@ - (void)addPartnerParameter:(NSString *)key value:(NSString *)value { parameterName:@"Partner"]) { return; } - if (![ADJUtil isValidParameter:value + if (![ADJUtil isValidParameter:immutableValue attributeType:@"value" parameterName:@"Partner"]) { return; From c3f760b0ec336c98f7ce310640069737558e0ae6 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 20 Apr 2020 23:43:17 +0200 Subject: [PATCH 04/14] Always use callback and partner parameters copies in package builder --- Adjust/ADJPackageBuilder.m | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index c3f927521..6d67f92dc 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -299,8 +299,8 @@ - (NSMutableDictionary *)getSessionParameters:(BOOL)isInDelay { } if (!isInDelay) { - [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.callbackParameters forKey:@"callback_params"]; - [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.partnerParameters forKey:@"partner_params"]; + [ADJPackageBuilder parameters:parameters setDictionary:[self.sessionParameters.callbackParameters copy] forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDictionary:[self.sessionParameters.partnerParameters copy] forKey:@"partner_params"]; } #if !TARGET_OS_TV && !TARGET_OS_MACCATALYST @@ -368,11 +368,11 @@ - (NSMutableDictionary *)getEventParameters:(BOOL)isInDelay forEventPackage:(ADJ } if (!isInDelay) { - NSDictionary *mergedCallbackParameters = [ADJUtil mergeParameters:self.sessionParameters.callbackParameters - source:event.callbackParameters + NSDictionary *mergedCallbackParameters = [ADJUtil mergeParameters:[self.sessionParameters.callbackParameters copy] + source:[event.callbackParameters copy] parameterName:@"Callback"]; - NSDictionary *mergedPartnerParameters = [ADJUtil mergeParameters:self.sessionParameters.partnerParameters - source:event.partnerParameters + NSDictionary *mergedPartnerParameters = [ADJUtil mergeParameters:[self.sessionParameters.partnerParameters copy] + source:[event.partnerParameters copy] parameterName:@"Partner"]; [ADJPackageBuilder parameters:parameters setDictionary:mergedCallbackParameters forKey:@"callback_params"]; @@ -507,7 +507,7 @@ - (NSMutableDictionary *)getClickParameters:(NSString *)source { [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 setDictionary:[self.sessionParameters.callbackParameters copy] 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"]; @@ -535,7 +535,7 @@ - (NSMutableDictionary *)getClickParameters:(NSString *)source { [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 setDictionary:[self.sessionParameters.partnerParameters copy] 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"]; @@ -666,7 +666,7 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters { [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 setDictionary:[self.sessionParameters.callbackParameters copy] 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"]; @@ -694,7 +694,7 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters { [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 setDictionary:[self.sessionParameters.partnerParameters copy] 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 setInt:UIDevice.currentDevice.adjTrackingEnabled forKey:@"tracking_enabled"]; From 8555d5845b9e37941b55f046a81ab643500f3c82 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 21 Apr 2020 01:01:56 +0200 Subject: [PATCH 05/14] Copy deeplinkParameters dictionary just in case --- Adjust/ADJActivityHandler.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index d6f1c4697..d3356ced1 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -1446,7 +1446,7 @@ - (void)appWillOpenUrlI:(ADJActivityHandler *)selfI config:selfI.adjustConfig sessionParameters:selfI.sessionParameters createdAt:now]; - clickBuilder.deeplinkParameters = adjustDeepLinks; + clickBuilder.deeplinkParameters = [adjustDeepLinks copy]; clickBuilder.attribution = deeplinkAttribution; clickBuilder.clickTime = clickTime; clickBuilder.deeplink = [url absoluteString]; From 85821d39230f7f17950c1c21106d14c4f73203a2 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 21 Apr 2020 02:52:01 +0200 Subject: [PATCH 06/14] Remove iAd timer (for now) --- Adjust/ADJActivityHandler.m | 30 ++------------------- Adjust/ADJAdditions/UIDevice+ADJAdditions.h | 3 +-- Adjust/ADJAdditions/UIDevice+ADJAdditions.m | 14 +++------- 3 files changed, 6 insertions(+), 41 deletions(-) diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index d3356ced1..6f8311c21 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -32,7 +32,6 @@ static NSString * const kForegroundTimerName = @"Foreground timer"; static NSString * const kBackgroundTimerName = @"Background timer"; static NSString * const kDelayStartTimerName = @"Delay Start timer"; -static NSString * const kiAdTimeoutTimerName = @"iAd Timeout timer"; static NSTimeInterval kForegroundTimerInterval; static NSTimeInterval kForegroundTimerStart; @@ -87,7 +86,6 @@ @interface ADJActivityHandler() @property (nonatomic, strong) ADJActivityState *activityState; @property (nonatomic, strong) ADJTimerCycle *foregroundTimer; @property (nonatomic, strong) ADJTimerOnce *backgroundTimer; -@property (nonatomic, strong) ADJTimerOnce *iAdTimeoutTimer; @property (nonatomic, assign) NSInteger iAdRetriesLeft; @property (nonatomic, strong) ADJInternalState *internalState; @property (nonatomic, strong) ADJDeviceInfo *deviceInfo; @@ -110,7 +108,6 @@ typedef NS_ENUM(NSInteger, AdjADClientError) { AdjADClientErrorLimitAdTracking = 1, AdjADClientErrorMissingData = 2, AdjADClientErrorCorruptResponse = 3, - AdjCustomErrorTimeout = 100, }; #pragma mark - @@ -400,9 +397,6 @@ - (void)setTrackingStateOptedOut { - (void)setAttributionDetails:(NSDictionary *)attributionDetails error:(NSError *)error { - if (self.iAdTimeoutTimer) { - [self.iAdTimeoutTimer cancel]; - } if (![ADJUtil isNull:error]) { [self.logger warn:@"Unable to read iAd details"]; @@ -415,7 +409,6 @@ - (void)setAttributionDetails:(NSDictionary *)attributionDetails // - AdjADClientErrorUnknown // - AdjADClientErrorMissingData // - AdjADClientErrorCorruptResponse - // - AdjCustomErrorTimeout // apply following retry logic: // - 1st retry after 5 seconds // - 2nd retry after 2 seconds @@ -423,8 +416,7 @@ - (void)setAttributionDetails:(NSDictionary *)attributionDetails switch (error.code) { case AdjADClientErrorUnknown: case AdjADClientErrorMissingData: - case AdjADClientErrorCorruptResponse: - case AdjCustomErrorTimeout: { + case AdjADClientErrorCorruptResponse: { int64_t iAdRetryDelay = 0; switch (self.iAdRetriesLeft) { case 2: @@ -638,9 +630,6 @@ - (void)teardown if (self.backgroundTimer != nil) { [self.backgroundTimer cancel]; } - if (self.iAdTimeoutTimer != nil) { - [self.iAdTimeoutTimer cancel]; - } if (self.foregroundTimer != nil) { [self.foregroundTimer cancel]; } @@ -668,7 +657,6 @@ - (void)teardown self.sdkClickHandler = nil; self.foregroundTimer = nil; self.backgroundTimer = nil; - self.iAdTimeoutTimer = nil; self.adjustDelegate = nil; self.adjustConfig = nil; self.internalState = nil; @@ -1320,21 +1308,7 @@ - (void)checkForiAd { } - (void)checkForiAdI:(ADJActivityHandler *)selfI { - if (selfI.iAdTimeoutTimer == nil) { - selfI.iAdTimeoutTimer = - [ADJTimerOnce - timerWithBlock:^{ - [selfI setAttributionDetails:nil - error:[NSError errorWithDomain:@"com.adjust.sdk.iAd" - code:100 - userInfo:@{@"Error reason": @"iAd request timed out"}]]; - - } - queue:selfI.internalQueue - name:kiAdTimeoutTimerName]; - } - - [[UIDevice currentDevice] adjCheckForiAd:selfI iAdTimeoutTimer:selfI.iAdTimeoutTimer]; + [[UIDevice currentDevice] adjCheckForiAd:selfI]; } - (void)setOfflineModeI:(ADJActivityHandler *)selfI diff --git a/Adjust/ADJAdditions/UIDevice+ADJAdditions.h b/Adjust/ADJAdditions/UIDevice+ADJAdditions.h index 4bba1d86e..b1778204d 100644 --- a/Adjust/ADJAdditions/UIDevice+ADJAdditions.h +++ b/Adjust/ADJAdditions/UIDevice+ADJAdditions.h @@ -20,6 +20,5 @@ - (NSString *)adjDeviceName; - (NSString *)adjCreateUuid; - (NSString *)adjVendorId; -- (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler - iAdTimeoutTimer:(ADJTimerOnce *)iAdTimeoutTimer; +- (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler; @end diff --git a/Adjust/ADJAdditions/UIDevice+ADJAdditions.m b/Adjust/ADJAdditions/UIDevice+ADJAdditions.m index 7f10cc173..b62da6d2f 100644 --- a/Adjust/ADJAdditions/UIDevice+ADJAdditions.m +++ b/Adjust/ADJAdditions/UIDevice+ADJAdditions.m @@ -158,9 +158,7 @@ - (NSString *)adjVendorId { return @""; } -- (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler - iAdTimeoutTimer:(ADJTimerOnce *)iAdTimeoutTimer -{ +- (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler { // if no tries for iad v3 left, stop trying id logger = [ADJAdjustFactory logger]; @@ -192,8 +190,7 @@ - (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler [logger debug:@"iAd framework successfully found in user's app"]; BOOL iAdInformationAvailable = [self setiAdWithDetails:activityHandler - adcClientSharedInstance:ADClientSharedClientInstance - iAdTimeoutTimer:iAdTimeoutTimer]; + adcClientSharedInstance:ADClientSharedClientInstance]; if (!iAdInformationAvailable) { [logger warn:@"iAd information not available"]; @@ -204,9 +201,7 @@ - (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler } - (BOOL)setiAdWithDetails:(ADJActivityHandler *)activityHandler - adcClientSharedInstance:(id)ADClientSharedClientInstance - iAdTimeoutTimer:(ADJTimerOnce *)iAdTimeoutTimer -{ + adcClientSharedInstance:(id)ADClientSharedClientInstance { SEL iAdDetailsSelector = NSSelectorFromString(@"requestAttributionDetailsWithBlock:"); if (![ADClientSharedClientInstance respondsToSelector:iAdDetailsSelector]) { return NO; @@ -220,9 +215,6 @@ - (BOOL)setiAdWithDetails:(ADJActivityHandler *)activityHandler error:error]; }]; #pragma clang diagnostic pop - if (iAdTimeoutTimer) { - [iAdTimeoutTimer startIn:5.0]; - } return YES; } From cad90dfdb4f7d9eb7f2da545ea7ac8fd2d8d1507 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 21 Apr 2020 02:55:23 +0200 Subject: [PATCH 07/14] New version 4.21.3 --- Adjust.podspec | 4 ++-- Adjust/ADJUtil.m | 2 +- Adjust/Adjust.h | 2 +- AdjustBridge/AdjustBridgeRegister.m | 2 +- AdjustTests/AdjustUnitTests/ADJPackageFields.m | 2 +- README.md | 4 ++-- VERSION | 2 +- doc/chinese/README.md | 4 ++-- doc/english/migrate.md | 2 +- doc/english/web_views.md | 2 +- doc/japanese/README.md | 4 ++-- doc/korean/README.md | 4 ++-- doc/korean/web_views.md | 2 +- doc/migrate.md | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Adjust.podspec b/Adjust.podspec index 9b0fa6970..316a436b0 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.21.2" + s.version = "4.21.3" s.summary = "This is the iOS SDK of adjust. You can read more about it at http://adjust.com." s.homepage = "https://github.com/adjust/ios_sdk" s.license = { :type => 'MIT', :file => 'MIT-LICENSE' } s.author = { "Christian Wellenbrock" => "welle@adjust.com" } - s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.21.2" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.21.3" } s.ios.deployment_target = '6.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 6f103c499..c5e46ce64 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -43,7 +43,7 @@ static CTTelephonyNetworkInfo *networkInfo = nil; #endif -static NSString * const kClientSdk = @"ios4.21.2"; +static NSString * const kClientSdk = @"ios4.21.3"; static NSString * const kDeeplinkParam = @"deep_link="; static NSString * const kSchemeDelimiter = @"://"; static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index f33bbc0eb..6e9c5ad79 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust // -// V4.21.2 +// V4.21.3 // Created by Christian Wellenbrock (wellle) on 23rd July 2013. // Copyright © 2012-2017 Adjust GmbH. All rights reserved. // diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 8ae4c40cf..b87799a2d 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -221,7 +221,7 @@ + (NSString *)adjust_js { if (this.sdkPrefix) { return this.sdkPrefix; } else { - return 'web-bridge4.21.2'; + return 'web-bridge4.21.3'; } }, setTestOptions: function(testOptions) { diff --git a/AdjustTests/AdjustUnitTests/ADJPackageFields.m b/AdjustTests/AdjustUnitTests/ADJPackageFields.m index 13606d9e9..ab7a0b56e 100644 --- a/AdjustTests/AdjustUnitTests/ADJPackageFields.m +++ b/AdjustTests/AdjustUnitTests/ADJPackageFields.m @@ -16,7 +16,7 @@ - (id) init { // default values self.appToken = @"qwerty123456"; - self.clientSdk = @"ios4.21.2"; + self.clientSdk = @"ios4.21.3"; self.suffix = @""; self.environment = @"sandbox"; diff --git a/README.md b/README.md index 30bff553e..e2ade75b1 100644 --- a/README.md +++ b/README.md @@ -74,13 +74,13 @@ We will describe the steps to integrate the Adjust SDK into your iOS project. We If you're using [CocoaPods][cocoapods], you can add the following line to your `Podfile` and continue from [this step](#sdk-integrate): ```ruby -pod 'Adjust', '~> 4.21.2' +pod 'Adjust', '~> 4.21.3' ``` or: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.2' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.3' ``` --- diff --git a/VERSION b/VERSION index c93e58ee0..fedb11348 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.21.2 +4.21.3 diff --git a/doc/chinese/README.md b/doc/chinese/README.md index 1acf5ab24..4d497188b 100644 --- a/doc/chinese/README.md +++ b/doc/chinese/README.md @@ -73,13 +73,13 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本 如果您正在使用[CocoaPods][cocoapods],您可以将以下代码行添加至 `Podfile`,然后继续进行[此步骤](#sdk-integrate): ```ruby -pod 'Adjust', '~> 4.21.2' +pod 'Adjust', '~> 4.21.3' ``` 或: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.2' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.3' ``` --- diff --git a/doc/english/migrate.md b/doc/english/migrate.md index e74db1313..754f75536 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your Adjust SDK for iOS to v4.21.2 from v3.4.0 +## Migrate your Adjust SDK for iOS to v4.21.3 from v3.4.0 ### Initial setup diff --git a/doc/english/web_views.md b/doc/english/web_views.md index 30ea2d10a..3758dc7f3 100644 --- a/doc/english/web_views.md +++ b/doc/english/web_views.md @@ -64,7 +64,7 @@ We will describe the steps to integrate the Adjust SDK into your iOS project. We If you're using [CocoaPods][cocoapods], you can add the following line to your `Podfile` and continue from [this step](#sdk-integrate): ```ruby -pod 'Adjust/WebBridge', '~> 4.21.2' +pod 'Adjust/WebBridge', '~> 4.21.3' ``` --- diff --git a/doc/japanese/README.md b/doc/japanese/README.md index 783d31f04..068d4cc50 100644 --- a/doc/japanese/README.md +++ b/doc/japanese/README.md @@ -25,13 +25,13 @@ adjust SDKをiOSプロジェクトに連携する手順を説明します。 [こちらの手順](#sdk-integrate)に進んでください。 ```ruby -pod 'Adjust', '~> 4.21.2' +pod 'Adjust', '~> 4.21.3' ``` または ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.2' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.3' ``` --- diff --git a/doc/korean/README.md b/doc/korean/README.md index c4d1678aa..98586b073 100644 --- a/doc/korean/README.md +++ b/doc/korean/README.md @@ -73,13 +73,13 @@ iOS 개발용 Xcode를 사용한다는 가정하에 iOS 프로젝트에 Adjust S [CocoaPods][cocoapods]를 사용하는 경우, 다음 내용을 `Podfile`에 추가한 후 [해당 단계](#sdk-integrate)를 완료하세요. ```ruby -pod 'Adjust', '~> 4.21.2' +pod 'Adjust', '~> 4.21.3' ``` 또는: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.2' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.21.3' ``` --- diff --git a/doc/korean/web_views.md b/doc/korean/web_views.md index 1f3a32e69..e191eb289 100644 --- a/doc/korean/web_views.md +++ b/doc/korean/web_views.md @@ -64,7 +64,7 @@ iOS 개발용 Xcode를 사용한다는 가정하에 iOS 프로젝트에 Adjust S [CocoaPods][cocoapods]를 사용하는 경우, 다음 내용을 'Podfile'에 추가한 후 [해당 단계](#sdk-integrate)를 완료하세요. ```ruby -pod 'Adjust/WebBridge', '~> 4.21.2' +pod 'Adjust/WebBridge', '~> 4.21.3' ``` --- diff --git a/doc/migrate.md b/doc/migrate.md index e74db1313..754f75536 100644 --- a/doc/migrate.md +++ b/doc/migrate.md @@ -1,4 +1,4 @@ -## Migrate your Adjust SDK for iOS to v4.21.2 from v3.4.0 +## Migrate your Adjust SDK for iOS to v4.21.3 from v3.4.0 ### Initial setup From 03b073db66339d4504f14af29b8f993ddaab16c5 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 21 Apr 2020 02:59:20 +0200 Subject: [PATCH 08/14] CHANGELOG.md update --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd92d282e..a7e602778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +### Version 4.21.3 (21st April 2020) +#### Changed +- Added copying of each injected mutable property of `ADJEvent` class. +- Sychronised access to callback/partner parameters in `ADJEvent` class. + +#### Fixed +- Removed iAd timer. +- Removed activity package mutation scenarios after package has been created. + +--- + ### Version 4.21.2 (15th April 2020) #### Fixed - Added check for timer source and block existence prior to starting it. From f66ee7e3dcbb320b039287bb63afc69829709691 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 21 Apr 2020 15:22:54 +0200 Subject: [PATCH 09/14] Make NSString copys safe --- Adjust/ADJEvent.m | 16 ++++++++-------- Adjust/ADJUtil.m | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Adjust/ADJEvent.m b/Adjust/ADJEvent.m index 52a66db78..168dd70e1 100644 --- a/Adjust/ADJEvent.m +++ b/Adjust/ADJEvent.m @@ -36,14 +36,14 @@ - (id)initWithEventToken:(NSString *)eventToken { return self; } - _eventToken = [[NSString alloc] initWithString:eventToken]; + _eventToken = [eventToken copy]; return self; } - (void)addCallbackParameter:(NSString *)key value:(NSString *)value { - NSString *immutableKey = [NSString stringWithString:key]; - NSString *immutableValue = [NSString stringWithString:value]; + NSString *immutableKey = [key copy]; + NSString *immutableValue = [value copy]; if (![ADJUtil isValidParameter:immutableKey attributeType:@"key" @@ -68,8 +68,8 @@ - (void)addCallbackParameter:(NSString *)key value:(NSString *)value { } - (void)addPartnerParameter:(NSString *)key value:(NSString *)value { - NSString *immutableKey = [NSString stringWithString:key]; - NSString *immutableValue = [NSString stringWithString:value]; + NSString *immutableKey = [key copy]; + NSString *immutableValue = [value copy]; if (![ADJUtil isValidParameter:immutableKey attributeType:@"key" @@ -100,15 +100,15 @@ - (void)setRevenue:(double)amount currency:(NSString *)currency { } _revenue = revenue; - _currency = [NSString stringWithString:currency]; + _currency = [currency copy]; } - (void)setTransactionId:(NSString *)transactionId { - _transactionId = [NSString stringWithString:transactionId]; + _transactionId = [transactionId copy]; } - (void)setCallbackId:(NSString *)callbackId { - _callbackId = [NSString stringWithString:callbackId]; + _callbackId = [callbackId copy]; } - (NSDictionary *)callbackParameters { diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index c5e46ce64..ef867f2ed 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -1330,7 +1330,7 @@ + (NSString *)convertDeviceToken:(NSData *)deviceToken { [hexString appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]]; } - return [NSString stringWithString:hexString]; + return [hexString copy]; } + (BOOL)checkAttributionDetails:(NSDictionary *)attributionDetails { From ee9afb9d62dba32191d5c85e20a71c8ecd417566 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 22 Apr 2020 11:42:03 +0200 Subject: [PATCH 10/14] CHANGELOG.md update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7e602778..3993dfd71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### Version 4.21.3 (21st April 2020) +### Version 4.21.3 (22nd April 2020) #### Changed - Added copying of each injected mutable property of `ADJEvent` class. - Sychronised access to callback/partner parameters in `ADJEvent` class. From 82c2910a40c0930a24c51da294f8c69a662f7dba Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 22 Apr 2020 13:09:53 +0200 Subject: [PATCH 11/14] Synchronise remaining ADJEvent setters --- Adjust/ADJEvent.m | 64 ++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/Adjust/ADJEvent.m b/Adjust/ADJEvent.m index 168dd70e1..ecb6b1cd8 100644 --- a/Adjust/ADJEvent.m +++ b/Adjust/ADJEvent.m @@ -42,21 +42,21 @@ - (id)initWithEventToken:(NSString *)eventToken { } - (void)addCallbackParameter:(NSString *)key value:(NSString *)value { - NSString *immutableKey = [key copy]; - NSString *immutableValue = [value copy]; + @synchronized (self) { + NSString *immutableKey = [key copy]; + NSString *immutableValue = [value copy]; - if (![ADJUtil isValidParameter:immutableKey - attributeType:@"key" - parameterName:@"Callback"]) { - return; - } - if (![ADJUtil isValidParameter:immutableValue - attributeType:@"value" - parameterName:@"Callback"]) { - return; - } + if (![ADJUtil isValidParameter:immutableKey + attributeType:@"key" + parameterName:@"Callback"]) { + return; + } + if (![ADJUtil isValidParameter:immutableValue + attributeType:@"value" + parameterName:@"Callback"]) { + return; + } - @synchronized (self) { if (self.callbackMutableParameters == nil) { self.callbackMutableParameters = [[NSMutableDictionary alloc] init]; } @@ -68,21 +68,21 @@ - (void)addCallbackParameter:(NSString *)key value:(NSString *)value { } - (void)addPartnerParameter:(NSString *)key value:(NSString *)value { - NSString *immutableKey = [key copy]; - NSString *immutableValue = [value copy]; + @synchronized (self) { + NSString *immutableKey = [key copy]; + NSString *immutableValue = [value copy]; - if (![ADJUtil isValidParameter:immutableKey - attributeType:@"key" - parameterName:@"Partner"]) { - return; - } - if (![ADJUtil isValidParameter:immutableValue - attributeType:@"value" - parameterName:@"Partner"]) { - return; - } + if (![ADJUtil isValidParameter:immutableKey + attributeType:@"key" + parameterName:@"Partner"]) { + return; + } + if (![ADJUtil isValidParameter:immutableValue + attributeType:@"value" + parameterName:@"Partner"]) { + return; + } - @synchronized (self) { if (self.partnerMutableParameters == nil) { self.partnerMutableParameters = [[NSMutableDictionary alloc] init]; } @@ -100,15 +100,21 @@ - (void)setRevenue:(double)amount currency:(NSString *)currency { } _revenue = revenue; - _currency = [currency copy]; + @synchronized (self) { + _currency = [currency copy]; + } } - (void)setTransactionId:(NSString *)transactionId { - _transactionId = [transactionId copy]; + @synchronized (self) { + _transactionId = [transactionId copy]; + } } - (void)setCallbackId:(NSString *)callbackId { - _callbackId = [callbackId copy]; + @synchronized (self) { + _callbackId = [callbackId copy]; + } } - (NSDictionary *)callbackParameters { From 11af2cc9fec9f4571625bf1c25f90845ae25b26c Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 22 Apr 2020 15:55:57 +0200 Subject: [PATCH 12/14] Synchronise public API methods access --- Adjust/Adjust.m | 120 +++++++++++++----- .../AdjustExample-ObjC/ViewControllerObjC.m | 27 +++- 2 files changed, 106 insertions(+), 41 deletions(-) diff --git a/Adjust/Adjust.m b/Adjust/Adjust.m index 0e0d01042..228d5615f 100644 --- a/Adjust/Adjust.m +++ b/Adjust/Adjust.m @@ -85,44 +85,64 @@ - (id)init { #pragma mark - Public static methods + (void)appDidLaunch:(ADJConfig *)adjustConfig { - [[Adjust getInstance] appDidLaunch:adjustConfig]; + @synchronized (self) { + [[Adjust getInstance] appDidLaunch:adjustConfig]; + } } + (void)trackEvent:(ADJEvent *)event { - [[Adjust getInstance] trackEvent:event]; + @synchronized (self) { + [[Adjust getInstance] trackEvent:event]; + } } + (void)trackSubsessionStart { - [[Adjust getInstance] trackSubsessionStart]; + @synchronized (self) { + [[Adjust getInstance] trackSubsessionStart]; + } } + (void)trackSubsessionEnd { - [[Adjust getInstance] trackSubsessionEnd]; + @synchronized (self) { + [[Adjust getInstance] trackSubsessionEnd]; + } } + (void)setEnabled:(BOOL)enabled { - Adjust *instance = [Adjust getInstance]; - [instance setEnabled:enabled]; + @synchronized (self) { + Adjust *instance = [Adjust getInstance]; + [instance setEnabled:enabled]; + } } + (BOOL)isEnabled { - return [[Adjust getInstance] isEnabled]; + @synchronized (self) { + return [[Adjust getInstance] isEnabled]; + } } + (void)appWillOpenUrl:(NSURL *)url { - [[Adjust getInstance] appWillOpenUrl:url]; + @synchronized (self) { + [[Adjust getInstance] appWillOpenUrl:[url copy]]; + } } + (void)setDeviceToken:(NSData *)deviceToken { - [[Adjust getInstance] setDeviceToken:deviceToken]; + @synchronized (self) { + [[Adjust getInstance] setDeviceToken:[deviceToken copy]]; + } } + (void)setPushToken:(NSString *)pushToken { - [[Adjust getInstance] setPushToken:pushToken]; + @synchronized (self) { + [[Adjust getInstance] setPushToken:[pushToken copy]]; + } } + (void)setOfflineMode:(BOOL)enabled { - [[Adjust getInstance] setOfflineMode:enabled]; + @synchronized (self) { + [[Adjust getInstance] setOfflineMode:enabled]; + } } + (void)sendAdWordsRequest { @@ -130,77 +150,107 @@ + (void)sendAdWordsRequest { } + (NSString *)idfa { - return [[Adjust getInstance] idfa]; + @synchronized (self) { + return [[Adjust getInstance] idfa]; + } } + (NSString *)sdkVersion { - return [[Adjust getInstance] sdkVersion]; + @synchronized (self) { + return [[Adjust getInstance] sdkVersion]; + } } + (NSURL *)convertUniversalLink:(NSURL *)url scheme:(NSString *)scheme { - return [[Adjust getInstance] convertUniversalLink:url scheme:scheme]; + @synchronized (self) { + return [[Adjust getInstance] convertUniversalLink:[url copy] scheme:[scheme copy]]; + } } + (void)sendFirstPackages { - [[Adjust getInstance] sendFirstPackages]; + @synchronized (self) { + [[Adjust getInstance] sendFirstPackages]; + } } + (void)addSessionCallbackParameter:(NSString *)key value:(NSString *)value { - [[Adjust getInstance] addSessionCallbackParameter:key value:value]; - + @synchronized (self) { + [[Adjust getInstance] addSessionCallbackParameter:[key copy] value:[value copy]]; + } } + (void)addSessionPartnerParameter:(NSString *)key value:(NSString *)value { - [[Adjust getInstance] addSessionPartnerParameter:key value:value]; + @synchronized (self) { + [[Adjust getInstance] addSessionPartnerParameter:[key copy] value:[value copy]]; + } } - + (void)removeSessionCallbackParameter:(NSString *)key { - [[Adjust getInstance] removeSessionCallbackParameter:key]; + @synchronized (self) { + [[Adjust getInstance] removeSessionCallbackParameter:[key copy]]; + } } + (void)removeSessionPartnerParameter:(NSString *)key { - [[Adjust getInstance] removeSessionPartnerParameter:key]; + @synchronized (self) { + [[Adjust getInstance] removeSessionPartnerParameter:[key copy]]; + } } + (void)resetSessionCallbackParameters { - [[Adjust getInstance] resetSessionCallbackParameters]; + @synchronized (self) { + [[Adjust getInstance] resetSessionCallbackParameters]; + } } + (void)resetSessionPartnerParameters { - [[Adjust getInstance] resetSessionPartnerParameters]; + @synchronized (self) { + [[Adjust getInstance] resetSessionPartnerParameters]; + } } + (void)gdprForgetMe { - [[Adjust getInstance] gdprForgetMe]; + @synchronized (self) { + [[Adjust getInstance] gdprForgetMe]; + } } + (void)trackAdRevenue:(nonnull NSString *)source payload:(nonnull NSData *)payload { - [[Adjust getInstance] trackAdRevenue:source payload:payload]; + @synchronized (self) { + [[Adjust getInstance] trackAdRevenue:[source copy] payload:[payload copy]]; + } } + (void)disableThirdPartySharing { - [[Adjust getInstance] disableThirdPartySharing]; + @synchronized (self) { + [[Adjust getInstance] disableThirdPartySharing]; + } } + (ADJAttribution *)attribution { - return [[Adjust getInstance] attribution]; + @synchronized (self) { + return [[Adjust getInstance] attribution]; + } } + (NSString *)adid { - return [[Adjust getInstance] adid]; + @synchronized (self) { + return [[Adjust getInstance] adid]; + } } + (void)setTestOptions:(AdjustTestOptions *)testOptions { - if (testOptions.teardown) { - if (defaultInstance != nil) { - [defaultInstance teardown]; + @synchronized (self) { + if (testOptions.teardown) { + if (defaultInstance != nil) { + [defaultInstance teardown]; + } + defaultInstance = nil; + onceToken = 0; + [ADJAdjustFactory teardown:testOptions.deleteState]; } - defaultInstance = nil; - onceToken = 0; - [ADJAdjustFactory teardown:testOptions.deleteState]; + [[Adjust getInstance] setTestOptions:(AdjustTestOptions *)testOptions]; } - [[Adjust getInstance] setTestOptions:(AdjustTestOptions *)testOptions]; } #pragma mark - Public instance methods diff --git a/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m b/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m index 938f4778f..083cf57ff 100644 --- a/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m +++ b/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m @@ -44,12 +44,27 @@ - (IBAction)clickTrackSimpleEvent:(UIButton *)sender { } - (IBAction)clickTrackRevenueEvent:(UIButton *)sender { - ADJEvent *event = [ADJEvent eventWithEventToken:kEventToken2]; - - // Add revenue 1 cent of an EURO. - [event setRevenue:0.01 currency:@"EUR"]; - - [Adjust trackEvent:event]; + NSURL __block *url = [NSURL URLWithString:@"random-url"]; +// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ +// // Add revenue 1 cent of an EURO. +// for (int i = 0; i < 30000; i += 1) { +// [event setRevenue:i currency:@"EUR"]; +// [event setCallbackId:[NSString stringWithFormat:@"%@%d", @"random-id", i]]; +// [event addCallbackParameter:@"foo" value:[NSString stringWithFormat:@"%@%d", @"bar", i]]; +// [event addCallbackParameter:@"key" value:[NSString stringWithFormat:@"%@%d", @"value", i]]; +// } +// }); + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + for (int i = 0; i < 300; i += 1) { + [Adjust appWillOpenUrl:[NSURL URLWithString:[NSString stringWithFormat:@"random-url-%d", i]]]; + } + }); +// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ +// // Add revenue 1 cent of an EURO. +// for (int i = 30000; i < 60000; i += 1) { +// url = [NSURL URLWithString:[NSString stringWithFormat:@"random-url-%d", i]]; +// } +// }); } - (IBAction)clickTrackCallbackEvent:(UIButton *)sender { From a7f064f79b29f62d376a52b921b6785c8e44904c Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 22 Apr 2020 16:01:37 +0200 Subject: [PATCH 13/14] CHANGELOG.md update --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3993dfd71..3251a15ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ### Version 4.21.3 (22nd April 2020) #### Changed - Added copying of each injected mutable property of `ADJEvent` class. -- Sychronised access to callback/partner parameters in `ADJEvent` class. +- Synchronised access to callback/partner parameters in `ADJEvent` class. +- Synchronised access to public API methods in `Adjust` class. #### Fixed - Removed iAd timer. From 608de43725c01db5f203111c5ec8d4fc0c960f6a Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 22 Apr 2020 16:04:20 +0200 Subject: [PATCH 14/14] Put revenue tracking back in AdjustExample-ObjC app --- .../AdjustExample-ObjC/ViewControllerObjC.m | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m b/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m index 083cf57ff..938f4778f 100644 --- a/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m +++ b/examples/AdjustExample-ObjC/AdjustExample-ObjC/ViewControllerObjC.m @@ -44,27 +44,12 @@ - (IBAction)clickTrackSimpleEvent:(UIButton *)sender { } - (IBAction)clickTrackRevenueEvent:(UIButton *)sender { - NSURL __block *url = [NSURL URLWithString:@"random-url"]; -// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ -// // Add revenue 1 cent of an EURO. -// for (int i = 0; i < 30000; i += 1) { -// [event setRevenue:i currency:@"EUR"]; -// [event setCallbackId:[NSString stringWithFormat:@"%@%d", @"random-id", i]]; -// [event addCallbackParameter:@"foo" value:[NSString stringWithFormat:@"%@%d", @"bar", i]]; -// [event addCallbackParameter:@"key" value:[NSString stringWithFormat:@"%@%d", @"value", i]]; -// } -// }); - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - for (int i = 0; i < 300; i += 1) { - [Adjust appWillOpenUrl:[NSURL URLWithString:[NSString stringWithFormat:@"random-url-%d", i]]]; - } - }); -// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ -// // Add revenue 1 cent of an EURO. -// for (int i = 30000; i < 60000; i += 1) { -// url = [NSURL URLWithString:[NSString stringWithFormat:@"random-url-%d", i]]; -// } -// }); + ADJEvent *event = [ADJEvent eventWithEventToken:kEventToken2]; + + // Add revenue 1 cent of an EURO. + [event setRevenue:0.01 currency:@"EUR"]; + + [Adjust trackEvent:event]; } - (IBAction)clickTrackCallbackEvent:(UIButton *)sender {