Skip to content

Commit 334c261

Browse files
authored
Merge pull request #606 from adjust/v4300
Version 4.30.0
2 parents f0de0b0 + 128c289 commit 334c261

File tree

41 files changed

+346
-65
lines changed

Some content is hidden

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

41 files changed

+346
-65
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.7"
3+
s.version = "4.30.0"
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 = { "Adjust GmbH" => "[email protected]" }
8-
s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.29.7" }
8+
s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.30.0" }
99
s.ios.deployment_target = '9.0'
1010
s.tvos.deployment_target = '9.0'
1111
s.framework = 'SystemConfiguration'

Adjust/ADJActivityHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
- (void)trackSubscription:(ADJSubscription * _Nullable)subscription;
112112
- (void)updateAttStatusFromUserCallback:(int)newAttStatusFromUser;
113113
- (void)trackAdRevenue:(ADJAdRevenue * _Nullable)adRevenue;
114+
- (void)checkForNewAttStatus;
114115

115116
- (ADJPackageParams * _Nullable)packageParams;
116117
- (ADJActivityState * _Nullable)activityState;

Adjust/ADJActivityHandler.m

Lines changed: 127 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,14 @@ - (void)trackAdRevenue:(ADJAdRevenue *)adRevenue {
776776
}];
777777
}
778778

