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/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index d6f1c4697..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 @@ -1446,7 +1420,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]; 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; } diff --git a/Adjust/ADJEvent.m b/Adjust/ADJEvent.m index 87132abb1..ecb6b1cd8 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 @@ -23,86 +24,109 @@ + (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; + if (self == nil) { + return nil; + } self.logger = ADJAdjustFactory.logger; - if (![self checkEventToken:eventToken]) return self; + if (![self checkEventToken:eventToken]) { + return self; + } - _eventToken = eventToken; + _eventToken = [eventToken copy]; 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 { + @synchronized (self) { + NSString *immutableKey = [key copy]; + NSString *immutableValue = [value copy]; - if (![ADJUtil isValidParameter:value - attributeType:@"value" - parameterName:@"Callback"]) return; - - if (self.callbackMutableParameters == nil) { - self.callbackMutableParameters = [[NSMutableDictionary alloc] init]; - } + if (![ADJUtil isValidParameter:immutableKey + attributeType:@"key" + parameterName:@"Callback"]) { + return; + } + if (![ADJUtil isValidParameter:immutableValue + attributeType:@"value" + parameterName:@"Callback"]) { + return; + } - if ([self.callbackMutableParameters objectForKey:key]) { - [self.logger warn:@"key %@ was overwritten", key]; + if (self.callbackMutableParameters == nil) { + self.callbackMutableParameters = [[NSMutableDictionary alloc] init]; + } + if ([self.callbackMutableParameters objectForKey:immutableKey]) { + [self.logger warn:@"Callback parameter key %@ was overwritten", immutableKey]; + } + [self.callbackMutableParameters setObject:immutableValue forKey:immutableKey]; } - - [self.callbackMutableParameters setObject:value forKey:key]; } -- (void) addPartnerParameter:(NSString *)key - value:(NSString *)value { - - if (![ADJUtil isValidParameter:key - attributeType:@"key" - parameterName:@"Partner"]) return; +- (void)addPartnerParameter:(NSString *)key value:(NSString *)value { + @synchronized (self) { + NSString *immutableKey = [key copy]; + NSString *immutableValue = [value copy]; - if (![ADJUtil isValidParameter:value - attributeType:@"value" - parameterName:@"Partner"]) return; - - if (self.partnerMutableParameters == nil) { - self.partnerMutableParameters = [[NSMutableDictionary alloc] init]; - } + if (![ADJUtil isValidParameter:immutableKey + attributeType:@"key" + parameterName:@"Partner"]) { + return; + } + if (![ADJUtil isValidParameter:immutableValue + attributeType:@"value" + parameterName:@"Partner"]) { + return; + } - if ([self.partnerMutableParameters objectForKey:key]) { - [self.logger warn:@"key %@ was overwritten", key]; + if (self.partnerMutableParameters == nil) { + self.partnerMutableParameters = [[NSMutableDictionary alloc] init]; + } + if ([self.partnerMutableParameters objectForKey:immutableKey]) { + [self.logger warn:@"Partner parameter key %@ was overwritten", immutableKey]; + } + [self.partnerMutableParameters setObject:immutableValue forKey:immutableKey]; } - - [self.partnerMutableParameters setObject:value forKey:key]; } -- (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; + @synchronized (self) { + _currency = [currency copy]; + } } -- (void) setTransactionId:(NSString *)transactionId { - _transactionId = transactionId; +- (void)setTransactionId:(NSString *)transactionId { + @synchronized (self) { + _transactionId = [transactionId copy]; + } } - (void)setCallbackId:(NSString *)callbackId { - _callbackId = callbackId; + @synchronized (self) { + _callbackId = [callbackId copy]; + } } -- (NSDictionary *) callbackParameters { - return (NSDictionary *) self.callbackMutableParameters; +- (NSDictionary *)callbackParameters { + @synchronized (self) { + return (NSDictionary *)self.callbackMutableParameters; + } } -- (NSDictionary *) partnerParameters { - return (NSDictionary *) self.partnerMutableParameters; +- (NSDictionary *)partnerParameters { + @synchronized (self) { + return (NSDictionary *)self.partnerMutableParameters; + } } - (BOOL)checkEventToken:(NSString *)eventToken { @@ -117,21 +141,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; @@ -146,12 +166,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; @@ -160,7 +182,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; @@ -168,9 +190,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]; @@ -181,6 +203,7 @@ -(id)copyWithZone:(NSZone *)zone copy->_receipt = [self.receipt copyWithZone:zone]; copy->_emptyReceipt = self.emptyReceipt; } + return copy; } 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"]; diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 6f103c499..ef867f2ed 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"; @@ -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 { 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/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/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/CHANGELOG.md b/CHANGELOG.md index cd92d282e..3251a15ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +### Version 4.21.3 (22nd April 2020) +#### Changed +- Added copying of each injected mutable property of `ADJEvent` class. +- Synchronised access to callback/partner parameters in `ADJEvent` class. +- Synchronised access to public API methods in `Adjust` 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. 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