diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index b531c8135..3b4781dc6 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -411,6 +411,21 @@ - (void)setPushToken:(NSString *)pushToken { }]; } +- (void)logConversionValueUpdate:(NSNumber *)conversionValue + coarseValue:(NSString *)coarseValue + lockWindow:(NSNumber *)lockWindow + andError:(NSError *)error { + [ADJUtil launchInQueue:self.internalQueue + selfInject:self + block:^(ADJActivityHandler * selfI) { + [selfI logConversionValueUpdateI:selfI + conversionValue:conversionValue + coarseValue:coarseValue + lockWindow:lockWindow + andError:error]; + }]; +} + - (void)setGdprForgetMe { [ADJUtil launchInQueue:self.internalQueue selfInject:self @@ -2090,6 +2105,47 @@ - (void)setPushTokenI:(ADJActivityHandler *)selfI } } +- (void)logConversionValueUpdateI:(ADJActivityHandler *)selfI + conversionValue:(NSNumber *)conversionValue + coarseValue:(NSString *)coarseValue + lockWindow:(NSNumber *)lockWindow + andError:(NSError *)error { + if (![selfI isEnabledI:selfI]) { + return; + } + if (!selfI.activityState) { + return; + } + if (selfI.activityState.isGdprForgotten) { + return; + } + + // send info package + double now = [NSDate.date timeIntervalSince1970]; + ADJPackageBuilder *packageBuilder = + [[ADJPackageBuilder alloc] initWithPackageParams:selfI.packageParams + activityState:selfI.activityState + config:selfI.adjustConfig + sessionParameters:selfI.sessionParameters + trackingStatusManager:self.trackingStatusManager + createdAt:now]; + NSDictionary *skanParameters = [NSMutableDictionary dictionary]; + [skanParameters setValue:conversionValue forKey:@"conversion_value"]; + [skanParameters setValue:coarseValue forKey:@"coarse_value"]; + [skanParameters setValue:lockWindow forKey:@"lock_window"]; + [skanParameters setValue:error forKey:@"error"]; + packageBuilder.skanParameters = skanParameters; + + ADJActivityPackage *infoPackage = [packageBuilder buildDebugPackage:@"skan"]; + [selfI.packageHandler addPackage:infoPackage]; + + if (selfI.adjustConfig.eventBufferingEnabled) { + [selfI.logger info:@"Buffered info %@", infoPackage.suffix]; + } else { + [selfI.packageHandler sendFirstPackage]; + } +} + - (void)setGdprForgetMeI:(ADJActivityHandler *)selfI { if (![selfI isEnabledI:selfI]) { return; @@ -2889,6 +2945,10 @@ - (void)checkConversionValue:(ADJResponseData *)responseData { completionHandler:^(NSError *error) { if (error) { // handle error + [self logConversionValueUpdate:conversionValue + coarseValue:coarseValue + lockWindow:lockWindow + andError:error]; } else { // ping old callback if implemented if ([self.adjustDelegate respondsToSelector:@selector(adjustConversionValueUpdated:)]) { @@ -2906,6 +2966,11 @@ - (void)checkConversionValue:(ADJResponseData *)responseData { lockWindow:lockWindow]; }]; } + // log + [self logConversionValueUpdate:conversionValue + coarseValue:coarseValue + lockWindow:lockWindow + andError:nil]; } }]; } diff --git a/Adjust/ADJActivityKind.h b/Adjust/ADJActivityKind.h index b8549052e..dc2395960 100644 --- a/Adjust/ADJActivityKind.h +++ b/Adjust/ADJActivityKind.h @@ -26,7 +26,8 @@ typedef NS_ENUM(int, ADJActivityKind) { ADJActivityKindSubscription = 10, ADJActivityKindThirdPartySharing = 11, ADJActivityKindMeasurementConsent = 12, - ADJActivityKindPurchaseVerification = 13 + ADJActivityKindPurchaseVerification = 13, + ADJActivityKindDebug = 14 }; @interface ADJActivityKindUtil : NSObject diff --git a/Adjust/ADJActivityKind.m b/Adjust/ADJActivityKind.m index a98a6a12d..3ef121d45 100644 --- a/Adjust/ADJActivityKind.m +++ b/Adjust/ADJActivityKind.m @@ -37,6 +37,8 @@ + (ADJActivityKind)activityKindFromString:(NSString *)activityKindString { return ADJActivityKindMeasurementConsent; } else if ([@"purchase_verification" isEqualToString:activityKindString]) { return ADJActivityKindPurchaseVerification; + } else if ([@"debug" isEqualToString:activityKindString]) { + return ADJActivityKindDebug; } else { return ADJActivityKindUnknown; } @@ -68,6 +70,8 @@ + (NSString *)activityKindToString:(ADJActivityKind)activityKind { return @"measurement_consent"; case ADJActivityKindPurchaseVerification: return @"purchase_verification"; + case ADJActivityKindDebug: + return @"debug"; default: return @"unknown"; } diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index f3f802370..9f26888c1 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -30,6 +30,8 @@ @property (nonatomic, strong) NSDictionary * _Nullable deeplinkParameters; +@property (nonatomic, strong) NSDictionary * _Nullable skanParameters; + @property (nonatomic, copy) ADJAttribution * _Nullable attribution; @property (nonatomic, weak) ADJInternalState * _Nullable internalState; @@ -47,6 +49,7 @@ isInDelay:(BOOL)isInDelay; - (ADJActivityPackage * _Nullable)buildInfoPackage:(NSString * _Nullable)infoSource; +- (ADJActivityPackage * _Nullable)buildDebugPackage:(NSString * _Nullable)infoSource; - (ADJActivityPackage * _Nullable)buildAdRevenuePackage:(NSString * _Nullable)source payload:(NSData * _Nullable)payload; diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index 530e601d4..63ce8a062 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -102,6 +102,18 @@ - (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource { return infoPackage; } +- (ADJActivityPackage * _Nullable)buildDebugPackage:(NSString * _Nullable)debugSource{ + NSMutableDictionary *parameters = [self getDebugParameters:debugSource]; + ADJActivityPackage *debugPackage = [self defaultActivityPackage]; + debugPackage.path = @"/sdk_debug"; + debugPackage.activityKind = ADJActivityKindDebug; + debugPackage.suffix = @""; + debugPackage.parameters = parameters; + debugPackage.parameters = [ADJUtil deepCopyOfDictionary:debugPackage.parameters]; + + return debugPackage; +} + - (ADJActivityPackage *)buildAdRevenuePackage:(NSString *)source payload:(NSData *)payload { NSMutableDictionary *parameters = [self getAdRevenueParameters:source payload:payload]; ADJActivityPackage *adRevenuePackage = [self defaultActivityPackage]; @@ -546,6 +558,81 @@ - (NSMutableDictionary *)getInfoParameters:(NSString *)source { return parameters; } + +- (NSMutableDictionary *)getDebugParameters:(NSString *)source { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.buildNumber forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.versionNumber forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.bundleIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDictionary:[self.sessionParameters.callbackParameters copy] forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.clickTime forKey:@"click_time"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deeplink forKey:@"deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.reftag forKey:@"reftag"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.defaultTracker forKey:@"default_tracker"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.attributionDetails forKey:@"details"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.externalDeviceId forKey:@"external_device_id"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.fbAnonymousId forKey:@"fb_anon_id"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.installedAt forKey:@"installed_at"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.packageParams.osVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.deeplinkParameters forKey:@"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 setDate:[ADJUserDefaults getSkadRegisterCallTimestamp] forKey:@"skadn_registered_at"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.skanParameters forKey:@"skan_debug"]; + [ADJPackageBuilder parameters:parameters setString:source forKey:@"source"]; + [ADJPackageBuilder parameters:parameters setDate1970:(double)self.packageParams.startedAt forKey:@"started_at"]; + + if ([self.trackingStatusManager canGetAttStatus]) { + [ADJPackageBuilder parameters:parameters setInt:self.trackingStatusManager.attStatus + forKey:@"att_status"]; + } else { + [ADJPackageBuilder parameters:parameters setInt:self.trackingStatusManager.trackingEnabled + forKey:@"tracking_enabled"]; + } + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.sessionCount forKey:@"session_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"]; + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"]; + } + } + + if (self.attribution != nil) { + [ADJPackageBuilder parameters:parameters setString:self.attribution.adgroup forKey:@"adgroup"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.campaign forKey:@"campaign"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.creative forKey:@"creative"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.trackerName forKey:@"tracker"]; + } + + [self addConsentToParameters:parameters forActivityKind:ADJActivityKindInfo]; + [self addIdfvIfPossibleToParameters:parameters]; + [self injectFeatureFlagsWithParameters:parameters]; + + return parameters; +} + - (NSMutableDictionary *)getAdRevenueParameters:(NSString *)source payload:(NSData *)payload { NSMutableDictionary *parameters = [NSMutableDictionary dictionary];