Skip to content

Commit 14a6d8b

Browse files
authored
Merge pull request #549 from adjust/v4293
Version 4.29.3
2 parents e79ef64 + ee18c10 commit 14a6d8b

File tree

45 files changed

+265
-94
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+265
-94
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 = "4.29.2"
3+
s.version = "4.29.3"
44
s.summary = "This is the iOS SDK of adjust. You can read more about it at http://adjust.com."
55
s.homepage = "https://github.com/adjust/ios_sdk"
66
s.license = { :type => 'MIT', :file => 'MIT-LICENSE' }
77
s.author = { "Christian Wellenbrock" => "[email protected]" }
8-
s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.29.2" }
8+
s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.29.3" }
99
s.ios.deployment_target = '6.0'
1010
s.tvos.deployment_target = '9.0'
1111
s.framework = 'SystemConfiguration'

Adjust.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2266,7 +2266,7 @@
22662266
9679920518BBAE2800394606 /* Project object */ = {
22672267
isa = PBXProject;
22682268
attributes = {
2269-
LastUpgradeCheck = 1240;
2269+
LastUpgradeCheck = 1250;
22702270
ORGANIZATIONNAME = "adjust GmbH";
22712271
TargetAttributes = {
22722272
9615158E1CD2CB2C0022D336 = {

Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1240"
3+
LastUpgradeVersion = "1250"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkIm.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1240"
3+
LastUpgradeVersion = "1250"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkTv.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1240"
3+
LastUpgradeVersion = "1250"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkWebBridge.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1240"
3+
LastUpgradeVersion = "1250"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

Adjust/ADJActivityState.m

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#import "ADJAdjustFactory.h"
1010
#import "ADJActivityState.h"
1111
#import "NSString+ADJAdditions.h"
12+
#import "ADJUtil.h"
1213

1314
static const int kTransactionIdCount = 10;
1415
static NSString *appToken = nil;
@@ -23,7 +24,7 @@ - (id)init {
2324
return nil;
2425
}
2526

26-
[self assignRandomToken];
27+
[self assignRandomToken:[ADJUtil generateRandomUuid]];
2728

2829
self.eventCount = 0;
2930
self.sessionCount = 0;
@@ -81,8 +82,20 @@ - (BOOL)findTransactionId:(NSString *)transactionId {
8182

8283
#pragma mark - Private & helper methods
8384

84-
- (void)assignRandomToken {
85-
self.dedupeToken = [[NSUUID UUID] UUIDString];
85+
- (void)assignRandomToken:(NSString *)randomToken {
86+
// self.secondaryDedupeToken = [[NSUUID UUID] UUIDString];
87+
NSString *persistedDedupeToken = [ADJUtil getPersistedRandomToken];
88+
if (persistedDedupeToken != nil) {
89+
if ((bool)[[NSUUID alloc] initWithUUIDString:persistedDedupeToken]) {
90+
[[ADJAdjustFactory logger] verbose:@"Primary dedupe token successfully read"];
91+
self.dedupeToken = persistedDedupeToken;
92+
self.isPersisted = YES;
93+
return;
94+
}
95+
}
96+
97+
self.dedupeToken = randomToken;
98+
self.isPersisted = [ADJUtil setPersistedRandomToken:self.dedupeToken];
8699
}
87100

88101
- (NSString *)description {
@@ -110,10 +123,10 @@ - (id)initWithCoder:(NSCoder *)decoder {
110123

111124
// Default values for migrating devices.
112125
if ([decoder containsValueForKey:@"uuid"]) {
113-
self.dedupeToken = [decoder decodeObjectForKey:@"uuid"];
126+
[self assignRandomToken:[decoder decodeObjectForKey:@"uuid"]];
114127
}
115128
if (self.dedupeToken == nil) {
116-
[self assignRandomToken];
129+
[self assignRandomToken:[ADJUtil generateRandomUuid]];
117130
}
118131

119132
if ([decoder containsValueForKey:@"transactionIds"]) {

Adjust/ADJPackageBuilder.m

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,11 @@ - (NSMutableDictionary *)getSessionParameters:(BOOL)isInDelay {
397397
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
398398
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
399399
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
400-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
400+
if (self.activityState.isPersisted) {
401+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
402+
} else {
403+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
404+
}
401405
}
402406

403407
if (!isInDelay) {
@@ -461,7 +465,11 @@ - (NSMutableDictionary *)getEventParameters:(BOOL)isInDelay forEventPackage:(ADJ
461465
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
462466
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
463467
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
464-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
468+
if (self.activityState.isPersisted) {
469+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
470+
} else {
471+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
472+
}
465473
}
466474

467475
if (!isInDelay) {
@@ -547,7 +555,11 @@ - (NSMutableDictionary *)getInfoParameters:(NSString *)source {
547555
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
548556
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
549557
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
550-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
558+
if (self.activityState.isPersisted) {
559+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
560+
} else {
561+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
562+
}
551563
}
552564

553565
if (self.attribution != nil) {
@@ -612,7 +624,11 @@ - (NSMutableDictionary *)getAdRevenueParameters:(NSString *)source payload:(NSDa
612624
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
613625
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
614626
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
615-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
627+
if (self.activityState.isPersisted) {
628+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
629+
} else {
630+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
631+
}
616632
}
617633

618634
return parameters;
@@ -688,7 +704,11 @@ - (NSMutableDictionary *)getAdRevenueParameters:(ADJAdRevenue *)adRevenue isInDe
688704
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
689705
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
690706
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
691-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
707+
if (self.activityState.isPersisted) {
708+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
709+
} else {
710+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
711+
}
692712
}
693713

694714
return parameters;
@@ -752,7 +772,11 @@ - (NSMutableDictionary *)getClickParameters:(NSString *)source {
752772
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
753773
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
754774
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
755-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
775+
if (self.activityState.isPersisted) {
776+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
777+
} else {
778+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
779+
}
756780
}
757781

758782
if (self.attribution != nil) {
@@ -808,7 +832,11 @@ - (NSMutableDictionary *)getAttributionParameters:(NSString *)initiatedBy {
808832
}
809833

810834
if (self.activityState != nil) {
811-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
835+
if (self.activityState.isPersisted) {
836+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
837+
} else {
838+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
839+
}
812840
}
813841

814842
return parameters;
@@ -856,7 +884,11 @@ - (NSMutableDictionary *)getGdprParameters {
856884
}
857885

858886
if (self.activityState != nil) {
859-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
887+
if (self.activityState.isPersisted) {
888+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
889+
} else {
890+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
891+
}
860892
}
861893

862894
return parameters;
@@ -919,7 +951,11 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters {
919951
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
920952
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
921953
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
922-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
954+
if (self.activityState.isPersisted) {
955+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
956+
} else {
957+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
958+
}
923959
}
924960

925961
return parameters;
@@ -988,7 +1024,11 @@ - (NSMutableDictionary *)getThirdPartySharingParameters:(nonnull ADJThirdPartySh
9881024
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
9891025
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
9901026
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
991-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
1027+
if (self.activityState.isPersisted) {
1028+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
1029+
} else {
1030+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
1031+
}
9921032
}
9931033

9941034
return parameters;
@@ -1054,7 +1094,11 @@ - (NSMutableDictionary *)getMeasurementConsentParameters:(BOOL)enabled {
10541094
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
10551095
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
10561096
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
1057-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
1097+
if (self.activityState.isPersisted) {
1098+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
1099+
} else {
1100+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
1101+
}
10581102
}
10591103

10601104
return parameters;
@@ -1107,7 +1151,11 @@ - (NSMutableDictionary *)getSubscriptionParameters:(BOOL)isInDelay forSubscripti
11071151
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"];
11081152
[ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"];
11091153
[ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"];
1110-
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
1154+
if (self.activityState.isPersisted) {
1155+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"primary_dedupe_token"];
1156+
} else {
1157+
[ADJPackageBuilder parameters:parameters setString:self.activityState.dedupeToken forKey:@"secondary_dedupe_token"];
1158+
}
11111159
}
11121160

11131161
if (!isInDelay) {

Adjust/ADJUtil.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,10 @@ typedef void (^isInactiveInjected)(BOOL);
143143

144144
+ (NSString *)installedAt;
145145

146+
+ (NSString *)generateRandomUuid;
147+
148+
+ (NSString *)getPersistedRandomToken;
149+
150+
+ (BOOL)setPersistedRandomToken:(NSString *)randomToken;
151+
146152
@end

Adjust/ADJUtil.m

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
static NSRegularExpression *shortUniversalLinkRegex = nil;
4040
static NSRegularExpression *excludedDeeplinkRegex = nil;
4141

42-
static NSString * const kClientSdk = @"ios4.29.2";
42+
static NSString * const kClientSdk = @"ios4.29.3";
4343
static NSString * const kDeeplinkParam = @"deep_link=";
4444
static NSString * const kSchemeDelimiter = @"://";
4545
static NSString * const kDefaultScheme = @"AdjustUniversalScheme";
@@ -1509,4 +1509,62 @@ + (NSString *)installedAt {
15091509
return [ADJUtil formatDate:installTime];
15101510
}
15111511

1512+
+ (NSString *)generateRandomUuid {
1513+
CFUUIDRef newUniqueId = CFUUIDCreate(kCFAllocatorDefault);
1514+
CFStringRef stringRef = CFUUIDCreateString(kCFAllocatorDefault, newUniqueId);
1515+
NSString *uuidString = (__bridge_transfer NSString*)stringRef;
1516+
NSString *lowerUuid = [uuidString lowercaseString];
1517+
CFRelease(newUniqueId);
1518+
return lowerUuid;
1519+
}
1520+
1521+
+ (NSString *)getPersistedRandomToken {
1522+
NSMutableDictionary *keychainItem = [[NSMutableDictionary alloc] init];
1523+
keychainItem[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAfterFirstUnlock;
1524+
keychainItem[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword;
1525+
keychainItem[(__bridge id)kSecAttrAccount] = @"adjust_uuid";
1526+
keychainItem[(__bridge id)kSecAttrService] = @"deviceInfo";
1527+
if (!keychainItem) {
1528+
return nil;
1529+
}
1530+
1531+
keychainItem[(__bridge id)kSecReturnData] = (__bridge id)kCFBooleanTrue;
1532+
keychainItem[(__bridge id)kSecReturnAttributes] = (__bridge id)kCFBooleanTrue;
1533+
CFDictionaryRef result = nil;
1534+
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)keychainItem, (CFTypeRef *)&result);
1535+
if (status != noErr) {
1536+
return nil;
1537+
}
1538+
1539+
NSDictionary *resultDict = (__bridge_transfer NSDictionary *)result;
1540+
NSData *data = resultDict[(__bridge id)kSecValueData];
1541+
if (!data) {
1542+
return nil;
1543+
}
1544+
1545+
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
1546+
}
1547+
1548+
+ (BOOL)setPersistedRandomToken:(NSString *)randomToken {
1549+
NSMutableDictionary *keychainItem = [[NSMutableDictionary alloc] init];
1550+
keychainItem[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAfterFirstUnlock;
1551+
keychainItem[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword;
1552+
keychainItem[(__bridge id)kSecAttrAccount] = @"adjust_uuid";
1553+
keychainItem[(__bridge id)kSecAttrService] = @"deviceInfo";
1554+
keychainItem[(__bridge id)kSecValueData] = [randomToken dataUsingEncoding:NSUTF8StringEncoding];
1555+
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keychainItem, NULL);
1556+
if (status != noErr) {
1557+
[[ADJAdjustFactory logger] warn:@"Primary dedupe token unsuccessfully written"];
1558+
return NO;
1559+
} else {
1560+
NSString *persistedRandomToken = [ADJUtil getPersistedRandomToken];
1561+
if ([randomToken isEqualToString:persistedRandomToken]) {
1562+
[[ADJAdjustFactory logger] debug:@"Primary dedupe token successfully written"];
1563+
return YES;
1564+
} else {
1565+
return NO;
1566+
}
1567+
}
1568+
}
1569+
15121570
@end

0 commit comments

Comments
 (0)