Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bfd7ed9
Rename responseData
nonelse Dec 7, 2015
72195ab
Add response data files
nonelse Dec 9, 2015
37f1d10
Rename delegate to attributionChanged
nonelse Dec 9, 2015
fc29006
Response delegate
nonelse Dec 9, 2015
4eb6bf8
README push token
nonelse Dec 15, 2015
3a53340
Delegate for all event/sessions
nonelse Jan 6, 2016
66a00d0
Update example app
nonelse Jan 6, 2016
b33b837
Save non-copied delegates
nonelse Jan 6, 2016
e666217
Update README.md
nonelse Jan 6, 2016
e727bba
Refactor json parsing
nonelse Jan 7, 2016
514b786
Refactor conditionals
nonelse Jan 20, 2016
026c654
Move response delegate to protocol
nonelse Jan 20, 2016
4718248
Split response and attribution tasks
nonelse Jan 20, 2016
d4d21f0
Update README.md
nonelse Jan 21, 2016
d9c6466
Split launch session/attribution
nonelse Feb 1, 2016
8bc9b84
Change iad 3 logs
nonelse Feb 1, 2016
e727f79
Dealloc semaphore
nonelse Feb 1, 2016
cef6fe1
Add response data log
nonelse Feb 1, 2016
e109680
Add tests
nonelse Feb 1, 2016
0fb328b
Send click package
nonelse Feb 16, 2016
5c4e91a
Remove unused function
nonelse Feb 16, 2016
4941df6
Add Session delegate
nonelse Feb 17, 2016
d709b0a
Update tests for session delegate
nonelse Feb 19, 2016
c8e11f6
Update README.md
nonelse Feb 29, 2016
919abfd
Remove activity kind string
nonelse Feb 29, 2016
276a751
Launch deeplink from main thread
nonelse Mar 11, 2016
4d4b0f0
Change log levels
nonelse Mar 11, 2016
89dd4d2
Test send click
nonelse Mar 11, 2016
3cc546c
Removing unused imports
Mar 14, 2016
aaaf408
Oranizing imports for dynamic framework
Mar 14, 2016
5e7b07e
Build script improvements
Mar 14, 2016
4d5ccf9
Changing version number to 4.6.0
Mar 14, 2016
8ed5980
edits README
esamcgv Mar 15, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Adjust.podspec
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
Pod::Spec.new do |s|
s.name = "Adjust"
s.version = "4.5.4"
s.version = "4.6.0"
s.summary = "This is the iOS SDK of adjust. You can read more about it at http://adjust.com."
s.homepage = "http://adjust.com"
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.5.4" }
s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.6.0" }
s.ios.deployment_target = '6.0'
s.tvos.deployment_target = '9.0'
s.framework = 'SystemConfiguration'
Expand Down
508 changes: 294 additions & 214 deletions Adjust.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0710"
LastUpgradeVersion = "0720"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
17 changes: 9 additions & 8 deletions Adjust/ADJActivityHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
//

#import "Adjust.h"
#import "ADJAttribution.h"
#import "ADJResponseData.h"

@protocol ADJActivityHandler <NSObject>

Expand All @@ -18,24 +18,25 @@

- (void)trackEvent:(ADJEvent *)event;

- (void)finishedTracking:(NSDictionary *)jsonDict;
- (void)finishedTracking:(ADJResponseData *)responseData;
- (void)launchEventResponseTasks:(ADJEventResponseData *)eventResponseData;
- (void)launchSessionResponseTasks:(ADJSessionResponseData *)sessionResponseData;
- (void)launchAttributionResponseTasks:(ADJAttributionResponseData *)attributionResponseData;
- (void)setEnabled:(BOOL)enabled;
- (BOOL)isEnabled;
- (void)appWillOpenUrl:(NSURL*)url;
- (void)setDeviceToken:(NSData *)deviceToken;

- (ADJAttribution*) attribution;
- (void) setAttribution:(ADJAttribution*)attribution;
- (void) setAskingAttribution:(BOOL)askingAttribution;
- (void)setAttribution:(ADJAttribution*)attribution;
- (void)setAskingAttribution:(BOOL)askingAttribution;

- (BOOL) updateAttribution:(ADJAttribution*) attribution;
- (void) setIadDate:(NSDate*)iAdImpressionDate withPurchaseDate:(NSDate*)appPurchaseDate;
- (BOOL)updateAttribution:(ADJAttribution *)attribution;
- (void)setIadDate:(NSDate*)iAdImpressionDate withPurchaseDate:(NSDate*)appPurchaseDate;
- (void)setIadDetails:(NSDictionary *)attributionDetails
error:(NSError *)error
retriesLeft:(int)retriesLeft;

