Skip to content

Commit e8587b7

Browse files
committed
Merge pull request #37 from adjust/transaction-ids
Add optional parameter transactionId to trackRevenue methods
2 parents 439a8f4 + 5d7cd5a commit e8587b7

23 files changed

+197
-82
lines changed

Adjust.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
Pod::Spec.new do |s|
22
s.name = "Adjust"
3-
s.version = "3.0.0"
3+
s.version = "3.1.0"
44
s.summary = "This is the iOS SDK of Adjust. You can read more about it at http://adjust.io."
55
s.homepage = "http://adjust.io"
66
s.license = { :type => 'MIT', :file => 'MIT-LICENSE' }
77
s.author = { "Christian Wellenbrock" => "[email protected]" }
8-
s.source = { :git => "https://github.com/adeven/adjust_ios_sdk.git", :tag => "v3.0.0" }
8+
s.source = { :git => "https://github.com/adeven/adjust_ios_sdk.git", :tag => "v3.1.0" }
99
s.platform = :ios, '4.3'
1010
s.framework = 'AdSupport', 'SystemConfiguration'
1111
s.source_files = 'Adjust/*.{h,m}', 'Adjust/AIAdditions/*.{h,m}'

Adjust/AIActivityHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
withParameters:(NSDictionary *)parameters;
2626

2727
- (void)trackRevenue:(double)amount
28+
transactionId:(NSString *)transactionId
2829
forEvent:(NSString *)eventToken
2930
withParameters:(NSDictionary *)parameters;
3031

Adjust/AIActivityHandler.m

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,22 @@ - (void)trackEvent:(NSString *)eventToken
104104
}
105105

106106
- (void)trackRevenue:(double)amount
107+
transactionId:(NSString *)transactionId
107108
forEvent:(NSString *)eventToken
108109
withParameters:(NSDictionary *)parameters
109110
{
110111
dispatch_async(self.internalQueue, ^{
111-
[self revenueInternal:amount event:eventToken parameters:parameters];
112+
[self revenueInternal:amount transactionId:transactionId event:eventToken parameters:parameters];
112113
});
113114
}
114115

116+
- (void)finishedTrackingWithResponse:(AIResponseData *)response {
117+
if ([self.delegate respondsToSelector:@selector(adjustFinishedTrackingWithResponse:)]) {
118+
[self.delegate performSelectorOnMainThread:@selector(adjustFinishedTrackingWithResponse:)
119+
withObject:response waitUntilDone:NO];
120+
}
121+
}
122+
115123
#pragma mark - internal
116124
- (void)initInternal:(NSString *)yourAppToken {
117125
if (![self checkAppTokenNotNil:yourAppToken]) return;
@@ -230,13 +238,15 @@ - (void)eventInternal:(NSString *)eventToken
230238
}
231239

232240
- (void)revenueInternal:(double)amount
241+
transactionId:(NSString *)transactionId
233242
event:(NSString *)eventToken
234243
parameters:(NSDictionary *)parameters
235244
{
236245
if (![self checkAppTokenNotNil:self.appToken]) return;
237246
if (![self checkActivityState:self.activityState]) return;
238247
if (![self checkAmount:amount]) return;
239248
if (![self checkEventTokenLength:eventToken]) return;
249+
if (![self checkTransactionId:transactionId]) return;
240250

241251
AIPackageBuilder *revenueBuilder = [[AIPackageBuilder alloc] init];
242252
revenueBuilder.amountInCents = amount;
@@ -263,13 +273,6 @@ - (void)revenueInternal:(double)amount
263273
[self.logger debug:@"Event %d (revenue)", self.activityState.eventCount];
264274
}
265275

266-
- (void)finishedTrackingWithResponse:(AIResponseData *)response {
267-
if ([self.delegate respondsToSelector:@selector(adjustFinishedTrackingWithResponse:)]) {
268-
[self.delegate performSelectorOnMainThread:@selector(adjustFinishedTrackingWithResponse:)
269-
withObject:response waitUntilDone:NO];
270-
}
271-
}
272-
273276
#pragma mark - private
274277

275278
// returns whether or not the activity state should be written
@@ -456,4 +459,21 @@ - (BOOL)checkAmount:(double)amount {
456459
return YES;
457460
}
458461

462+
- (BOOL) checkTransactionId:(NSString *)transactionId {
463+
if (transactionId.length == 0) {
464+
return YES; // no transaction ID given
465+
}
466+
467+
if ([self.activityState findTransactionId:transactionId]) {
468+
[self.logger info:@"Skipping duplicate transaction ID '%@'", transactionId];
469+
[self.logger verbose:@"Found transaction ID in %@", self.activityState.transactionIds];
470+
return NO; // transaction ID found -> used already
471+
}
472+
473+
[self.activityState addTransactionId:transactionId];
474+
[self.logger verbose:@"Added transaction ID %@", self.activityState.transactionIds];
475+
// activity state will get written by caller
476+
return YES;
477+
}
478+
459479
@end