779+
- (void)checkForNewAttStatus {
780+
[ADJUtil launchInQueue:self.internalQueue
781+
selfInject:self
782+
block:^(ADJActivityHandler * selfI) {
783+
[selfI checkForNewAttStatusI:selfI];
784+
}];
785+
}
786+
779787
- (void)writeActivityState {
780788
[ADJUtil launchInQueue:self.internalQueue
781789
selfInject:self
@@ -914,7 +922,7 @@ - (void)initI:(ADJActivityHandler *)selfI
914922
if (selfI.adjustConfig.eventBufferingEnabled) {
915923
[selfI.logger info:@"Event buffering is enabled"];
916924
}
917-
925+
918926
if (selfI.adjustConfig.defaultTracker != nil) {
919927
[selfI.logger info:@"Default tracker: '%@'", selfI.adjustConfig.defaultTracker];
920928
}
@@ -1034,7 +1042,9 @@ - (void)startI:(ADJActivityHandler *)selfI {
10341042
}
10351043

10361044
[selfI updateHandlersStatusAndSendI:selfI];
1037-
1045+
1046+
[selfI processCoppaComplianceI:selfI];
1047+
10381048
[selfI processSessionI:selfI];
10391049

10401050
[selfI checkAttributionStateI:selfI];
@@ -1064,6 +1074,8 @@ - (void)processSessionI:(ADJActivityHandler *)selfI {
10641074
if ([ADJUserDefaults getGdprForgetMe]) {
10651075
[selfI setGdprForgetMeI:selfI];
10661076
} else {
1077+
[selfI processCoppaComplianceI:selfI];
1078+
10671079
// check if disable third party sharing request came, then send it first
10681080
if ([ADJUserDefaults getDisableThirdPartySharing]) {
10691081
[selfI disableThirdPartySharingI:selfI];
@@ -1356,6 +1368,10 @@ - (void)disableThirdPartySharingI:(ADJActivityHandler *)selfI {
13561368
if (selfI.activityState.isThirdPartySharingDisabled) {
13571369
return;
13581370
}
1371+
if (selfI.adjustConfig.coppaCompliantEnabled) {
1372+
[selfI.logger warn:@"Call to disable third party sharing API ignored, already done when COPPA enabled"];
1373+
return;
1374+
}
13591375

13601376
[ADJUtil launchSynchronisedWithObject:[ADJActivityState class]
13611377
block:^{
@@ -1399,6 +1415,10 @@ - (BOOL)trackThirdPartySharingI:(ADJActivityHandler *)selfI
13991415
if (selfI.activityState.isGdprForgotten) {
14001416
return NO;
14011417
}
1418+
if (selfI.adjustConfig.coppaCompliantEnabled) {
1419+
[selfI.logger warn:@"Calling third party sharing API not allowed when COPPA enabled"];
1420+
return NO;
1421+
}
14021422

14031423
double now = [NSDate.date timeIntervalSince1970];
14041424

@@ -1497,6 +1517,23 @@ - (void)trackAdRevenueI:(ADJActivityHandler *)selfI
14971517
}
14981518
}
14991519

1520+
- (void)checkForNewAttStatusI:(ADJActivityHandler *)selfI {
1521+
if (!selfI.activityState) {
1522+
return;
1523+
}
1524+
if (![selfI isEnabledI:selfI]) {
1525+
return;
1526+
}
1527+
if (selfI.activityState.isGdprForgotten) {
1528+
return;
1529+
}
1530+
if (!selfI.trackingStatusManager) {
1531+
return;
1532+
}
1533+
1534+
[selfI.trackingStatusManager checkForNewAttStatus];
1535+
}
1536+
15001537
- (void)launchEventResponseTasksI:(ADJActivityHandler *)selfI
15011538
eventResponseData:(ADJEventResponseData *)eventResponseData {
15021539
[selfI updateAdidI:selfI adid:eventResponseData.adid];
@@ -1709,29 +1746,18 @@ - (void)setEnabledI:(ADJActivityHandler *)selfI enabled:(BOOL)enabled {
17091746

17101747
// Check if upon enabling install has been tracked.
17111748
if (enabled) {
1712-
if (![ADJUserDefaults getInstallTracked]) {
1713-
double now = [NSDate.date timeIntervalSince1970];
1714-
[self trackNewSessionI:now withActivityHandler:selfI];
1715-
}
1716-
NSData *deviceToken = [ADJUserDefaults getPushTokenData];
1717-
if (deviceToken != nil && ![selfI.activityState.deviceToken isEqualToString:[ADJUtil convertDeviceToken:deviceToken]]) {
1718-
[self setDeviceToken:deviceToken];
1719-
}
1720-
NSString *pushToken = [ADJUserDefaults getPushTokenString];
1721-
if (pushToken != nil && ![selfI.activityState.deviceToken isEqualToString:pushToken]) {
1722-
[self setPushToken:pushToken];
1723-
}
17241749
if ([ADJUserDefaults getGdprForgetMe]) {
17251750
[selfI setGdprForgetMe];
17261751
} else {
1752+
[selfI processCoppaComplianceI:selfI];
17271753
if ([ADJUserDefaults getDisableThirdPartySharing]) {
17281754
[selfI disableThirdPartySharing];
17291755
}
17301756
if (selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray != nil) {
17311757
for (ADJThirdPartySharing *thirdPartySharing
17321758
in selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray)
17331759
{
1734-
[selfI trackThirdPartySharing:thirdPartySharing];
1760+
[selfI trackThirdPartySharingI:selfI thirdPartySharing:thirdPartySharing];
17351761
}
17361762

17371763
selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray = nil;
@@ -1745,6 +1771,19 @@ - (void)setEnabledI:(ADJActivityHandler *)selfI enabled:(BOOL)enabled {
17451771
}
17461772

17471773
}
1774+
1775+
if (![ADJUserDefaults getInstallTracked]) {
1776+
double now = [NSDate.date timeIntervalSince1970];
1777+
[self trackNewSessionI:now withActivityHandler:selfI];
1778+
}
1779+
NSData *deviceToken = [ADJUserDefaults getPushTokenData];
1780+
if (deviceToken != nil && ![selfI.activityState.deviceToken isEqualToString:[ADJUtil convertDeviceToken:deviceToken]]) {
1781+
[self setDeviceToken:deviceToken];
1782+
}
1783+
NSString *pushToken = [ADJUserDefaults getPushTokenString];
1784+
if (pushToken != nil && ![selfI.activityState.deviceToken isEqualToString:pushToken]) {
1785+
[self setPushToken:pushToken];
1786+
}
17481787
if (selfI.adjustConfig.allowiAdInfoReading == YES) {
17491788
[selfI checkForiAdI:selfI];
17501789
}
@@ -2791,6 +2830,78 @@ - (void)updateAttStatusFromUserCallback:(int)newAttStatusFromUser {
27912830
[self.trackingStatusManager updateAttStatusFromUserCallback:newAttStatusFromUser];
27922831
}
27932832

2833+
- (void)processCoppaComplianceI:(ADJActivityHandler *)selfI {
2834+
if (!selfI.adjustConfig.coppaCompliantEnabled) {
2835+
[self resetThirdPartySharingCoppaActivityStateI:selfI];
2836+
return;
2837+
}
2838+
2839+
[self disableThirdPartySharingForCoppaEnabledI:selfI];
2840+
}
2841+
2842+
- (void)disableThirdPartySharingForCoppaEnabledI:(ADJActivityHandler *)selfI {
2843+
if (![selfI shouldDisableThirdPartySharingWhenCoppaEnabled:selfI]) {
2844+
return;
2845+
}
2846+
2847+
[ADJUtil launchSynchronisedWithObject:[ADJActivityState class]
2848+
block:^{
2849+
selfI.activityState.isThirdPartySharingDisabledForCoppa = YES;
2850+
}];
2851+
[selfI writeActivityStateI:selfI];
2852+
2853+
ADJThirdPartySharing *thirdPartySharing = [[ADJThirdPartySharing alloc] initWithIsEnabledNumberBool:[NSNumber numberWithBool:NO]];
2854+
2855+
double now = [NSDate.date timeIntervalSince1970];
2856+
2857+
// build package
2858+
ADJPackageBuilder *tpsBuilder = [[ADJPackageBuilder alloc]
2859+
initWithPackageParams:selfI.packageParams
2860+
activityState:selfI.activityState
2861+
config:selfI.adjustConfig
2862+
sessionParameters:selfI.sessionParameters
2863+
trackingStatusManager:self.trackingStatusManager
2864+
createdAt:now];
2865+
2866+
ADJActivityPackage *dtpsPackage = [tpsBuilder buildThirdPartySharingPackage:thirdPartySharing];
2867+
2868+
[selfI.packageHandler addPackage:dtpsPackage];
2869+
2870+
if (selfI.adjustConfig.eventBufferingEnabled) {
2871+
[selfI.logger info:@"Buffered event %@", dtpsPackage.suffix];
2872+
} else {
2873+
[selfI.packageHandler sendFirstPackage];
2874+
}
2875+
}
2876+
2877+
- (void)resetThirdPartySharingCoppaActivityStateI:(ADJActivityHandler *)selfI {
2878+
if (selfI.activityState == nil) {
2879+
return;
2880+
}
2881+
2882+
if(selfI.activityState.isThirdPartySharingDisabledForCoppa) {
2883+
[ADJUtil launchSynchronisedWithObject:[ADJActivityState class]
2884+
block:^{
2885+
selfI.activityState.isThirdPartySharingDisabledForCoppa = NO;
2886+
}];
2887+
[selfI writeActivityStateI:selfI];
2888+
}
2889+
}
2890+
2891+
- (BOOL)shouldDisableThirdPartySharingWhenCoppaEnabled:(ADJActivityHandler *)selfI {
2892+
if (selfI.activityState == nil) {
2893+
return NO;
2894+
}
2895+
if (![selfI isEnabledI:selfI]) {
2896+
return NO;
2897+
}
2898+
if (selfI.activityState.isGdprForgotten) {
2899+
return NO;
2900+
}
2901+
2902+
return !selfI.activityState.isThirdPartySharingDisabledForCoppa;
2903+
}
2904+
27942905
@end
27952906

27962907
@interface ADJTrackingStatusManager ()
@@ -2864,4 +2975,5 @@ - (BOOL)updateAttStatus:(int)readAttStatus {
28642975

28652976
return YES;
28662977
}
2978+
28672979
@end

Adjust/ADJActivityState.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
@property (nonatomic, assign) BOOL isGdprForgotten;
1616
@property (nonatomic, assign) BOOL askingAttribution;
1717
@property (nonatomic, assign) BOOL isThirdPartySharingDisabled;
18+
@property (nonatomic, assign) BOOL isThirdPartySharingDisabledForCoppa;
1819

1920
@property (nonatomic, copy) NSString *dedupeToken;
2021
@property (nonatomic, copy) NSString *deviceToken;

Adjust/ADJActivityState.m

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ - (id)init {
3737
self.isGdprForgotten = NO;
3838
self.askingAttribution = NO;
3939
self.isThirdPartySharingDisabled = NO;
40+
self.isThirdPartySharingDisabledForCoppa = NO;
4041
self.deviceToken = nil;
4142
self.transactionIds = [NSMutableArray arrayWithCapacity:kTransactionIdCount];
4243
self.updatePackages = NO;
@@ -98,11 +99,11 @@ - (void)assignRandomToken:(NSString *)randomToken {
9899
}
99100

100101
- (NSString *)description {
101-
return [NSString stringWithFormat:@"ec:%d sc:%d ssc:%d ask:%d sl:%.1f ts:%.1f la:%.1f dt:%@ gdprf:%d dtps:%d att:%d",
102+
return [NSString stringWithFormat:@"ec:%d sc:%d ssc:%d ask:%d sl:%.1f ts:%.1f la:%.1f dt:%@ gdprf:%d dtps:%d dtpsc:%d att:%d",
102103
self.eventCount, self.sessionCount,
103104
self.subsessionCount, self.askingAttribution, self.sessionLength,
104105
self.timeSpent, self.lastActivity, self.deviceToken,
105-
self.isGdprForgotten, self.isThirdPartySharingDisabled, self.trackingManagerAuthorizationStatus];
106+
self.isGdprForgotten, self.isThirdPartySharingDisabled, self.isThirdPartySharingDisabledForCoppa, self.trackingManagerAuthorizationStatus];
106107
}
107108

108109
#pragma mark - NSCoding protocol methods
@@ -158,6 +159,12 @@ - (id)initWithCoder:(NSCoder *)decoder {
158159
} else {
159160
self.isThirdPartySharingDisabled = NO;
160161
}
162+
163+
if ([decoder containsValueForKey:@"isThirdPartySharingDisabledForCoppa"]) {
164+
self.isThirdPartySharingDisabledForCoppa = [decoder decodeBoolForKey:@"isThirdPartySharingDisabledForCoppa"];
165+
} else {
166+
self.isThirdPartySharingDisabledForCoppa = NO;
167+
}
161168

162169
if ([decoder containsValueForKey:@"deviceToken"]) {
163170
self.deviceToken = [decoder decodeObjectForKey:@"deviceToken"];
@@ -202,6 +209,7 @@ - (void)encodeWithCoder:(NSCoder *)encoder {
202209
[encoder encodeBool:self.isGdprForgotten forKey:@"isGdprForgotten"];
203210
[encoder encodeBool:self.askingAttribution forKey:@"askingAttribution"];
204211
[encoder encodeBool:self.isThirdPartySharingDisabled forKey:@"isThirdPartySharingDisabled"];
212+
[encoder encodeBool:self.isThirdPartySharingDisabledForCoppa forKey:@"isThirdPartySharingDisabledForCoppa"];
205213
[encoder encodeObject:self.deviceToken forKey:@"deviceToken"];
206214
[encoder encodeBool:self.updatePackages forKey:@"updatePackages"];
207215
[encoder encodeObject:self.adid forKey:@"adid"];
@@ -229,6 +237,7 @@ - (id)copyWithZone:(NSZone *)zone {
229237
copy.lastActivity = self.lastActivity;
230238
copy.askingAttribution = self.askingAttribution;
231239
copy.isThirdPartySharingDisabled = self.isThirdPartySharingDisabled;
240+
copy.isThirdPartySharingDisabledForCoppa = self.isThirdPartySharingDisabledForCoppa;
232241
copy.deviceToken = [self.deviceToken copyWithZone:zone];
233242
copy.updatePackages = self.updatePackages;
234243
copy.trackingManagerAuthorizationStatus = self.trackingManagerAuthorizationStatus;

Adjust/ADJConfig.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,14 @@
258258

259259
/**
260260
* @brief Check if adjust configuration object is valid.
261-
*
261+
*
262262
* @return Boolean indicating whether adjust config object is valid or not.
263263
*/
264264
- (BOOL)isValid;
265+
266+
/**
267+
* @brief Enable COPPA (Children's Online Privacy Protection Act) compliant for the application.
268+
*/
269+
@property (nonatomic, assign) BOOL coppaCompliantEnabled;
265270

266271
@end

Adjust/ADJConfig.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ - (id)initWithAppToken:(NSString *)appToken
6767
// default values
6868
self.sendInBackground = NO;
6969
self.eventBufferingEnabled = NO;
70+
self.coppaCompliantEnabled = NO;
7071
self.allowIdfaReading = YES;
7172
self.allowiAdInfoReading = YES;
7273
self.allowAdServicesInfoReading = YES;
@@ -203,6 +204,7 @@ - (id)copyWithZone:(NSZone *)zone {
203204
copy.allowiAdInfoReading = self.allowiAdInfoReading;
204205
copy.allowAdServicesInfoReading = self.allowAdServicesInfoReading;
205206
copy.delayStart = self.delayStart;
207+
copy.coppaCompliantEnabled = self.coppaCompliantEnabled;
206208
copy.userAgent = [self.userAgent copyWithZone:zone];
207209
copy.externalDeviceId = [self.externalDeviceId copyWithZone:zone];
208210
copy.isDeviceKnown = self.isDeviceKnown;

0 commit comments

Comments
 (0)