- (void) launchAttributionDelegate;

- (void) setOfflineMode:(BOOL)offline;

@end
Expand Down
185 changes: 140 additions & 45 deletions Adjust/ADJActivityHandler.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ @interface ADJActivityHandler()
@property (nonatomic, retain) ADJActivityState *activityState;
@property (nonatomic, retain) ADJTimerCycle *timer;
@property (nonatomic, retain) id<ADJLogger> logger;
@property (nonatomic, weak) NSObject<AdjustDelegate> *delegate;
@property (nonatomic, weak) NSObject<AdjustDelegate> *adjustDelegate;
@property (nonatomic, copy) ADJAttribution *attribution;
@property (nonatomic, copy) ADJConfig *adjustConfig;

Expand Down Expand Up @@ -76,7 +76,7 @@ - (id)initWithConfig:(ADJConfig *)adjustConfig {
}

self.adjustConfig = adjustConfig;
self.delegate = adjustConfig.delegate;
self.adjustDelegate = adjustConfig.delegate;

self.logger = ADJAdjustFactory.logger;
[self addNotificationObserver];
Expand Down Expand Up @@ -109,23 +109,43 @@ - (void)trackEvent:(ADJEvent *)event
});
}

- (void)finishedTracking:(NSDictionary *)jsonDict{
if ([ADJUtil isNull:jsonDict]) return;
- (void)finishedTracking:(ADJResponseData *)responseData {
// redirect session responses to attribution handler to check for attribution information
if ([responseData isKindOfClass:[ADJSessionResponseData class]]) {
[self.attributionHandler checkSessionResponse:(ADJSessionResponseData*)responseData];
return;
}

// check if it's an event response
if ([responseData isKindOfClass:[ADJEventResponseData class]]) {
[self launchEventResponseTasks:(ADJEventResponseData*)responseData];
return;
}
}

[self launchDeepLink:jsonDict];
[self.attributionHandler checkAttribution:jsonDict];
- (void)launchEventResponseTasks:(ADJEventResponseData *)eventResponseData {
dispatch_async(self.internalQueue, ^{
[self launchEventResponseTasksInternal:eventResponseData];
});
}

- (void)launchSessionResponseTasks:(ADJSessionResponseData *)sessionResponseData {
dispatch_async(self.internalQueue, ^{
[self launchSessionResponseTasksInternal:sessionResponseData];
});
}

- (void)launchDeepLink:(NSDictionary *)jsonDict{
if ([ADJUtil isNull:jsonDict]) return;
- (void)launchAttributionResponseTasks:(ADJAttributionResponseData *)attributionResponseData {
dispatch_async(self.internalQueue, ^{
[self launchAttributionResponseTasksInternal:attributionResponseData];
});
}

NSString *deepLink = [jsonDict objectForKey:@"deeplink"];
- (void)launchDeepLink:(NSString *)deepLink{
if (deepLink == nil) return;

NSURL* deepLinkUrl = [NSURL URLWithString:deepLink];

[self.logger info:@"Open deep link (%@)", deepLink];

BOOL success = [[UIApplication sharedApplication] openURL:deepLinkUrl];

if (!success) {
Expand Down Expand Up @@ -230,11 +250,11 @@ - (void)setDeviceToken:(NSData *)deviceToken {

- (void)setIadDate:(NSDate *)iAdImpressionDate withPurchaseDate:(NSDate *)appPurchaseDate {
if (iAdImpressionDate == nil) {
[self.logger verbose:@"iAdImpressionDate not received"];
[self.logger debug:@"iAdImpressionDate not received"];
return;
}

[self.logger verbose:@"iAdImpressionDate received: %@", iAdImpressionDate];
[self.logger debug:@"iAdImpressionDate received: %@", iAdImpressionDate];


double now = [NSDate.date timeIntervalSince1970];
Expand All @@ -249,6 +269,7 @@ - (void)setIadDate:(NSDate *)iAdImpressionDate withPurchaseDate:(NSDate *)appPur

ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"iad"];
[self.packageHandler addPackage:clickPackage];
[self.packageHandler sendFirstPackage];
}

- (void)setIadDetails:(NSDictionary *)attributionDetails
Expand All @@ -259,14 +280,10 @@ - (void)setIadDetails:(NSDictionary *)attributionDetails
[self.logger warn:@"Unable to read iAd details"];

if (retriesLeft < 0) {
[self.logger error:@"Reached limit number of retry for iAd"];
[self.logger warn:@"Limit number of retry for iAd v3 surpassed"];
return;
}

if (retriesLeft == 0) {
[self.logger error:@"Reached limit number of retry for iAd, trying iAd v2"];
}

if (error.code == AdjADClientErrorUnknown) {
dispatch_time_t retryTime = dispatch_time(DISPATCH_TIME_NOW, kDelayRetryIad);
dispatch_after(retryTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
Expand All @@ -291,32 +308,7 @@ - (void)setIadDetails:(NSDictionary *)attributionDetails

ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"iad3"];
[self.packageHandler addPackage:clickPackage];
}

- (BOOL)updateAttribution:(ADJAttribution *)attribution {
if (attribution == nil) {
return NO;
}
if ([attribution isEqual:self.attribution]) {
return NO;
}
self.attribution = attribution;
[self writeAttribution];

[self launchAttributionDelegate];

return YES;
}

- (void)launchAttributionDelegate{
if (self.delegate == nil) {
return;
}
if (![self.delegate respondsToSelector:@selector(adjustAttributionChanged:)]) {
return;
}
[self.delegate performSelectorOnMainThread:@selector(adjustAttributionChanged:)
withObject:self.attribution waitUntilDone:NO];
[self.packageHandler sendFirstPackage];
}

- (void)setAskingAttribution:(BOOL)askingAttribution {
Expand Down Expand Up @@ -364,7 +356,7 @@ - (void)initInternal {
self.attributionHandler = [ADJAdjustFactory attributionHandlerForActivityHandler:self
withAttributionPackage:attributionPackage
startPaused:[self paused]
hasDelegate:(self.delegate != nil)];
hasAttributionChangedDelegate:self.adjustConfig.hasAttributionChangedDelegate];

self.timer = [ADJTimerCycle timerWithBlock:^{ [self timerFiredInternal]; }
queue:self.internalQueue
Expand Down Expand Up @@ -489,6 +481,108 @@ - (void)eventInternal:(ADJEvent *)event
[self writeActivityState];
}

- (void) launchEventResponseTasksInternal:(ADJEventResponseData *)eventResponseData {
// event success callback
if (eventResponseData.success
&& [self.adjustDelegate respondsToSelector:@selector(adjustEventTrackingSucceeded:)])
{
[self.logger debug:@"Launching success event tracking delegate"];
[self.adjustDelegate performSelectorOnMainThread:@selector(adjustEventTrackingSucceeded:)
withObject:[eventResponseData successResponseData]
waitUntilDone:NO]; // non-blocking
return;
}
// event failure callback
if (!eventResponseData.success
&& [self.adjustDelegate respondsToSelector:@selector(adjustEventTrackingFailed:)])
{
[self.logger debug:@"Launching failed event tracking delegate"];
[self.adjustDelegate performSelectorOnMainThread:@selector(adjustEventTrackingFailed:)
withObject:[eventResponseData failureResponseData]
waitUntilDone:NO]; // non-blocking
return;
}
}

- (void) launchSessionResponseTasksInternal:(ADJSessionResponseData *)sessionResponseData {
BOOL toLaunchAttributionDelegate = [self updateAttribution:sessionResponseData.attribution];

// session success callback
if (sessionResponseData.success
&& [self.adjustDelegate respondsToSelector:@selector(adjustSessionTrackingSucceeded:)])
{
[self.logger debug:@"Launching success session tracking delegate"];
[self.adjustDelegate performSelectorOnMainThread:@selector(adjustSessionTrackingSucceeded:)
withObject:[sessionResponseData successResponseData]
waitUntilDone:NO]; // non-blocking
}
// session failure callback
if (!sessionResponseData.success
&& [self.adjustDelegate respondsToSelector:@selector(adjustSessionTrackingFailed:)])
{
[self.logger debug:@"Launching failed session tracking delegate"];
[self.adjustDelegate performSelectorOnMainThread:@selector(adjustSessionTrackingFailed:)
withObject:[sessionResponseData failureResponseData]
waitUntilDone:NO]; // non-blocking
}

// try to update and launch the attribution changed delegate blocking
if (toLaunchAttributionDelegate) {
[self.logger debug:@"Launching attribution changed delegate"];
[self.adjustDelegate performSelectorOnMainThread:@selector(adjustAttributionChanged:)
withObject:sessionResponseData.attribution
waitUntilDone:NO]; // non-blocking
}

if ([ADJUtil isNull:sessionResponseData.jsonResponse]) {
return;
}

NSString *deepLink = [sessionResponseData.jsonResponse objectForKey:@"deeplink"];
if (deepLink == nil) {
return;
}

[self.logger info:@"Trying to open deep link (%@)", deepLink];

[self performSelectorOnMainThread:@selector(launchDeepLink:)
withObject:deepLink
waitUntilDone:NO]; // non-blocking
}

- (void) launchAttributionResponseTasksInternal:(ADJAttributionResponseData *)attributionResponseData {
BOOL toLaunchAttributionDelegate = [self updateAttribution:attributionResponseData.attribution];

// try to update and launch the attribution changed delegate non-blocking
if (toLaunchAttributionDelegate) {
[self.logger debug:@"Launching attribution changed delegate"];
[self.adjustDelegate performSelectorOnMainThread:@selector(adjustAttributionChanged:)
withObject:attributionResponseData.attribution
waitUntilDone:NO]; // non-blocking
}
}

- (BOOL)updateAttribution:(ADJAttribution *)attribution {
if (attribution == nil) {
return NO;
}
if ([attribution isEqual:self.attribution]) {
return NO;
}
self.attribution = attribution;
[self writeAttribution];

if (self.adjustDelegate == nil) {
return NO;
}

if (![self.adjustDelegate respondsToSelector:@selector(adjustAttributionChanged:)]) {
return NO;
}

return YES;
}

- (void) appWillOpenUrlInternal:(NSURL *)url {
if ([ADJUtil isNull:url]) {
return;
Expand Down Expand Up @@ -525,6 +619,7 @@ - (void) appWillOpenUrlInternal:(NSURL *)url {

ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:@"deeplink"];
[self.packageHandler addPackage:clickPackage];
[self.packageHandler sendFirstPackage];
}

- (BOOL) readDeeplinkQueryString:(NSString *)queryString
Expand Down
4 changes: 3 additions & 1 deletion Adjust/ADJAdditions/UIDevice+ADJAdditions.m
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ - (void) adjSetIad:(ADJActivityHandler *) activityHandler

// if no tries for iad v3 left -> iad v2
if (triesV3Left == 0) {
[logger warn:@"Reached limit number of retry for iAd v3. Trying iAd v2"];
[self adjSetIadWithDates:activityHandler ADClientSharedClientInstance:ADClientSharedClientInstance];
return;
}
Expand All @@ -178,8 +179,9 @@ - (void) adjSetIad:(ADJActivityHandler *) activityHandler
ADClientSharedClientInstance:ADClientSharedClientInstance
retriesLeft:(triesV3Left - 1)];

// if no tries for iad v3 left -> iad v2
// if iad v3 not available -> iad v2
if (!isIadV3Avaliable) {
[logger warn:@"iAd v3 not available. Trying iAd v2"];
[self adjSetIadWithDates:activityHandler ADClientSharedClientInstance:ADClientSharedClientInstance];
}
#pragma clang diagnostic pop
Expand Down
2 changes: 1 addition & 1 deletion Adjust/ADJAdjustFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
+ (id<ADJAttributionHandler>)attributionHandlerForActivityHandler:(id<ADJActivityHandler>)activityHandler
withAttributionPackage:(ADJActivityPackage *) attributionPackage
startPaused:(BOOL)startPaused
hasDelegate:(BOOL)hasDelegate;
hasAttributionChangedDelegate:(BOOL)hasAttributionChangedDelegate;

+ (void)setPackageHandler:(id<ADJPackageHandler>)packageHandler;
+ (void)setRequestHandler:(id<ADJRequestHandler>)requestHandler;
Expand Down
6 changes: 3 additions & 3 deletions Adjust/ADJAdjustFactory.m
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,19 @@ + (NSTimeInterval)timerStart {
+ (id<ADJAttributionHandler>)attributionHandlerForActivityHandler:(id<ADJActivityHandler>)activityHandler
withAttributionPackage:(ADJActivityPackage *) attributionPackage
startPaused:(BOOL)startPaused
hasDelegate:(BOOL)hasDelegate
hasAttributionChangedDelegate:(BOOL)hasAttributionChangedDelegate
{
if (internalAttributionHandler == nil) {
return [ADJAttributionHandler handlerWithActivityHandler:activityHandler
withAttributionPackage:attributionPackage
startPaused:startPaused
hasDelegate:hasDelegate];
hasAttributionChangedDelegate:hasAttributionChangedDelegate];
}

return [internalAttributionHandler initWithActivityHandler:activityHandler
withAttributionPackage:attributionPackage
startPaused:startPaused
hasDelegate:hasDelegate];
hasAttributionChangedDelegate:hasAttributionChangedDelegate];
}

+ (void)setPackageHandler:(id<ADJPackageHandler>)packageHandler {
Expand Down
Loading