@@ -36,7 +36,7 @@ @interface ADJActivityHandler()
3636@property (nonatomic , retain ) ADJActivityState *activityState;
3737@property (nonatomic , retain ) ADJTimerCycle *timer;
3838@property (nonatomic , retain ) id <ADJLogger> logger;
39- @property (nonatomic , weak ) NSObject <AdjustDelegate> *delegate ;
39+ @property (nonatomic , weak ) NSObject <AdjustDelegate> *adjustDelegate ;
4040@property (nonatomic , copy ) ADJAttribution *attribution;
4141@property (nonatomic , copy ) ADJConfig *adjustConfig;
4242
@@ -76,7 +76,7 @@ - (id)initWithConfig:(ADJConfig *)adjustConfig {
7676 }
7777
7878 self.adjustConfig = adjustConfig;
79- self.delegate = adjustConfig.delegate ;
79+ self.adjustDelegate = adjustConfig.delegate ;
8080
8181 self.logger = ADJAdjustFactory.logger ;
8282 [self addNotificationObserver ];
@@ -109,23 +109,43 @@ - (void)trackEvent:(ADJEvent *)event
109109 });
110110}
111111
112- - (void )finishedTracking : (NSDictionary *)jsonDict {
113- if ([ADJUtil isNull: jsonDict]) return ;
112+ - (void )finishedTracking : (ADJResponseData *)responseData {
113+ // redirect session responses to attribution handler to check for attribution information
114+ if ([responseData isKindOfClass: [ADJSessionResponseData class ]]) {
115+ [self .attributionHandler checkSessionResponse: (ADJSessionResponseData*)responseData];
116+ return ;
117+ }
118+
119+ // check if it's an event response
120+ if ([responseData isKindOfClass: [ADJEventResponseData class ]]) {
121+ [self launchEventResponseTasks: (ADJEventResponseData*)responseData];
122+ return ;
123+ }
124+ }
114125
115- [self launchDeepLink: jsonDict];
116- [self .attributionHandler checkAttribution: jsonDict];
126+ - (void )launchEventResponseTasks : (ADJEventResponseData *)eventResponseData {
127+ dispatch_async (self.internalQueue , ^{
128+ [self launchEventResponseTasksInternal: eventResponseData];
129+ });
130+ }
131+
132+ - (void )launchSessionResponseTasks : (ADJSessionResponseData *)sessionResponseData {
133+ dispatch_async (self.internalQueue , ^{
134+ [self launchSessionResponseTasksInternal: sessionResponseData];
135+ });
117136}
118137
119- - (void )launchDeepLink : (NSDictionary *)jsonDict {
120- if ([ADJUtil isNull: jsonDict]) return ;
138+ - (void )launchAttributionResponseTasks : (ADJAttributionResponseData *)attributionResponseData {
139+ dispatch_async (self.internalQueue , ^{
140+ [self launchAttributionResponseTasksInternal: attributionResponseData];
141+ });
142+ }
121143
122- NSString *deepLink = [jsonDict objectForKey: @" deeplink " ];
144+ - ( void ) launchDeepLink : ( NSString *) deepLink {
123145 if (deepLink == nil ) return ;
124146
125147 NSURL * deepLinkUrl = [NSURL URLWithString: deepLink];
126148
127- [self .logger info: @" Open deep link (%@ )" , deepLink];
128-
129149 BOOL success = [[UIApplication sharedApplication ] openURL: deepLinkUrl];
130150
131151 if (!success) {
@@ -230,11 +250,11 @@ - (void)setDeviceToken:(NSData *)deviceToken {
230250
231251- (void )setIadDate : (NSDate *)iAdImpressionDate withPurchaseDate : (NSDate *)appPurchaseDate {
232252 if (iAdImpressionDate == nil ) {
233- [self .logger verbose :@" iAdImpressionDate not received" ];
253+ [self .logger debug :@" iAdImpressionDate not received" ];
234254 return ;
235255 }
236256
237- [self .logger verbose :@" iAdImpressionDate received: %@ " , iAdImpressionDate];
257+ [self .logger debug :@" iAdImpressionDate received: %@ " , iAdImpressionDate];
238258
239259
240260 double now = [NSDate .date timeIntervalSince1970 ];
@@ -249,6 +269,7 @@ - (void)setIadDate:(NSDate *)iAdImpressionDate withPurchaseDate:(NSDate *)appPur
249269
250270 ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage: @" iad" ];
251271 [self .packageHandler addPackage: clickPackage];
272+ [self .packageHandler sendFirstPackage ];
252273}
253274
254275- (void )setIadDetails : (NSDictionary *)attributionDetails
@@ -259,14 +280,10 @@ - (void)setIadDetails:(NSDictionary *)attributionDetails
259280 [self .logger warn: @" Unable to read iAd details" ];
260281
261282 if (retriesLeft < 0 ) {
262- [self .logger error :@" Reached limit number of retry for iAd" ];
283+ [self .logger warn :@" Limit number of retry for iAd v3 surpassed " ];
263284 return ;
264285 }
265286
266- if (retriesLeft == 0 ) {
267- [self .logger error: @" Reached limit number of retry for iAd, trying iAd v2" ];
268- }
269-
270287 if (error.code == AdjADClientErrorUnknown) {
271288 dispatch_time_t retryTime = dispatch_time (DISPATCH_TIME_NOW, kDelayRetryIad );
272289 dispatch_after (retryTime, dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
@@ -291,32 +308,7 @@ - (void)setIadDetails:(NSDictionary *)attributionDetails
291308
292309 ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage: @" iad3" ];
293310 [self .packageHandler addPackage: clickPackage];
294- }
295-
296- - (BOOL )updateAttribution : (ADJAttribution *)attribution {
297- if (attribution == nil ) {
298- return NO ;
299- }
300- if ([attribution isEqual: self .attribution]) {
301- return NO ;
302- }
303- self.attribution = attribution;
304- [self writeAttribution ];
305-
306- [self launchAttributionDelegate ];
307-
308- return YES ;
309- }
310-
311- - (void )launchAttributionDelegate {
312- if (self.delegate == nil ) {
313- return ;
314- }
315- if (![self .delegate respondsToSelector: @selector (adjustAttributionChanged: )]) {
316- return ;
317- }
318- [self .delegate performSelectorOnMainThread: @selector (adjustAttributionChanged: )
319- withObject: self .attribution waitUntilDone: NO ];
311+ [self .packageHandler sendFirstPackage ];
320312}
321313
322314- (void )setAskingAttribution : (BOOL )askingAttribution {
@@ -364,7 +356,7 @@ - (void)initInternal {
364356 self.attributionHandler = [ADJAdjustFactory attributionHandlerForActivityHandler: self
365357 withAttributionPackage: attributionPackage
366358 startPaused: [self paused ]
367- hasDelegate: ( self .delegate != nil ) ];
359+ hasAttributionChangedDelegate: self .adjustConfig.hasAttributionChangedDelegate ];
368360
369361 self.timer = [ADJTimerCycle timerWithBlock: ^{ [self timerFiredInternal ]; }
370362 queue: self .internalQueue
@@ -489,6 +481,108 @@ - (void)eventInternal:(ADJEvent *)event
489481 [self writeActivityState ];
490482}
491483
484+ - (void ) launchEventResponseTasksInternal : (ADJEventResponseData *)eventResponseData {
485+ // event success callback
486+ if (eventResponseData.success
487+ && [self .adjustDelegate respondsToSelector: @selector (adjustEventTrackingSucceeded: )])
488+ {
489+ [self .logger debug: @" Launching success event tracking delegate" ];
490+ [self .adjustDelegate performSelectorOnMainThread: @selector (adjustEventTrackingSucceeded: )
491+ withObject: [eventResponseData successResponseData ]
492+ waitUntilDone: NO ]; // non-blocking
493+ return ;
494+ }
495+ // event failure callback
496+ if (!eventResponseData.success
497+ && [self .adjustDelegate respondsToSelector: @selector (adjustEventTrackingFailed: )])
498+ {
499+ [self .logger debug: @" Launching failed event tracking delegate" ];
500+ [self .adjustDelegate performSelectorOnMainThread: @selector (adjustEventTrackingFailed: )
501+ withObject: [eventResponseData failureResponseData ]
502+ waitUntilDone: NO ]; // non-blocking
503+ return ;
504+ }
505+ }
506+
507+ - (void ) launchSessionResponseTasksInternal : (ADJSessionResponseData *)sessionResponseData {
508+ BOOL toLaunchAttributionDelegate = [self updateAttribution: sessionResponseData.attribution];
509+
510+ // session success callback
511+ if (sessionResponseData.success
512+ && [self .adjustDelegate respondsToSelector: @selector (adjustSessionTrackingSucceeded: )])
513+ {
514+ [self .logger debug: @" Launching success session tracking delegate" ];
515+ [self .adjustDelegate performSelectorOnMainThread: @selector (adjustSessionTrackingSucceeded: )
516+ withObject: [sessionResponseData successResponseData ]
517+ waitUntilDone: NO ]; // non-blocking
518+ }
519+ // session failure callback
520+ if (!sessionResponseData.success
521+ && [self .adjustDelegate respondsToSelector: @selector (adjustSessionTrackingFailed: )])
522+ {
523+ [self .logger debug: @" Launching failed session tracking delegate" ];
524+ [self .adjustDelegate performSelectorOnMainThread: @selector (adjustSessionTrackingFailed: )
525+ withObject: [sessionResponseData failureResponseData ]
526+ waitUntilDone: NO ]; // non-blocking
527+ }
528+
529+ // try to update and launch the attribution changed delegate blocking
530+ if (toLaunchAttributionDelegate) {
531+ [self .logger debug: @" Launching attribution changed delegate" ];
532+ [self .adjustDelegate performSelectorOnMainThread: @selector (adjustAttributionChanged: )
533+ withObject: sessionResponseData.attribution
534+ waitUntilDone: NO ]; // non-blocking
535+ }
536+
537+ if ([ADJUtil isNull: sessionResponseData.jsonResponse]) {
538+ return ;
539+ }
540+
541+ NSString *deepLink = [sessionResponseData.jsonResponse objectForKey: @" deeplink" ];
542+ if (deepLink == nil ) {
543+ return ;
544+ }
545+
546+ [self .logger info: @" Trying to open deep link (%@ )" , deepLink];
547+
548+ [self performSelectorOnMainThread: @selector (launchDeepLink: )
549+ withObject: deepLink
550+ waitUntilDone: NO ]; // non-blocking
551+ }
552+
553+ - (void ) launchAttributionResponseTasksInternal : (ADJAttributionResponseData *)attributionResponseData {
554+ BOOL toLaunchAttributionDelegate = [self updateAttribution: attributionResponseData.attribution];
555+
556+ // try to update and launch the attribution changed delegate non-blocking
557+ if (toLaunchAttributionDelegate) {
558+ [self .logger debug: @" Launching attribution changed delegate" ];
559+ [self .adjustDelegate performSelectorOnMainThread: @selector (adjustAttributionChanged: )
560+ withObject: attributionResponseData.attribution
561+ waitUntilDone: NO ]; // non-blocking
562+ }
563+ }
564+
565+ - (BOOL )updateAttribution : (ADJAttribution *)attribution {
566+ if (attribution == nil ) {
567+ return NO ;
568+ }
569+ if ([attribution isEqual: self .attribution]) {
570+ return NO ;
571+ }
572+ self.attribution = attribution;
573+ [self writeAttribution ];
574+
575+ if (self.adjustDelegate == nil ) {
576+ return NO ;
577+ }
578+
579+ if (![self .adjustDelegate respondsToSelector: @selector (adjustAttributionChanged: )]) {
580+ return NO ;
581+ }
582+
583+ return YES ;
584+ }
585+
492586- (void ) appWillOpenUrlInternal : (NSURL *)url {
493587 if ([ADJUtil isNull: url]) {
494588 return ;
@@ -525,6 +619,7 @@ - (void) appWillOpenUrlInternal:(NSURL *)url {
525619
526620 ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage: @" deeplink" ];
527621 [self .packageHandler addPackage: clickPackage];
622+ [self .packageHandler sendFirstPackage ];
528623}
529624
530625- (BOOL ) readDeeplinkQueryString : (NSString *)queryString
0 commit comments