Adjust/AIActivityKind.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ AIActivityKind AIActivityKindFromString(NSString *string) {
2222

2323
NSString* AIActivityKindToString(AIActivityKind activityKind) {
2424
switch (activityKind) {
25-
case AIActivityKindSession: return @"session"; break;
26-
case AIActivityKindEvent: return @"event"; break;
27-
case AIActivityKindRevenue: return @"revenue"; break;
28-
case AIActivityKindUnknown: return @"unknown"; break;
25+
case AIActivityKindSession: return @"session";
26+
case AIActivityKindEvent: return @"event";
27+
case AIActivityKindRevenue: return @"revenue";
28+
case AIActivityKindUnknown: return @"unknown";
2929
}
3030
}

Adjust/AIActivityState.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
@property (nonatomic, assign) double lastActivity; // all times in seconds since 1970
2626
@property (nonatomic, assign) double createdAt;
2727

28+
// last ten transaction identifiers
29+
@property (nonatomic, retain) NSMutableArray *transactionIds;
30+
2831
// not persisted, only injected
2932
@property (nonatomic, assign) double lastInterval;
3033

@@ -33,4 +36,8 @@
3336
- (void)injectSessionAttributes:(AIPackageBuilder *)packageBilder;
3437
- (void)injectEventAttributes:(AIPackageBuilder *)packageBilder;
3538

39+
// transaction ID management
40+
- (void)addTransactionId:(NSString *)transactionId;
41+
- (BOOL)findTransactionId:(NSString *)transactionId;
42+
3643
@end

Adjust/AIActivityState.m

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#import "UIDevice+AIAdditions.h"
1212

1313

14+
static const int kTransactionIdCount = 10;
15+
1416
#pragma mark public implementation
1517
@implementation AIActivityState
1618

@@ -29,6 +31,7 @@ - (id)init {
2931
self.lastActivity = -1;
3032
self.createdAt = -1;
3133
self.lastInterval = -1;
34+
self.transactionIds = [NSMutableArray arrayWithCapacity:kTransactionIdCount];
3235

3336
return self;
3437
}
@@ -52,6 +55,22 @@ - (void)injectEventAttributes:(AIPackageBuilder *)builder {
5255
builder.eventCount = self.eventCount;
5356
}
5457

58+
- (void)addTransactionId:(NSString *)transactionId {
59+
if (self.transactionIds == nil) { // create array
60+
self.transactionIds = [NSMutableArray arrayWithCapacity:kTransactionIdCount];
61+
}
62+
63+
if (self.transactionIds.count == kTransactionIdCount) {
64+
[self.transactionIds removeObjectAtIndex:0]; // make space
65+
}
66+
67+
[self.transactionIds addObject:transactionId]; // add new ID
68+
}
69+
70+
- (BOOL)findTransactionId:(NSString *)transactionId {
71+
return [self.transactionIds containsObject:transactionId];
72+
}
73+
5574
- (NSString *)description {
5675
return [NSString stringWithFormat:@"ec:%d sc:%d ssc:%d sl:%.1f ts:%.1f la:%.1f",
5776
self.eventCount, self.sessionCount, self.subsessionCount, self.sessionLength,
@@ -72,26 +91,32 @@ - (id)initWithCoder:(NSCoder *)decoder {
7291
self.createdAt = [decoder decodeDoubleForKey:@"createdAt"];
7392
self.lastActivity = [decoder decodeDoubleForKey:@"lastActivity"];
7493
self.uuid = [decoder decodeObjectForKey:@"uuid"];
94+
self.transactionIds = [decoder decodeObjectForKey:@"transactionIds"];
7595

7696
// create UUID for migrating devices
7797
if (self.uuid == nil) {
7898
self.uuid = [UIDevice.currentDevice aiCreateUuid];
7999
}
80100

101+
if (self.transactionIds == nil) {
102+
self.transactionIds = [NSMutableArray arrayWithCapacity:kTransactionIdCount];
103+
}
104+
81105
self.lastInterval = -1;
82106

83107
return self;
84108
}
85109

86110
- (void)encodeWithCoder:(NSCoder *)encoder {
87-
[encoder encodeInt:self.eventCount forKey:@"eventCount"];
88-
[encoder encodeInt:self.sessionCount forKey:@"sessionCount"];
89-
[encoder encodeInt:self.subsessionCount forKey:@"subsessionCount"];
90-
[encoder encodeDouble:self.sessionLength forKey:@"sessionLength"];
91-
[encoder encodeDouble:self.timeSpent forKey:@"timeSpent"];
92-
[encoder encodeDouble:self.createdAt forKey:@"createdAt"];
93-
[encoder encodeDouble:self.lastActivity forKey:@"lastActivity"];
94-
[encoder encodeObject:self.uuid forKey:@"uuid"];
111+
[encoder encodeInt:self.eventCount forKey:@"eventCount"];
112+
[encoder encodeInt:self.sessionCount forKey:@"sessionCount"];
113+
[encoder encodeInt:self.subsessionCount forKey:@"subsessionCount"];
114+
[encoder encodeDouble:self.sessionLength forKey:@"sessionLength"];
115+
[encoder encodeDouble:self.timeSpent forKey:@"timeSpent"];
116+
[encoder encodeDouble:self.createdAt forKey:@"createdAt"];
117+
[encoder encodeDouble:self.lastActivity forKey:@"lastActivity"];
118+
[encoder encodeObject:self.uuid forKey:@"uuid"];
119+
[encoder encodeObject:self.transactionIds forKey:@"transactionIds"];
95120
}
96121

97122

Adjust/AIAdditions/NSString+AIAdditions.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ - (NSString *)aiTrim {
1818

1919
- (NSString *)aiQuote {
2020
if (self == nil) {
21-
return self;
21+
return nil;
2222
}
2323

24-
if ([self rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]].location != NSNotFound) {
25-
return [NSString stringWithFormat:@"'%@'", self];
24+
if ([self rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]].location == NSNotFound) {
25+
return self;
2626
}
27-
return self;
27+
return [NSString stringWithFormat:@"'%@'", self];
2828
}
2929

3030
- (NSString *)aiMd5 {

Adjust/AIAdjustFactory.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ @implementation AIAdjustFactory
2626
if (internalPackageHandler == nil) {
2727
return [AIPackageHandler handlerWithActivityHandler:activityHandler];
2828
}
29-
29+
3030
return [internalPackageHandler initWithActivityHandler:activityHandler];
3131
}
3232

Adjust/AIRequestHandler.m

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,28 +71,25 @@ - (void)sendInternal:(AIActivityPackage *)package {
7171
if (error != nil) {
7272
AIResponseData *responseData = [AIResponseData dataWithError:error.localizedDescription];
7373
responseData.willRetry = YES;
74-
[self.packageHandler finishedTrackingActivity:package withResponse:responseData];
7574
[self.logger error:@"%@. (%@) Will retry later.", package.failureMessage, responseData.error];
75+
[self.packageHandler finishedTrackingActivity:package withResponse:responseData];
7676
[self.packageHandler closeFirstPackage];
7777
return;
7878
}
7979

8080
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
81+
AIResponseData *responseData = [AIResponseData dataWithJsonString:responseString];
8182

82-
// wrong status code
83-
if (response.statusCode != 200) {
84-
AIResponseData *responseData = [AIResponseData dataWithJsonString:responseString];
85-
[self.packageHandler finishedTrackingActivity:package withResponse:responseData];
83+
if (response.statusCode == 200) {
84+
// success
85+
responseData.success = YES;
86+
[self.logger info:@"%@", package.successMessage];
87+
} else {
88+
// wrong status code
8689
[self.logger error:@"%@. (%@)", package.failureMessage, responseData.error];
87-
[self.packageHandler sendNextPackage];
88-
return;
8990
}
9091

91-
// success
92-
AIResponseData *responseData = [AIResponseData dataWithJsonString:responseString];
93-
responseData.success = YES;
9492
[self.packageHandler finishedTrackingActivity:package withResponse:responseData];
95-
[self.logger info:@"%@", package.successMessage];
9693
[self.packageHandler sendNextPackage];
9794
}
9895

Adjust/AIResponseData.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#pragma mark set by SDK
2121

2222
// the kind of activity (AIActivityKindSession etc.)
23-
// see the AIActivity definition above
23+
// see the AIActivityKind definition
2424
@property (nonatomic, assign) AIActivityKind activityKind;
2525

2626
// true when the activity was tracked successfully
@@ -45,14 +45,15 @@
4545
// tracker name of current device
4646
@property (nonatomic, copy) NSString *trackerName;
4747

48+
// returns human readable version of activityKind
49+
// (session, event, revenue), see above
50+
- (NSString *)activityKindString;
51+
52+
#pragma mark internals
4853
+ (AIResponseData *)dataWithJsonString:(NSString *)string;
4954
+ (AIResponseData *)dataWithError:(NSString *)error;
5055

5156
- (id)initWithJsonString:(NSString *)string;
5257
- (id)initWithError:(NSString *)error;
5358

54-
// returns human readable version of activityKind
55-
// (session, event, revenue), see above
56-
- (NSString *)activityKindString;
57-
5859
@end

0 commit comments

Comments
 (0)