From c0d5d13cca6fcd0ba520fa103db02a5a7c492e48 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 24 May 2023 14:22:25 +0200 Subject: [PATCH 1/9] Add error params to activity packages --- Adjust/ADJActivityPackage.h | 8 ++++++++ Adjust/ADJActivityPackage.m | 20 ++++++++++++++++++++ Adjust/ADJPackageHandler.m | 16 ++++++++++++++++ Adjust/ADJRequestHandler.m | 17 ++++++++++------- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/Adjust/ADJActivityPackage.h b/Adjust/ADJActivityPackage.h index 71198a51c..578bd5e01 100644 --- a/Adjust/ADJActivityPackage.h +++ b/Adjust/ADJActivityPackage.h @@ -24,6 +24,14 @@ @property (nonatomic, copy) void (^purchaseVerificationCallback)(id); +@property (nonatomic, assign) NSUInteger errorCount; + +@property (nonatomic, copy) NSString *firstErrorMessage; + +@property (nonatomic, copy) NSString *lastErrorMessage; + +- (void)addError:(NSString *)errorMessage; + // Logs @property (nonatomic, copy) NSString *suffix; diff --git a/Adjust/ADJActivityPackage.m b/Adjust/ADJActivityPackage.m index eaec878db..80af79219 100644 --- a/Adjust/ADJActivityPackage.m +++ b/Adjust/ADJActivityPackage.m @@ -60,6 +60,16 @@ - (NSString *)failureMessage { return [NSString stringWithFormat:@"Failed to track %@%@", [ADJActivityKindUtil activityKindToString:self.activityKind], self.suffix]; } +- (void)addError:(NSString *)errorMessage { + self.errorCount = self.errorCount + 1; + + if (self.firstErrorMessage == nil) { + self.firstErrorMessage = errorMessage; + } else { + self.lastErrorMessage = errorMessage; + } +} + #pragma mark - NSCoding protocol methods - (id)initWithCoder:(NSCoder *)decoder { @@ -79,6 +89,13 @@ - (id)initWithCoder:(NSCoder *)decoder { NSString *kindString = [decoder decodeObjectForKey:@"kind"]; self.activityKind = [ADJActivityKindUtil activityKindFromString:kindString]; + id errorCountObject = [decoder decodeObjectForKey:@"errorCount"]; + if (errorCountObject != nil && [errorCountObject isKindOfClass:[NSNumber class]]) { + self.errorCount = ((NSNumber *) errorCountObject).unsignedIntegerValue; + } + self.firstErrorMessage = [decoder decodeObjectForKey:@"firstErrorMessage"]; + self.lastErrorMessage = [decoder decodeObjectForKey:@"lastErrorMessage"]; + return self; } @@ -92,6 +109,9 @@ - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.parameters forKey:@"parameters"]; [encoder encodeObject:self.callbackParameters forKey:@"callbackParameters"]; [encoder encodeObject:self.partnerParameters forKey:@"partnerParameters"]; + [encoder encodeObject:@(self.errorCount) forKey:@"errorCount"]; + [encoder encodeObject:self.firstErrorMessage forKey:@"firstErrorMessage"]; + [encoder encodeObject:self.lastErrorMessage forKey:@"lastErrorMessage"]; } @end diff --git a/Adjust/ADJPackageHandler.m b/Adjust/ADJPackageHandler.m index 80918f180..9861d460c 100644 --- a/Adjust/ADJPackageHandler.m +++ b/Adjust/ADJPackageHandler.m @@ -118,6 +118,12 @@ - (void)closeFirstPackage:(ADJResponseData *)responseData { self.lastPackageRetriesCount++; + [ADJUtil launchInQueue:self.internalQueue + selfInject:self + block:^(ADJPackageHandler* selfI) { + [selfI writePackageQueueS:selfI]; + }]; + NSTimeInterval waitTime; if (responseData.activityKind == ADJActivityKindSession && [ADJUserDefaults getInstallTracked] == NO) { waitTime = [ADJUtil waitingTime:self.lastPackageRetriesCount backoffStrategy:self.backoffStrategyForInstallSession]; @@ -252,6 +258,16 @@ - (void)sendFirstI:(ADJPackageHandler *)selfI setString:[ADJUtil formatSeconds1970:[NSDate.date timeIntervalSince1970]] forKey:@"sent_at"]; + [ADJPackageBuilder parameters:sendingParameters + setInt:(int)activityPackage.errorCount + forKey:@"error_count"]; + [ADJPackageBuilder parameters:sendingParameters + setString:activityPackage.firstErrorMessage + forKey:@"first_error"]; + [ADJPackageBuilder parameters:sendingParameters + setString:activityPackage.lastErrorMessage + forKey:@"last_error"]; + [selfI.requestHandler sendPackageByPOST:activityPackage sendingParameters:[sendingParameters copy]]; } diff --git a/Adjust/ADJRequestHandler.m b/Adjust/ADJRequestHandler.m index 1b526e245..32fd1fb1a 100644 --- a/Adjust/ADJRequestHandler.m +++ b/Adjust/ADJRequestHandler.m @@ -231,14 +231,17 @@ - (void)sendNSURLSessionRequest:(NSMutableURLRequest *)request [self.logger debug:@"Request succeeded with current URL strategy"]; [self.urlStrategy resetAfterSuccess]; [self.responseCallback responseCallback:responseData]; - } else if ([self.urlStrategy shouldRetryAfterFailure:responseData.activityKind]) { - [self.logger debug:@"Request failed with current URL strategy, but it will be retried with new one"]; - [self retryWithResponseData:responseData - methodTypeInfo:methodTypeInfo]; } else { - [self.logger debug:@"Request failed with current URL strategy and it will not be retried"]; - // Stop retrying with different type and return to caller - [self.responseCallback responseCallback:responseData]; + [responseData.sdkPackage addError:responseData.message]; + if ([self.urlStrategy shouldRetryAfterFailure:responseData.activityKind]) { + [self.logger debug:@"Request failed with current URL strategy, but it will be retried with new one"]; + [self retryWithResponseData:responseData + methodTypeInfo:methodTypeInfo]; + } else { + [self.logger debug:@"Request failed with current URL strategy and it will not be retried"]; + // Stop retrying with different type and return to caller + [self.responseCallback responseCallback:responseData]; + } } }]; From 2bbcc6d63bebbece7ffbb32791befb442129a18b Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 3 Jan 2024 13:32:00 +0100 Subject: [PATCH 2/9] feat: add wait_time and wait_total concepts --- Adjust/ADJActivityPackage.h | 2 ++ Adjust/ADJActivityPackage.m | 7 ++++++- Adjust/ADJPackageBuilder.h | 4 ++++ Adjust/ADJPackageBuilder.m | 8 ++++++++ Adjust/ADJPackageHandler.m | 25 ++++++++++++++++++++++++- 5 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Adjust/ADJActivityPackage.h b/Adjust/ADJActivityPackage.h index 578bd5e01..28fd40d76 100644 --- a/Adjust/ADJActivityPackage.h +++ b/Adjust/ADJActivityPackage.h @@ -30,6 +30,8 @@ @property (nonatomic, copy) NSString *lastErrorMessage; +@property (nonatomic, assign) double waitBeforeSend; + - (void)addError:(NSString *)errorMessage; // Logs diff --git a/Adjust/ADJActivityPackage.m b/Adjust/ADJActivityPackage.m index 80af79219..943f76330 100644 --- a/Adjust/ADJActivityPackage.m +++ b/Adjust/ADJActivityPackage.m @@ -91,10 +91,14 @@ - (id)initWithCoder:(NSCoder *)decoder { id errorCountObject = [decoder decodeObjectForKey:@"errorCount"]; if (errorCountObject != nil && [errorCountObject isKindOfClass:[NSNumber class]]) { - self.errorCount = ((NSNumber *) errorCountObject).unsignedIntegerValue; + self.errorCount = ((NSNumber *)errorCountObject).unsignedIntegerValue; } self.firstErrorMessage = [decoder decodeObjectForKey:@"firstErrorMessage"]; self.lastErrorMessage = [decoder decodeObjectForKey:@"lastErrorMessage"]; + id waitBeforeSendObject = [decoder decodeObjectForKey:@"waitBeforeSend"]; + if (waitBeforeSendObject != nil && [waitBeforeSendObject isKindOfClass:[NSNumber class]]) { + self.waitBeforeSend = ((NSNumber *)waitBeforeSendObject).doubleValue; + } return self; } @@ -112,6 +116,7 @@ - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:@(self.errorCount) forKey:@"errorCount"]; [encoder encodeObject:self.firstErrorMessage forKey:@"firstErrorMessage"]; [encoder encodeObject:self.lastErrorMessage forKey:@"lastErrorMessage"]; + [encoder encodeObject:@(self.waitBeforeSend) forKey:@"waitBeforeSend"]; } @end diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index f57091304..939f158ba 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -88,6 +88,10 @@ setInt:(int)value forKey:(NSString * _Nullable)key; ++ (void)parameters:(NSMutableDictionary * _Nullable)parameters + setDouble:(double)value + forKey:(NSString * _Nullable)key; + + (void)parameters:(NSMutableDictionary * _Nullable)parameters setDate1970:(double)value forKey:(NSString * _Nullable)key; diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index fc67e01f5..885d0cb78 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -1253,6 +1253,14 @@ + (void)parameters:(NSMutableDictionary *)parameters setInt:(int)value forKey:(N [ADJPackageBuilder parameters:parameters setString:valueString forKey:key]; } ++ (void)parameters:(NSMutableDictionary *)parameters setDouble:(double)value forKey:(NSString *)key { + if (value <= 0.0) { + return; + } + NSString *valueString = [NSString stringWithFormat:@"%.2f", value]; + [ADJPackageBuilder parameters:parameters setString:valueString forKey:key]; +} + + (void)parameters:(NSMutableDictionary *)parameters setDate1970:(double)value forKey:(NSString *)key { if (value < 0) { return; diff --git a/Adjust/ADJPackageHandler.m b/Adjust/ADJPackageHandler.m index 9861d460c..2af5c73d4 100644 --- a/Adjust/ADJPackageHandler.m +++ b/Adjust/ADJPackageHandler.m @@ -32,6 +32,9 @@ @interface ADJPackageHandler() @property (nonatomic, weak) id activityHandler; @property (nonatomic, weak) id logger; @property (nonatomic, assign) NSInteger lastPackageRetriesCount; +@property (nonatomic, assign) BOOL isRetrying; +@property (nonatomic, assign) NSTimeInterval retryStartedAt; +@property (nonatomic, assign) double totalWaitTime; @end @@ -50,6 +53,8 @@ - (id)initWithActivityHandler:(id)activityHandler self.backoffStrategy = [ADJAdjustFactory packageHandlerBackoffStrategy]; self.backoffStrategyForInstallSession = [ADJAdjustFactory installSessionBackoffStrategy]; self.lastPackageRetriesCount = 0; + self.isRetrying = NO; + self.totalWaitTime = 0.0; [ADJUtil launchInQueue:self.internalQueue selfInject:self @@ -101,6 +106,8 @@ - (void)responseCallback:(ADJResponseData *)responseData { - (void)sendNextPackage:(ADJResponseData *)responseData { self.lastPackageRetriesCount = 0; + self.isRetrying = NO; + self.retryStartedAt = 0.0; [ADJUtil launchInQueue:self.internalQueue selfInject:self @@ -133,9 +140,11 @@ - (void)closeFirstPackage:(ADJResponseData *)responseData { NSString *waitTimeFormatted = [ADJUtil secondsNumberFormat:waitTime]; [self.logger verbose:@"Waiting for %@ seconds before retrying the %d time", waitTimeFormatted, self.lastPackageRetriesCount]; + self.totalWaitTime += waitTime; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(waitTime * NSEC_PER_SEC)), self.internalQueue, ^{ [self.logger verbose:@"Package handler finished waiting"]; dispatch_semaphore_signal(self.sendingSemaphore); + responseData.sdkPackage.waitBeforeSend += waitTime; [self sendFirstPackage]; }); } @@ -218,6 +227,10 @@ - (void)initI:(ADJPackageHandler *)selfI - (void)addI:(ADJPackageHandler *)selfI package:(ADJActivityPackage *)newPackage { + if (self.isRetrying == YES) { + NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; + newPackage.waitBeforeSend = self.totalWaitTime - (now - self.retryStartedAt); + } [selfI.packageQueue addObject:newPackage]; [selfI.logger debug:@"Added package %d (%@)", selfI.packageQueue.count, newPackage]; @@ -260,13 +273,19 @@ - (void)sendFirstI:(ADJPackageHandler *)selfI [ADJPackageBuilder parameters:sendingParameters setInt:(int)activityPackage.errorCount - forKey:@"error_count"]; + forKey:@"retry_count"]; [ADJPackageBuilder parameters:sendingParameters setString:activityPackage.firstErrorMessage forKey:@"first_error"]; [ADJPackageBuilder parameters:sendingParameters setString:activityPackage.lastErrorMessage forKey:@"last_error"]; + [ADJPackageBuilder parameters:sendingParameters + setDouble:self.totalWaitTime + forKey:@"wait_total"]; + [ADJPackageBuilder parameters:sendingParameters + setDouble:activityPackage.waitBeforeSend + forKey:@"wait_time"]; [selfI.requestHandler sendPackageByPOST:activityPackage sendingParameters:[sendingParameters copy]]; @@ -276,6 +295,10 @@ - (void)sendNextI:(ADJPackageHandler *)selfI { if ([selfI.packageQueue count] > 0) { [selfI.packageQueue removeObjectAtIndex:0]; [selfI writePackageQueueS:selfI]; + } else { + // at this point, the queue has been emptied + // reset total_wait in this moment to allow all requests to populate total_wait + selfI.totalWaitTime = 0.0; } dispatch_semaphore_signal(selfI.sendingSemaphore); From 2267982c45f2cddc794e170fa3df17f95476e05f Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 3 Jan 2024 14:09:36 +0100 Subject: [PATCH 3/9] feat: add sending of send_in_background_enabled parameter --- Adjust/ADJPackageBuilder.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index 885d0cb78..afd3092e6 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -1217,6 +1217,8 @@ - (void)addIdfvIfPossibleToParameters:(NSMutableDictionary *)parameters { - (void)injectFeatureFlagsWithParameters:(NSMutableDictionary *)parameters { [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.sendInBackground + forKey:@"send_in_background_enabled"]; if (self.adjustConfig.coppaCompliantEnabled == YES) { [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"ff_coppa"]; } From d4c662a52ac10824f059bfef8f113794fc701a16 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 3 Jan 2024 15:55:56 +0100 Subject: [PATCH 4/9] feat: add offline_mode_enabled and foreground/background params --- Adjust/ADJActivityHandler.m | 29 +++++++++++++++++------------ Adjust/ADJPackageBuilder.h | 2 ++ Adjust/ADJPackageBuilder.m | 20 ++++++++++++++++++-- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index d4c67e515..fca4dd592 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -480,6 +480,7 @@ - (void)sendAdServicesClickPackage:(ADJActivityHandler *)selfI sessionParameters:self.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; + clickBuilder.internalState = selfI.internalState; ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:ADJAdServicesPackageKey @@ -684,6 +685,7 @@ - (void)trackAttStatusUpdateI:(ADJActivityHandler *)selfI { sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; + infoBuilder.internalState = selfI.internalState; ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"att"]; [selfI.packageHandler addPackage:infoPackage]; @@ -1119,6 +1121,7 @@ - (void)transferSessionPackageI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; + sessionBuilder.internalState = selfI.internalState; ADJActivityPackage *sessionPackage = [sessionBuilder buildSessionPackage:[selfI.internalState isInDelayedStart]]; [selfI.packageHandler addPackage:sessionPackage]; [selfI.packageHandler sendFirstPackage]; @@ -1194,6 +1197,7 @@ - (void)eventI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; + eventBuilder.internalState = selfI.internalState; ADJActivityPackage *eventPackage = [eventBuilder buildEventPackage:event isInDelay:[selfI.internalState isInDelayedStart]]; [selfI.packageHandler addPackage:eventPackage]; @@ -1235,7 +1239,7 @@ - (void)adRevenueI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + adRevenueBuilder.internalState = selfI.internalState; ADJActivityPackage *adRevenuePackage = [adRevenueBuilder buildAdRevenuePackage:source payload:payload]; [selfI.packageHandler addPackage:adRevenuePackage]; if (selfI.adjustConfig.eventBufferingEnabled) { @@ -1267,7 +1271,7 @@ - (void)trackSubscriptionI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + subscriptionBuilder.internalState = selfI.internalState; ADJActivityPackage *subscriptionPackage = [subscriptionBuilder buildSubscriptionPackage:subscription isInDelay:[selfI.internalState isInDelayedStart]]; [selfI.packageHandler addPackage:subscriptionPackage]; @@ -1316,7 +1320,7 @@ - (void)disableThirdPartySharingI:(ADJActivityHandler *)selfI { sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + dtpsBuilder.internalState = selfI.internalState; ADJActivityPackage *dtpsPackage = [dtpsBuilder buildDisableThirdPartySharingPackage]; [selfI.packageHandler addPackage:dtpsPackage]; @@ -1357,7 +1361,7 @@ - (BOOL)trackThirdPartySharingI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + tpsBuilder.internalState = selfI.internalState; ADJActivityPackage *dtpsPackage = [tpsBuilder buildThirdPartySharingPackage:thirdPartySharing]; [selfI.packageHandler addPackage:dtpsPackage]; @@ -1394,7 +1398,7 @@ - (BOOL)trackMeasurementConsentI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + tpsBuilder.internalState = selfI.internalState; ADJActivityPackage *mcPackage = [tpsBuilder buildMeasurementConsentPackage:enabled]; [selfI.packageHandler addPackage:mcPackage]; @@ -1433,7 +1437,7 @@ - (void)trackAdRevenueI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + adRevenueBuilder.internalState = selfI.internalState; ADJActivityPackage *adRevenuePackage = [adRevenueBuilder buildAdRevenuePackage:adRevenue isInDelay:[selfI.internalState isInDelayedStart]]; [selfI.packageHandler addPackage:adRevenuePackage]; @@ -1500,7 +1504,7 @@ - (void)verifyPurchaseI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + purchaseVerificationBuilder.internalState = selfI.internalState; ADJActivityPackage *purchaseVerificationPackage = [purchaseVerificationBuilder buildPurchaseVerificationPackage:purchase]; purchaseVerificationPackage.purchaseVerificationCallback = completionHandler; [selfI.purchaseVerificationHandler sendPurchaseVerificationPackage:purchaseVerificationPackage]; @@ -1917,7 +1921,7 @@ - (void)appWillOpenUrlI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + clickBuilder.internalState = selfI.internalState; clickBuilder.deeplinkParameters = [adjustDeepLinks copy]; clickBuilder.attribution = deeplinkAttribution; clickBuilder.clickTime = clickTime; @@ -2021,7 +2025,7 @@ - (void)setDeviceTokenI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + infoBuilder.internalState = selfI.internalState; ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"push"]; [selfI.packageHandler addPackage:infoPackage]; @@ -2070,7 +2074,7 @@ - (void)setPushTokenI:(ADJActivityHandler *)selfI sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + infoBuilder.internalState = selfI.internalState; ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"push"]; [selfI.packageHandler addPackage:infoPackage]; @@ -2111,7 +2115,7 @@ - (void)setGdprForgetMeI:(ADJActivityHandler *)selfI { sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + gdprBuilder.internalState = selfI.internalState; ADJActivityPackage *gdprPackage = [gdprBuilder buildGdprPackage]; [selfI.packageHandler addPackage:gdprPackage]; @@ -2183,6 +2187,7 @@ - (void)checkLinkMeI:(ADJActivityHandler *)selfI { sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; + clickBuilder.internalState = selfI.internalState; clickBuilder.clickTime = [NSDate dateWithTimeIntervalSince1970:now]; ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"linkme" linkMeUrl:pasteboardUrlString]; [selfI.sdkClickHandler sendSdkClick:clickPackage]; @@ -2940,7 +2945,7 @@ - (void)disableThirdPartySharingForCoppaEnabledI:(ADJActivityHandler *)selfI { sessionParameters:selfI.sessionParameters trackingStatusManager:self.trackingStatusManager createdAt:now]; - + tpsBuilder.internalState = selfI.internalState; ADJActivityPackage *dtpsPackage = [tpsBuilder buildThirdPartySharingPackage:thirdPartySharing]; [selfI.packageHandler addPackage:dtpsPackage]; diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index 939f158ba..0ea2c2544 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -32,6 +32,8 @@ @property (nonatomic, copy) ADJAttribution * _Nullable attribution; +@property (nonatomic, weak) ADJInternalState * _Nullable internalState; + - (id _Nullable)initWithPackageParams:(ADJPackageParams * _Nullable)packageParams activityState:(ADJActivityState * _Nullable)activityState config:(ADJConfig * _Nullable)adjustConfig diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index afd3092e6..530e601d4 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -1215,10 +1215,26 @@ - (void)addIdfvIfPossibleToParameters:(NSMutableDictionary *)parameters { } - (void)injectFeatureFlagsWithParameters:(NSMutableDictionary *)parameters { - [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled + [ADJPackageBuilder parameters:parameters + setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; - [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.sendInBackground + [ADJPackageBuilder parameters:parameters + setBool:self.adjustConfig.sendInBackground forKey:@"send_in_background_enabled"]; + if (self.internalState != nil) { + [ADJPackageBuilder parameters:parameters + setBool:self.internalState.isOffline + forKey:@"offline_mode_enabled"]; + if (self.internalState.isInForeground == YES) { + [ADJPackageBuilder parameters:parameters + setBool:YES + forKey:@"foreground"]; + } else { + [ADJPackageBuilder parameters:parameters + setBool:YES + forKey:@"background"]; + } + } if (self.adjustConfig.coppaCompliantEnabled == YES) { [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"ff_coppa"]; } From 4285d621e0b13bcc52eba1e9e955a0abbffaf57f Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 4 Jan 2024 16:24:25 +0100 Subject: [PATCH 5/9] feat: add enqueue_size parameter --- Adjust/ADJPackageHandler.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Adjust/ADJPackageHandler.m b/Adjust/ADJPackageHandler.m index 2af5c73d4..4a30db710 100644 --- a/Adjust/ADJPackageHandler.m +++ b/Adjust/ADJPackageHandler.m @@ -231,6 +231,9 @@ - (void)addI:(ADJPackageHandler *)selfI NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; newPackage.waitBeforeSend = self.totalWaitTime - (now - self.retryStartedAt); } + [ADJPackageBuilder parameters:newPackage.parameters + setInt:(int)selfI.packageQueue.count + forKey:@"enqueue_size"]; [selfI.packageQueue addObject:newPackage]; [selfI.logger debug:@"Added package %d (%@)", selfI.packageQueue.count, newPackage]; From caa89c9dea1f0249714161dcf86c6e9c5a946bbe Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 30 Apr 2024 13:20:52 +0200 Subject: [PATCH 6/9] refac: switch to usage of error codes instead of messages --- Adjust/ADJActivityPackage.h | 6 +++--- Adjust/ADJActivityPackage.m | 16 ++++++++-------- Adjust/ADJPackageBuilder.h | 4 ++++ Adjust/ADJPackageHandler.m | 4 ++-- Adjust/ADJRequestHandler.m | 3 ++- Adjust/ADJResponseData.h | 2 ++ Adjust/ADJResponseData.m | 4 ++-- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/Adjust/ADJActivityPackage.h b/Adjust/ADJActivityPackage.h index 28fd40d76..d4b88f928 100644 --- a/Adjust/ADJActivityPackage.h +++ b/Adjust/ADJActivityPackage.h @@ -26,13 +26,13 @@ @property (nonatomic, assign) NSUInteger errorCount; -@property (nonatomic, copy) NSString *firstErrorMessage; +@property (nonatomic, copy) NSNumber *firstErrorCode; -@property (nonatomic, copy) NSString *lastErrorMessage; +@property (nonatomic, copy) NSNumber *lastErrorCode; @property (nonatomic, assign) double waitBeforeSend; -- (void)addError:(NSString *)errorMessage; +- (void)addError:(NSNumber *)errorCode; // Logs diff --git a/Adjust/ADJActivityPackage.m b/Adjust/ADJActivityPackage.m index 943f76330..97e9fdb85 100644 --- a/Adjust/ADJActivityPackage.m +++ b/Adjust/ADJActivityPackage.m @@ -60,13 +60,13 @@ - (NSString *)failureMessage { return [NSString stringWithFormat:@"Failed to track %@%@", [ADJActivityKindUtil activityKindToString:self.activityKind], self.suffix]; } -- (void)addError:(NSString *)errorMessage { +- (void)addError:(NSNumber *)errorCode { self.errorCount = self.errorCount + 1; - if (self.firstErrorMessage == nil) { - self.firstErrorMessage = errorMessage; + if (self.firstErrorCode == nil) { + self.firstErrorCode = errorCode; } else { - self.lastErrorMessage = errorMessage; + self.lastErrorCode = errorCode; } } @@ -93,8 +93,8 @@ - (id)initWithCoder:(NSCoder *)decoder { if (errorCountObject != nil && [errorCountObject isKindOfClass:[NSNumber class]]) { self.errorCount = ((NSNumber *)errorCountObject).unsignedIntegerValue; } - self.firstErrorMessage = [decoder decodeObjectForKey:@"firstErrorMessage"]; - self.lastErrorMessage = [decoder decodeObjectForKey:@"lastErrorMessage"]; + self.firstErrorCode = [decoder decodeObjectForKey:@"firstErrorCode"]; + self.lastErrorCode = [decoder decodeObjectForKey:@"lastErrorCode"]; id waitBeforeSendObject = [decoder decodeObjectForKey:@"waitBeforeSend"]; if (waitBeforeSendObject != nil && [waitBeforeSendObject isKindOfClass:[NSNumber class]]) { self.waitBeforeSend = ((NSNumber *)waitBeforeSendObject).doubleValue; @@ -114,8 +114,8 @@ - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.callbackParameters forKey:@"callbackParameters"]; [encoder encodeObject:self.partnerParameters forKey:@"partnerParameters"]; [encoder encodeObject:@(self.errorCount) forKey:@"errorCount"]; - [encoder encodeObject:self.firstErrorMessage forKey:@"firstErrorMessage"]; - [encoder encodeObject:self.lastErrorMessage forKey:@"lastErrorMessage"]; + [encoder encodeObject:self.firstErrorCode forKey:@"firstErrorCode"]; + [encoder encodeObject:self.lastErrorCode forKey:@"lastErrorCode"]; [encoder encodeObject:@(self.waitBeforeSend) forKey:@"waitBeforeSend"]; } diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index 0ea2c2544..f3f802370 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -98,6 +98,10 @@ setDate1970:(double)value forKey:(NSString * _Nullable)key; ++ (void)parameters:(NSMutableDictionary * _Nullable)parameters +setNumberWithoutRounding:(NSNumber * _Nullable)value + forKey:(NSString * _Nullable)key; + + (BOOL)isAdServicesPackage:(ADJActivityPackage * _Nullable)activityPackage; + (void)addConsentDataToParameters:(NSMutableDictionary * _Nullable)parameters diff --git a/Adjust/ADJPackageHandler.m b/Adjust/ADJPackageHandler.m index 4a30db710..7bf6cf1a0 100644 --- a/Adjust/ADJPackageHandler.m +++ b/Adjust/ADJPackageHandler.m @@ -278,10 +278,10 @@ - (void)sendFirstI:(ADJPackageHandler *)selfI setInt:(int)activityPackage.errorCount forKey:@"retry_count"]; [ADJPackageBuilder parameters:sendingParameters - setString:activityPackage.firstErrorMessage + setNumberWithoutRounding:activityPackage.firstErrorCode forKey:@"first_error"]; [ADJPackageBuilder parameters:sendingParameters - setString:activityPackage.lastErrorMessage + setNumberWithoutRounding:activityPackage.lastErrorCode forKey:@"last_error"]; [ADJPackageBuilder parameters:sendingParameters setDouble:self.totalWaitTime diff --git a/Adjust/ADJRequestHandler.m b/Adjust/ADJRequestHandler.m index 32fd1fb1a..3834080ed 100644 --- a/Adjust/ADJRequestHandler.m +++ b/Adjust/ADJRequestHandler.m @@ -232,7 +232,7 @@ - (void)sendNSURLSessionRequest:(NSMutableURLRequest *)request [self.urlStrategy resetAfterSuccess]; [self.responseCallback responseCallback:responseData]; } else { - [responseData.sdkPackage addError:responseData.message]; + [responseData.sdkPackage addError:responseData.errorCode]; if ([self.urlStrategy shouldRetryAfterFailure:responseData.activityKind]) { [self.logger debug:@"Request failed with current URL strategy, but it will be retried with new one"]; [self retryWithResponseData:responseData @@ -346,6 +346,7 @@ - (void)handleResponseWithData:(NSData *)data // Connection error if (responseError != nil) { responseData.message = responseError.description; + responseData.errorCode = [NSNumber numberWithInteger:responseError.code]; return; } if ([ADJUtil isNull:data]) { diff --git a/Adjust/ADJResponseData.h b/Adjust/ADJResponseData.h index ee62b6587..473c0ad19 100644 --- a/Adjust/ADJResponseData.h +++ b/Adjust/ADJResponseData.h @@ -29,6 +29,8 @@ typedef NS_ENUM(int, ADJTrackingState) { @property (nonatomic, copy) NSString *adid; +@property (nonatomic, copy) NSNumber *errorCode; + @property (nonatomic, assign) BOOL success; @property (nonatomic, assign) BOOL willRetry; diff --git a/Adjust/ADJResponseData.m b/Adjust/ADJResponseData.m index 93a5a95ee..1d7e46c0a 100644 --- a/Adjust/ADJResponseData.m +++ b/Adjust/ADJResponseData.m @@ -11,8 +11,7 @@ @implementation ADJResponseData -- (id)init -{ +- (id)init { self = [super init]; if (self == nil) { @@ -90,6 +89,7 @@ - (id)copyWithZone:(NSZone *)zone { copy.trackingState = self.trackingState; copy.jsonResponse = [self.jsonResponse copyWithZone:zone]; copy.attribution = [self.attribution copyWithZone:zone]; + copy.errorCode = [self.errorCode copyWithZone:zone]; } return copy; From a652b5a6d454142988423ab51869798e7b453c10 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 30 Apr 2024 17:23:36 +0200 Subject: [PATCH 7/9] chore: minor updates to the nutrition label --- Adjust/PrivacyInfo.xcprivacy | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/Adjust/PrivacyInfo.xcprivacy b/Adjust/PrivacyInfo.xcprivacy index 710a42d1e..af2d9c588 100644 --- a/Adjust/PrivacyInfo.xcprivacy +++ b/Adjust/PrivacyInfo.xcprivacy @@ -41,38 +41,23 @@ NSPrivacyCollectedDataTypeLinked NSPrivacyCollectedDataTypeTracking - - NSPrivacyCollectedDataTypePurposes - - NSPrivacyCollectedDataTypePurposeAnalytics - NSPrivacyCollectedDataTypePurposeAppFunctionality - - - - NSPrivacyCollectedDataType - NSPrivacyCollectedDataTypeAdvertisingData - NSPrivacyCollectedDataTypeLinked - - NSPrivacyCollectedDataTypeTracking NSPrivacyCollectedDataTypePurposes + NSPrivacyCollectedDataTypePurposeAnalytics NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising - NSPrivacyCollectedDataTypePurposeDeveloperAdvertising NSPrivacyCollectedDataType NSPrivacyCollectedDataTypeProductInteraction NSPrivacyCollectedDataTypeLinked - + NSPrivacyCollectedDataTypeTracking NSPrivacyCollectedDataTypePurposes NSPrivacyCollectedDataTypePurposeAnalytics - NSPrivacyCollectedDataTypePurposeAppFunctionality - NSPrivacyCollectedDataTypePurposeProductPersonalization From 0abbed847fbc93f0f6e4cadc57c52ddfab1febe6 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 30 Apr 2024 17:27:00 +0200 Subject: [PATCH 8/9] feat: update version number to 4.38.2 --- Adjust.podspec | 4 ++-- Adjust/ADJUtil.m | 2 +- Adjust/Adjust.h | 2 +- AdjustBridge/AdjustBridgeRegister.m | 2 +- VERSION | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust.podspec b/Adjust.podspec index 684efaaea..814bb6143 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.38.1" + s.version = "4.38.2" 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 = { "Adjust" => "sdk@adjust.com" } - s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.38.1" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.38.2" } s.ios.deployment_target = '9.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 43a430e46..d6104ae65 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -35,7 +35,7 @@ static NSRegularExpression *shortUniversalLinkRegex = nil; static NSRegularExpression *excludedDeeplinkRegex = nil; -static NSString * const kClientSdk = @"ios4.38.1"; +static NSString * const kClientSdk = @"ios4.38.2"; 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 9ce2cd029..d4b1039c3 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust SDK // -// V4.38.1 +// V4.38.2 // Created by Christian Wellenbrock (@wellle) on 23rd July 2013. // Copyright (c) 2012-2021 Adjust GmbH. All rights reserved. // diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index e3cd4716b..8a6cf87cd 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -280,7 +280,7 @@ + (NSString *)adjust_js { if (this.sdkPrefix) { return this.sdkPrefix; } else { - return 'web-bridge4.38.1'; + return 'web-bridge4.38.2'; } }, setTestOptions: function(testOptions) { diff --git a/VERSION b/VERSION index bcdb58032..c1a44ab2b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.38.1 +4.38.2 From 8fb39fe2704e6642c8078dd128b2c70f3fd55595 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 30 Apr 2024 17:27:07 +0200 Subject: [PATCH 9/9] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb78919f1..913660c9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 4.38.2 (30th April 2024) +#### Added +- Added sending of the additional SDK observability parameters for debugging purposes. + +--- + ### Version 4.38.1 (10th April 2024) #### Fixed - Removed nullability type specifier warnings (https://github.com/adjust/ios_sdk/issues/703).