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/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/ADJActivityPackage.h b/Adjust/ADJActivityPackage.h index 71198a51c..d4b88f928 100644 --- a/Adjust/ADJActivityPackage.h +++ b/Adjust/ADJActivityPackage.h @@ -24,6 +24,16 @@ @property (nonatomic, copy) void (^purchaseVerificationCallback)(id); +@property (nonatomic, assign) NSUInteger errorCount; + +@property (nonatomic, copy) NSNumber *firstErrorCode; + +@property (nonatomic, copy) NSNumber *lastErrorCode; + +@property (nonatomic, assign) double waitBeforeSend; + +- (void)addError:(NSNumber *)errorCode; + // Logs @property (nonatomic, copy) NSString *suffix; diff --git a/Adjust/ADJActivityPackage.m b/Adjust/ADJActivityPackage.m index eaec878db..97e9fdb85 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:(NSNumber *)errorCode { + self.errorCount = self.errorCount + 1; + + if (self.firstErrorCode == nil) { + self.firstErrorCode = errorCode; + } else { + self.lastErrorCode = errorCode; + } +} + #pragma mark - NSCoding protocol methods - (id)initWithCoder:(NSCoder *)decoder { @@ -79,6 +89,17 @@ - (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.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; + } + return self; } @@ -92,6 +113,10 @@ - (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.firstErrorCode forKey:@"firstErrorCode"]; + [encoder encodeObject:self.lastErrorCode forKey:@"lastErrorCode"]; + [encoder encodeObject:@(self.waitBeforeSend) forKey:@"waitBeforeSend"]; } @end diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index f57091304..f3f802370 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 @@ -88,10 +90,18 @@ 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; ++ (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/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index fc67e01f5..530e601d4 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -1215,8 +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 + 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"]; } @@ -1253,6 +1271,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 80918f180..7bf6cf1a0 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 @@ -118,6 +125,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]; @@ -127,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]; }); } @@ -212,6 +227,13 @@ - (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); + } + [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]; @@ -252,6 +274,22 @@ - (void)sendFirstI:(ADJPackageHandler *)selfI setString:[ADJUtil formatSeconds1970:[NSDate.date timeIntervalSince1970]] forKey:@"sent_at"]; + [ADJPackageBuilder parameters:sendingParameters + setInt:(int)activityPackage.errorCount + forKey:@"retry_count"]; + [ADJPackageBuilder parameters:sendingParameters + setNumberWithoutRounding:activityPackage.firstErrorCode + forKey:@"first_error"]; + [ADJPackageBuilder parameters:sendingParameters + setNumberWithoutRounding:activityPackage.lastErrorCode + 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]]; } @@ -260,6 +298,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); diff --git a/Adjust/ADJRequestHandler.m b/Adjust/ADJRequestHandler.m index 1b526e245..3834080ed 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.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 + 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]; + } } }]; @@ -343,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; 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/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 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/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). diff --git a/VERSION b/VERSION index bcdb58032..c1a44ab2b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.38.1 +4.38.2