From 80a5a0887d44117b18c968ce654fee4d1dcea703 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 22 Nov 2019 13:27:16 +0100 Subject: [PATCH 01/15] Add disable third party sharing --- Adjust/ADJActivityHandler.h | 1 + Adjust/ADJActivityHandler.m | 65 ++++++++++++++++++- Adjust/ADJActivityKind.h | 3 +- Adjust/ADJActivityKind.m | 4 ++ Adjust/ADJActivityState.h | 1 + Adjust/ADJActivityState.m | 17 ++++- Adjust/ADJPackageBuilder.h | 2 + Adjust/ADJPackageBuilder.m | 48 ++++++++++++++ Adjust/ADJUserDefaults.h | 6 ++ Adjust/ADJUserDefaults.m | 15 +++++ Adjust/Adjust.h | 3 + Adjust/Adjust.m | 13 ++++ .../AdjustTestApp/ATAAdjustCommandExecutor.m | 6 ++ 13 files changed, 177 insertions(+), 7 deletions(-) diff --git a/Adjust/ADJActivityHandler.h b/Adjust/ADJActivityHandler.h index 7af07d8fc..c3fd4b80d 100644 --- a/Adjust/ADJActivityHandler.h +++ b/Adjust/ADJActivityHandler.h @@ -97,6 +97,7 @@ - (void)resetSessionCallbackParameters; - (void)resetSessionPartnerParameters; - (void)trackAdRevenue:(NSString *)soruce payload:(NSData *)payload; +- (void)disableThirdPartySharing; - (NSString *)getBasePath; - (NSString *)getGdprPath; diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index 04139c291..359302b54 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -573,6 +573,14 @@ - (void)trackAdRevenue:(NSString *)source payload:(NSData *)payload { }]; } +- (void)disableThirdPartySharing { + [ADJUtil launchInQueue:self.internalQueue + selfInject:self + block:^(ADJActivityHandler * selfI) { + [selfI disableThirdPartySharingI:selfI]; + }]; +} + - (NSString *)getBasePath { return _basePath; } @@ -790,11 +798,15 @@ - (void)processSessionI:(ADJActivityHandler *)selfI { // track the first session package only if it's enabled if ([selfI.internalState isEnabled]) { // If user chose to be forgotten before install has ever tracked, don't track it. - if (![ADJUserDefaults getGdprForgetMe]) { + if ([ADJUserDefaults getGdprForgetMe]) { + [selfI setGdprForgetMeI:selfI]; + } else { + // check if disable third party sharing request came, then send it first + if ([ADJUserDefaults getDisableThirdPartySharing]) { + [selfI disableThirdPartySharingI:selfI]; + } selfI.activityState.sessionCount = 1; // this is the first session [selfI transferSessionPackageI:selfI now:now]; - } else { - [selfI setGdprForgetMeI:selfI]; } } @@ -804,6 +816,7 @@ - (void)processSessionI:(ADJActivityHandler *)selfI { [selfI writeActivityStateI:selfI]; [ADJUserDefaults removePushToken]; + [ADJUserDefaults removeDisableThirdPartySharing]; return; } @@ -973,6 +986,50 @@ - (void)adRevenueI:(ADJActivityHandler *)selfI [selfI.packageHandler sendFirstPackage]; } +- (void)disableThirdPartySharingI:(ADJActivityHandler *)selfI { + // cache the disable third party sharing request, so that the request order maintains + // even this call returns before making server request + [ADJUserDefaults setDisableThirdPartySharing]; + + if (!selfI.activityState) { + return; + } + if (![selfI isEnabledI:selfI]) { + return; + } + if (selfI.activityState.isGdprForgotten) { + return; + } + if (selfI.activityState.isThirdPartySharingDisabled) { + return; + } + + selfI.activityState.isThirdPartySharingDisabled = YES; + [selfI writeActivityStateI:selfI]; + + double now = [NSDate.date timeIntervalSince1970]; + + // build package + ADJPackageBuilder *dtpsBuilder = [[ADJPackageBuilder alloc] + initWithDeviceInfo:selfI.deviceInfo + activityState:selfI.activityState + config:selfI.adjustConfig + sessionParameters:selfI.sessionParameters + createdAt:now]; + + ADJActivityPackage *dtpsPackage = [dtpsBuilder buildDisableThirdPartySharingPackage]; + + [selfI.packageHandler addPackage:dtpsPackage]; + + [ADJUserDefaults removeDisableThirdPartySharing]; + + if (selfI.adjustConfig.eventBufferingEnabled) { + [selfI.logger info:@"Buffered event %@", dtpsPackage.suffix]; + } else { + [selfI.packageHandler sendFirstPackage]; + } +} + - (void)launchEventResponseTasksI:(ADJActivityHandler *)selfI eventResponseData:(ADJEventResponseData *)eventResponseData { [selfI updateAdidI:selfI adid:eventResponseData.adid]; @@ -1191,6 +1248,8 @@ - (void)setEnabledI:(ADJActivityHandler *)selfI enabled:(BOOL)enabled { } if ([ADJUserDefaults getGdprForgetMe]) { [selfI setGdprForgetMe]; + } else { + [selfI disableThirdPartySharing]; } [[UIDevice currentDevice] adjSetIad:selfI triesV3Left:kTryIadV3]; } diff --git a/Adjust/ADJActivityKind.h b/Adjust/ADJActivityKind.h index bee8455ad..6a13128c0 100644 --- a/Adjust/ADJActivityKind.h +++ b/Adjust/ADJActivityKind.h @@ -21,7 +21,8 @@ typedef NS_ENUM(int, ADJActivityKind) { ADJActivityKindAttribution = 5, ADJActivityKindInfo = 6, ADJActivityKindGdpr = 7, - ADJActivityKindAdRevenue = 8 + ADJActivityKindAdRevenue = 8, + ADJActivityKindDisableThirdPartySharing = 9 }; @interface ADJActivityKindUtil : NSObject diff --git a/Adjust/ADJActivityKind.m b/Adjust/ADJActivityKind.m index c6267c75a..694ff623f 100644 --- a/Adjust/ADJActivityKind.m +++ b/Adjust/ADJActivityKind.m @@ -27,6 +27,8 @@ + (ADJActivityKind)activityKindFromString:(NSString *)activityKindString { return ADJActivityKindGdpr; } else if ([@"ad_revenue" isEqualToString:activityKindString]) { return ADJActivityKindAdRevenue; + } else if ([@"disable_third_party_sharing" isEqualToString:activityKindString]) { + return ADJActivityKindDisableThirdPartySharing; } else { return ADJActivityKindUnknown; } @@ -48,6 +50,8 @@ + (NSString *)activityKindToString:(ADJActivityKind)activityKind { return @"gdpr"; case ADJActivityKindAdRevenue: return @"ad_revenue"; + case ADJActivityKindDisableThirdPartySharing: + return @"disable_third_party_sharing"; default: return @"unknown"; } diff --git a/Adjust/ADJActivityState.h b/Adjust/ADJActivityState.h index 45327850c..ac141039b 100644 --- a/Adjust/ADJActivityState.h +++ b/Adjust/ADJActivityState.h @@ -14,6 +14,7 @@ @property (nonatomic, assign) BOOL enabled; @property (nonatomic, assign) BOOL isGdprForgotten; @property (nonatomic, assign) BOOL askingAttribution; +@property (nonatomic, assign) BOOL isThirdPartySharingDisabled; @property (nonatomic, copy) NSString *uuid; @property (nonatomic, copy) NSString *deviceToken; diff --git a/Adjust/ADJActivityState.m b/Adjust/ADJActivityState.m index 7fc8fe9f4..528981d80 100644 --- a/Adjust/ADJActivityState.m +++ b/Adjust/ADJActivityState.m @@ -37,6 +37,7 @@ - (id)init { self.enabled = YES; self.isGdprForgotten = NO; self.askingAttribution = NO; + self.isThirdPartySharingDisabled = NO; self.deviceToken = nil; self.transactionIds = [NSMutableArray arrayWithCapacity:kTransactionIdCount]; self.updatePackages = NO; @@ -119,9 +120,11 @@ - (NSString *)generateUniqueKey { } - (NSString *)description { - return [NSString stringWithFormat:@"ec:%d sc:%d ssc:%d ask:%d sl:%.1f ts:%.1f la:%.1f dt:%@ gdprf:%d", - self.eventCount, self.sessionCount, self.subsessionCount, self.askingAttribution, self.sessionLength, - self.timeSpent, self.lastActivity, self.deviceToken, self.isGdprForgotten]; + return [NSString stringWithFormat:@"ec:%d sc:%d ssc:%d ask:%d sl:%.1f ts:%.1f la:%.1f dt:%@ gdprf:%d dtps:%d", + self.eventCount, self.sessionCount, + self.subsessionCount, self.askingAttribution, self.sessionLength, + self.timeSpent, self.lastActivity, self.deviceToken, + self.isGdprForgotten, self.isThirdPartySharingDisabled]; } #pragma mark - NSCoding protocol methods @@ -172,6 +175,12 @@ - (id)initWithCoder:(NSCoder *)decoder { self.askingAttribution = NO; } + if ([decoder containsValueForKey:@"isThirdPartySharingDisabled"]) { + self.isThirdPartySharingDisabled = [decoder decodeBoolForKey:@"isThirdPartySharingDisabled"]; + } else { + self.isThirdPartySharingDisabled = NO; + } + if ([decoder containsValueForKey:@"deviceToken"]) { self.deviceToken = [decoder decodeObjectForKey:@"deviceToken"]; } @@ -207,6 +216,7 @@ - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeBool:self.enabled forKey:@"enabled"]; [encoder encodeBool:self.isGdprForgotten forKey:@"isGdprForgotten"]; [encoder encodeBool:self.askingAttribution forKey:@"askingAttribution"]; + [encoder encodeBool:self.isThirdPartySharingDisabled forKey:@"isThirdPartySharingDisabled"]; [encoder encodeObject:self.deviceToken forKey:@"deviceToken"]; [encoder encodeBool:self.updatePackages forKey:@"updatePackages"]; [encoder encodeObject:self.adid forKey:@"adid"]; @@ -231,6 +241,7 @@ - (id)copyWithZone:(NSZone *)zone { copy.isGdprForgotten = self.isGdprForgotten; copy.lastActivity = self.lastActivity; copy.askingAttribution = self.askingAttribution; + copy.isThirdPartySharingDisabled = self.isThirdPartySharingDisabled; copy.deviceToken = [self.deviceToken copyWithZone:zone]; copy.updatePackages = self.updatePackages; } diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index 05b1b3bf5..026079dc9 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -49,6 +49,8 @@ - (ADJActivityPackage *)buildGdprPackage; +- (ADJActivityPackage *)buildDisableThirdPartySharingPackage; + + (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key; diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index c04a6d149..55c07603b 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -130,6 +130,16 @@ - (ADJActivityPackage *)buildGdprPackage { return gdprPackage; } +- (ADJActivityPackage *)buildDisableThirdPartySharingPackage { + NSMutableDictionary *parameters = [self getDisableThirdPartySharingParameters]; + ADJActivityPackage *dtpsPackage = [self defaultActivityPackage]; + dtpsPackage.path = @"/disable_third_party_sharing"; + dtpsPackage.activityKind = ADJActivityKindDisableThirdPartySharing; + dtpsPackage.suffix = @""; + dtpsPackage.parameters = parameters; + return dtpsPackage; +} + + (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key { if (dictionary == nil) { return; @@ -516,6 +526,44 @@ - (NSMutableDictionary *)getGdprParameters { return parameters; } +- (NSMutableDictionary *)getDisableThirdPartySharingParameters { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + + return parameters; +} + + - (ADJActivityPackage *)defaultActivityPackage { ADJActivityPackage *activityPackage = [[ADJActivityPackage alloc] init]; activityPackage.clientSdk = self.deviceInfo.clientSdk; diff --git a/Adjust/ADJUserDefaults.h b/Adjust/ADJUserDefaults.h index 2b2aa8e6f..300cb73d0 100644 --- a/Adjust/ADJUserDefaults.h +++ b/Adjust/ADJUserDefaults.h @@ -39,6 +39,12 @@ + (void)removeDeeplink; ++ (void)setDisableThirdPartySharing; + ++ (BOOL)getDisableThirdPartySharing; + ++ (void)removeDisableThirdPartySharing; + + (void)clearAdjustStuff; @end diff --git a/Adjust/ADJUserDefaults.m b/Adjust/ADJUserDefaults.m index a642ddfc1..512b4c1f1 100644 --- a/Adjust/ADJUserDefaults.m +++ b/Adjust/ADJUserDefaults.m @@ -14,6 +14,7 @@ static NSString * const PREFS_KEY_INSTALL_TRACKED = @"adj_install_tracked"; static NSString * const PREFS_KEY_DEEPLINK_URL = @"adj_deeplink_url"; static NSString * const PREFS_KEY_DEEPLINK_CLICK_TIME = @"adj_deeplink_click_time"; +static NSString * const PREFS_KEY_DISABLE_THIRD_PARTY_SHARING = @"adj_disable_third_party_sharing"; @implementation ADJUserDefaults @@ -86,6 +87,20 @@ + (void)removeDeeplink { [[NSUserDefaults standardUserDefaults] synchronize]; } ++ (void)setDisableThirdPartySharing { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:PREFS_KEY_DISABLE_THIRD_PARTY_SHARING]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + ++ (BOOL)getDisableThirdPartySharing { + return [[NSUserDefaults standardUserDefaults] boolForKey:PREFS_KEY_DISABLE_THIRD_PARTY_SHARING]; +} + ++ (void)removeDisableThirdPartySharing { + [[NSUserDefaults standardUserDefaults] removeObjectForKey:PREFS_KEY_DISABLE_THIRD_PARTY_SHARING]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + + (void)clearAdjustStuff { [[NSUserDefaults standardUserDefaults] removeObjectForKey:PREFS_KEY_PUSH_TOKEN_DATA]; [[NSUserDefaults standardUserDefaults] removeObjectForKey:PREFS_KEY_PUSH_TOKEN_STRING]; diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index e4d3dd510..fe8ac44bb 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -259,6 +259,9 @@ extern NSString * __nonnull const ADJAdRevenueSourceTapdaq; */ + (void)trackAdRevenue:(nonnull NSString *)source payload:(nonnull NSData *)payload; + ++ (void)disableThirdPartySharing; + /** * Obtain singleton Adjust object. */ diff --git a/Adjust/Adjust.m b/Adjust/Adjust.m index 4de840f9e..68abb3823 100644 --- a/Adjust/Adjust.m +++ b/Adjust/Adjust.m @@ -179,6 +179,10 @@ + (void)trackAdRevenue:(nonnull NSString *)source payload:(nonnull NSData *)payl [[Adjust getInstance] trackAdRevenue:source payload:payload]; } ++ (void)disableThirdPartySharing { + [[Adjust getInstance] disableThirdPartySharing]; +} + + (ADJAttribution *)attribution { return [[Adjust getInstance] attribution]; } @@ -417,6 +421,15 @@ - (void)trackAdRevenue:(NSString *)source payload:(NSData *)payload { [self.activityHandler trackAdRevenue:source payload:payload]; } +- (void)disableThirdPartySharing { + if (![self checkActivityHandler:@"disable third party sharing"]) { + [ADJUserDefaults setDisableThirdPartySharing]; + return; + } + + [self.activityHandler disableThirdPartySharing]; +} + - (ADJAttribution *)attribution { if (![self checkActivityHandler]) { return nil; diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m index 6c7bfcc2f..e030fe8a4 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m @@ -91,6 +91,8 @@ - (void)executeCommand:(NSString *)className [self gdprForgetMe:parameters]; } else if ([methodName isEqualToString:@"trackAdRevenue"]) { [self trackAdRevenue:parameters]; + } else if ([methodName isEqualToString:@"disableThirdPartySharing"]) { + [self disableThirdPartySharing:parameters]; } } @@ -505,4 +507,8 @@ - (void)trackAdRevenue:(NSDictionary *)parameters { [Adjust trackAdRevenue:sourceS payload:payload]; } +- (void)disableThirdPartySharing:(NSDictionary *)parameters { + [Adjust disableThirdPartySharing]; +} + @end From c12ff86ae07bcfe3b05f702920ad2793f759cc14 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 27 Nov 2019 15:13:11 +0100 Subject: [PATCH 02/15] Add disable third party to Readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 9785e99af..241fd4c0f 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本 * [Offline mode](#offline-mode) * [Event buffering](#event-buffering) * [GDPR right to be forgotten](#gdpr-forget-me) + * [Disable third-party sharing](#disable-third-party-sharing) * [SDK signature](#sdk-signature) * [Background tracking](#background-tracking) * [Device IDs](#device-ids) @@ -611,6 +612,16 @@ In accordance with article 17 of the EU's General Data Protection Regulation (GD Upon receiving this information, Adjust will erase the user's data and the Adjust SDK will stop tracking the user. No requests from this device will be sent to Adjust in the future. +### Disable third-party sharing + +In accordance with EU's General Data Protection Regulation (GDPR), you can notify Adjust when a user has exercised their right to disable sharing of their data to any third-party. Calling the following method will instruct the Adjust SDK to communicate the user's choice to disable third-party sharing to the Adjust backend: + +```objc +[Adjust disableThirdPartySharing]; +``` + +Upon receiving this information, Adjust will block the sharing of user's data to the partners and the Adjust SDK will continue to work as usual. + ### SDK signature The Adjust SDK signature is enabled on a client-by-client basis. If you are interested in using this feature, please contact your account manager. From 6a7cb661af2e6474e5b4a637347018cd6916859d Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 27 Nov 2019 15:15:02 +0100 Subject: [PATCH 03/15] Add dtps method header documentation --- Adjust/Adjust.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index fe8ac44bb..07de1c09c 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -259,7 +259,9 @@ extern NSString * __nonnull const ADJAdRevenueSourceTapdaq; */ + (void)trackAdRevenue:(nonnull NSString *)source payload:(nonnull NSData *)payload; - +/** + * @brief Give right user to disable sharing data to any third-party. + */ + (void)disableThirdPartySharing; /** From 5d7a3adea9a4fbf1a70af17e622330ec2d5b4a79 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 27 Nov 2019 15:59:18 +0100 Subject: [PATCH 04/15] Fix check for dtps in setEnable --- Adjust/ADJActivityHandler.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index 359302b54..0c683cab0 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -1248,7 +1248,7 @@ - (void)setEnabledI:(ADJActivityHandler *)selfI enabled:(BOOL)enabled { } if ([ADJUserDefaults getGdprForgetMe]) { [selfI setGdprForgetMe]; - } else { + } else if ([ADJUserDefaults getDisableThirdPartySharing]) { [selfI disableThirdPartySharing]; } [[UIDevice currentDevice] adjSetIad:selfI triesV3Left:kTryIadV3]; From ba1e2d31024ed62a427403e8bf08c202b114f2a5 Mon Sep 17 00:00:00 2001 From: nonelse Date: Wed, 27 Nov 2019 15:59:45 +0100 Subject: [PATCH 05/15] Use ad revenues parameters in dtps package --- Adjust/ADJPackageBuilder.m | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index 55c07603b..cdaac11bb 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -531,21 +531,13 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters { [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; - [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; if (self.adjustConfig.isDeviceKnown) { @@ -553,6 +545,7 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters { } if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; if (self.activityState.isPersisted) { [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; } else { From a98831f7b9820968b0538d6a8c0745c74e954ee8 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 29 Nov 2019 15:11:28 +0100 Subject: [PATCH 06/15] Pack more parameters to dtps package --- Adjust/ADJPackageBuilder.m | 43 +++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index cdaac11bb..072f452cb 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -529,23 +529,54 @@ - (NSMutableDictionary *)getGdprParameters { - (NSMutableDictionary *)getDisableThirdPartySharingParameters { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getUpdateTime] forKey:@"app_updated_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.callbackParameters forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.clickTime forKey:@"click_time"]; + [ADJPackageBuilder parameters:parameters setNumberInt:[ADJUtil readReachabilityFlags] forKey:@"connectivity_type"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.countryCode forKey:@"country"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.cpuSubtype forKey:@"cpu_type"]; [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deeplink forKey:@"deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.defaultTracker forKey:@"default_tracker"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.attributionDetails forKey:@"details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.fbAnonymousId forKey:@"fb_anon_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.machineModel forKey:@"hardware_name"]; [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getInstallTime] forKey:@"installed_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.languageCode forKey:@"language"]; [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.deeplinkParameters forKey:@"params"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.partnerParameters forKey:@"partner_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.purchaseTime forKey:@"purchase_time"]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; - + [ADJPackageBuilder parameters:parameters setInt:UIDevice.currentDevice.adjTrackingEnabled forKey:@"tracking_enabled"]; + if (self.adjustConfig.isDeviceKnown) { [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; } - + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.sessionCount forKey:@"session_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"]; if (self.activityState.isPersisted) { [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; } else { @@ -553,6 +584,12 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters { } } +#if !TARGET_OS_TV + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMCC] forKey:@"mcc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMNC] forKey:@"mnc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readCurrentRadioAccessTechnology] forKey:@"network_type"]; +#endif + return parameters; } From eab237471a3d9783221db2383445d22dfde27fd2 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 29 Nov 2019 15:11:50 +0100 Subject: [PATCH 07/15] Clean dtps as well --- Adjust/ADJUserDefaults.m | 1 + AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Adjust/ADJUserDefaults.m b/Adjust/ADJUserDefaults.m index 512b4c1f1..97cb7e643 100644 --- a/Adjust/ADJUserDefaults.m +++ b/Adjust/ADJUserDefaults.m @@ -108,6 +108,7 @@ + (void)clearAdjustStuff { [[NSUserDefaults standardUserDefaults] removeObjectForKey:PREFS_KEY_GDPR_FORGET_ME]; [[NSUserDefaults standardUserDefaults] removeObjectForKey:PREFS_KEY_DEEPLINK_URL]; [[NSUserDefaults standardUserDefaults] removeObjectForKey:PREFS_KEY_DEEPLINK_CLICK_TIME]; + [[NSUserDefaults standardUserDefaults] removeObjectForKey:PREFS_KEY_DISABLE_THIRD_PARTY_SHARING]; [[NSUserDefaults standardUserDefaults] synchronize]; } diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m index e5e804c67..bd54c71df 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m @@ -30,8 +30,13 @@ - (void)viewDidLoad { andCommandDelegate:self.adjustCommandExecutor]; [self.adjustCommandExecutor setTestLibrary:self.testLibrary]; - // [self.testLibrary addTestDirectory:@"current/sdkInfo"]; - // [self.testLibrary addTest:@"current/appSecret/Test_AppSecret_no_secret"]; + // [self.testLibrary addTestDirectory:@"current/third-party-sharing"]; + // [self.testLibrary addTest:@"Test_GdprForgetMe_after_install_kill_before_install"]; + // [self.testLibrary addTest:@"Test_GdprForgetMe_disable_enable"]; + // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_before_install"]; + // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_before_start_restart"]; + // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_between_create_and_resume"]; + // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_main_queue_order"]; // [self.testLibrary doNotExitAfterEnd]; [self startTestSession]; From fa585e090f17d897b72f32d4216a15bfaa09ccea Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 29 Nov 2019 16:12:25 +0100 Subject: [PATCH 08/15] Ad revenue and DTPS to web bridge --- AdjustBridge/AdjustBridge.m | 11 +++++++++++ AdjustBridge/AdjustBridgeRegister.m | 10 ++++++++++ .../AdjustTestApp/AdjustTestApp/ViewController.m | 5 ----- .../AdjustWebBridgeTestApp/TestLibraryBridge.js | 14 ++++++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index d0fcd7f7b..eb2743163 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -459,6 +459,17 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView [self.bridgeRegister registerHandler:@"adjust_gdprForgetMe" handler:^(id data, WVJBResponseCallback responseCallback) { [Adjust gdprForgetMe]; }]; + + [self.bridgeRegister registerHandler:@"adjust_trackAdRevenue" handler:^(id data, WVJBResponseCallback responseCallback) { + NSString *source = [data objectForKey:@"source"]; + NSString *payload = [data objectForKey:@"payload"]; + NSData *dataPayload = [payload dataUsingEncoding:NSUTF8StringEncoding]; + [Adjust trackAdRevenue:source payload:dataPayload]; + }]; + + [self.bridgeRegister registerHandler:@"adjust_disableThirdPartySharing" handler:^(id data, WVJBResponseCallback responseCallback) { + [Adjust disableThirdPartySharing]; + }]; [self.bridgeRegister registerHandler:@"adjust_setTestOptions" handler:^(id data, WVJBResponseCallback responseCallback) { NSString *baseUrl = [data objectForKey:@"baseUrl"]; diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 68707b1c4..62cf268bb 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -98,6 +98,11 @@ + (NSString *)adjust_js { WebViewJavascriptBridge.callHandler('adjust_trackEvent', adjustEvent, null); } }, + trackAdRevenue: function(source, payload) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_trackAdRevenue', {source: source, payload: payload}, null); + } + }, trackSubsessionStart: function() { if (WebViewJavascriptBridge) { WebViewJavascriptBridge.callHandler('adjust_trackSubsessionStart', null, null); @@ -191,6 +196,11 @@ + (NSString *)adjust_js { WebViewJavascriptBridge.callHandler('adjust_gdprForgetMe', null, null); } }, + disableThirdPartySharing: function() { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_disableThirdPartySharing', null, null); + } + }, fbPixelEvent: function(pixelID, evtName, customData) { if (WebViewJavascriptBridge != null) { WebViewJavascriptBridge.callHandler('adjust_fbPixelEvent', diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m index bd54c71df..f42dc99cc 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m @@ -32,11 +32,6 @@ - (void)viewDidLoad { // [self.testLibrary addTestDirectory:@"current/third-party-sharing"]; // [self.testLibrary addTest:@"Test_GdprForgetMe_after_install_kill_before_install"]; - // [self.testLibrary addTest:@"Test_GdprForgetMe_disable_enable"]; - // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_before_install"]; - // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_before_start_restart"]; - // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_between_create_and_resume"]; - // [self.testLibrary addTest:@"Test_DisableThirdPartySharing_main_queue_order"]; // [self.testLibrary doNotExitAfterEnd]; [self startTestSession]; diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 2bb7576f4..49792ec76 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -510,6 +510,20 @@ AdjustCommandExecutor.prototype.openDeeplink = function(params) { Adjust.appWillOpenUrl(deeplink); }; +AdjustCommandExecutor.prototype.trackAdRevenue = function(params) { + var source = getFirstValue(params, 'adRevenueSource'); + var payload = getFirstValue(params, 'adRevenueJsonString'); + if (payload === null) { + Adjust.trackAdRevenue(source, ''); + } else { + Adjust.trackAdRevenue(source, payload); + } +}; + +AdjustCommandExecutor.prototype.disableThirdPartySharing = function(params) { + Adjust.disableThirdPartySharing(); +}; + // Util function getValues(params, key) { if (key in params) { From 4dd4338c5e03a6974d6cbcc56ff2e639f69a75e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Fri, 29 Nov 2019 16:16:52 +0100 Subject: [PATCH 09/15] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 241fd4c0f..f21cf38d3 100644 --- a/README.md +++ b/README.md @@ -614,13 +614,15 @@ Upon receiving this information, Adjust will erase the user's data and the Adjus ### Disable third-party sharing -In accordance with EU's General Data Protection Regulation (GDPR), you can notify Adjust when a user has exercised their right to disable sharing of their data to any third-party. Calling the following method will instruct the Adjust SDK to communicate the user's choice to disable third-party sharing to the Adjust backend: +You can now notify Adjust when a user has exercised their right to stop sharing their data with partners for marketing partners, but has allowed it to be shared for statistics purposes. + +Call the following method to instruct the Adjust SDK to communicate the user's choice to disable data sharing to the Adjust backend: ```objc [Adjust disableThirdPartySharing]; ``` -Upon receiving this information, Adjust will block the sharing of user's data to the partners and the Adjust SDK will continue to work as usual. +Upon receiving this information, Adjust will block the sharing of that specific user's data to partners and the Adjust SDK will continue to work as usual. ### SDK signature From 7ebcbd0e0a08282861a4fc76e3b80fb4f9674b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Fri, 29 Nov 2019 16:18:17 +0100 Subject: [PATCH 10/15] Update web_views.md --- doc/english/web_views.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/english/web_views.md b/doc/english/web_views.md index 97fe0d14c..90bbd0c78 100644 --- a/doc/english/web_views.md +++ b/doc/english/web_views.md @@ -32,6 +32,7 @@ It provides a bridge from Javascript to native Objective-C calls (and vice versa * [Offline mode](#offline-mode) * [Event buffering](#event-buffering) * [GDPR right to be forgotten](#gdpr-forget-me) + * [Disable third-party sharing](#disable-third-party-sharing) * [SDK signature](#sdk-signature) * [Background tracking](#background-tracking) * [Device IDs](#device-ids) @@ -516,6 +517,19 @@ Adjust.gdprForgetMe(); Upon receiving this information, Adjust will erase the user's data and the Adjust SDK will stop tracking the user. No requests from this device will be sent to Adjust in the future. + +### Disable third-party sharing + +You can now notify Adjust when a user has exercised their right to stop sharing their data with partners for marketing partners, but has allowed it to be shared for statistics purposes. + +Call the following method to instruct the Adjust SDK to communicate the user's choice to disable data sharing to the Adjust backend: + +```js +Adjust.disableThirdPartySharing(); +``` + +Upon receiving this information, Adjust will block the sharing of that specific user's data to partners and the Adjust SDK will continue to work as usual. + ### SDK signature The Adjust SDK signature is enabled on a client-by-client basis. If you are interested in using this feature, please contact your account manager. From 8bd43f490b5b49ea60dcc11ed5a61a21e3dda890 Mon Sep 17 00:00:00 2001 From: uerceg Date: Fri, 29 Nov 2019 16:26:27 +0100 Subject: [PATCH 11/15] New version 4.19.0 --- Adjust.podspec | 4 ++-- Adjust/ADJUtil.m | 2 +- Adjust/Adjust.h | 2 +- AdjustBridge/AdjustBridgeRegister.m | 2 +- AdjustTests/AdjustUnitTests/ADJPackageFields.m | 2 +- README.md | 4 ++-- VERSION | 2 +- doc/chinese/README.md | 4 ++-- doc/english/migrate.md | 2 +- doc/english/web_views.md | 2 +- doc/japanese/README.md | 4 ++-- doc/korean/README.md | 4 ++-- doc/migrate.md | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Adjust.podspec b/Adjust.podspec index a33182914..55b334bb5 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.18.3" + s.version = "4.19.0" s.summary = "This is the iOS SDK of adjust. You can read more about it at http://adjust.com." s.homepage = "https://github.com/adjust/ios_sdk" 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.18.3" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.19.0" } s.ios.deployment_target = '6.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index f7a07e860..222df0b83 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -40,7 +40,7 @@ static CTTelephonyNetworkInfo *networkInfo = nil; #endif -static NSString * const kClientSdk = @"ios4.18.3"; +static NSString * const kClientSdk = @"ios4.19.0"; static NSString * const kDeeplinkParam = @"deep_link="; static NSString * const kSchemeDelimiter = @"://"; static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index 07de1c09c..a9c02633e 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust // -// V4.18.3 +// V4.19.0 // Created by Christian Wellenbrock (wellle) on 23rd July 2013. // Copyright © 2012-2017 Adjust GmbH. All rights reserved. // diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 62cf268bb..a25e579a4 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -221,7 +221,7 @@ + (NSString *)adjust_js { if (this.sdkPrefix) { return this.sdkPrefix; } else { - return 'web-bridge4.18.3'; + return 'web-bridge4.19.0'; } }, setTestOptions: function(testOptions) { diff --git a/AdjustTests/AdjustUnitTests/ADJPackageFields.m b/AdjustTests/AdjustUnitTests/ADJPackageFields.m index bbae5dd30..0ecd3d8e9 100644 --- a/AdjustTests/AdjustUnitTests/ADJPackageFields.m +++ b/AdjustTests/AdjustUnitTests/ADJPackageFields.m @@ -16,7 +16,7 @@ - (id) init { // default values self.appToken = @"qwerty123456"; - self.clientSdk = @"ios4.18.3"; + self.clientSdk = @"ios4.19.0"; self.suffix = @""; self.environment = @"sandbox"; diff --git a/README.md b/README.md index f21cf38d3..7e8713458 100644 --- a/README.md +++ b/README.md @@ -74,13 +74,13 @@ We will describe the steps to integrate the Adjust SDK into your iOS project. We If you're using [CocoaPods][cocoapods], you can add the following line to your `Podfile` and continue from [this step](#sdk-integrate): ```ruby -pod 'Adjust', '~> 4.18.3' +pod 'Adjust', '~> 4.19.0' ``` or: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.18.3' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.19.0' ``` --- diff --git a/VERSION b/VERSION index aa8271559..a69aa5a42 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.18.3 +4.19.0 diff --git a/doc/chinese/README.md b/doc/chinese/README.md index 73f35c038..22992dc66 100644 --- a/doc/chinese/README.md +++ b/doc/chinese/README.md @@ -73,13 +73,13 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本 如果您正在使用[CocoaPods][cocoapods],您可以将以下代码行添加至 `Podfile`,然后继续进行[此步骤](#sdk-integrate): ```ruby -pod 'Adjust', '~> 4.18.3' +pod 'Adjust', '~> 4.19.0' ``` 或: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.18.3' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.19.0' ``` --- diff --git a/doc/english/migrate.md b/doc/english/migrate.md index ef791ce31..eb3eafb1b 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for iOS to v4.18.3 from v3.4.0 +## Migrate your adjust SDK for iOS to v4.19.0 from v3.4.0 ### Initial setup diff --git a/doc/english/web_views.md b/doc/english/web_views.md index 90bbd0c78..d3a9fcec7 100644 --- a/doc/english/web_views.md +++ b/doc/english/web_views.md @@ -64,7 +64,7 @@ We will describe the steps to integrate the Adjust SDK into your iOS project. We If you're using [CocoaPods][cocoapods], you can add the following line to your `Podfile` and continue from [this step](#sdk-integrate): ```ruby -pod 'Adjust/WebBridge', '~> 4.18.3' +pod 'Adjust/WebBridge', '~> 4.19.0' ``` --- diff --git a/doc/japanese/README.md b/doc/japanese/README.md index 6fba23717..c387870cf 100644 --- a/doc/japanese/README.md +++ b/doc/japanese/README.md @@ -25,13 +25,13 @@ adjust SDKをiOSプロジェクトに連携する手順を説明します。 [こちらの手順](#sdk-integrate)に進んでください。 ```ruby -pod 'Adjust', '~> 4.18.3' +pod 'Adjust', '~> 4.19.0' ``` または ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.18.3' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.19.0' ``` --- diff --git a/doc/korean/README.md b/doc/korean/README.md index bb2441904..fcd6f4ee4 100644 --- a/doc/korean/README.md +++ b/doc/korean/README.md @@ -73,13 +73,13 @@ iOS 개발용 Xcode를 사용한다는 가정하에 iOS 프로젝트에 Adjust S [CocoaPods][cocoapods]를 사용하는 경우, 다음 내용을 `Podfile`에 추가한 후 [해당 단계](#sdk-integrate)를 완료하세요. ```ruby -pod 'Adjust', '~> 4.18.3' +pod 'Adjust', '~> 4.19.0' ``` 또는: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.18.3' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.19.0' ``` --- diff --git a/doc/migrate.md b/doc/migrate.md index 5d43a4b1d..490e1e179 100644 --- a/doc/migrate.md +++ b/doc/migrate.md @@ -1,4 +1,4 @@ -## Migrate your Adjust SDK for iOS to v4.18.3 from v3.4.0 +## Migrate your Adjust SDK for iOS to v4.19.0 from v3.4.0 ### Initial setup From db7bdece4824b46fe98be3fdb44b7027fee52f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Fri, 29 Nov 2019 16:31:49 +0100 Subject: [PATCH 12/15] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a0b219d2..7d892495e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 4.19.0 (xxth December 2019) +#### Added +- Added `disableThirdPartySharing:` method to `Adjust` interface to allow disabling of data sharing with third parties outside of Adjust ecosystem. + +--- + ### Version 4.18.3 (27th September 2019) #### Changed - Removed reading of Facebook advertising identifier which sometimes caused blocking of the main thread. From e8d91879d83e31880630ceb55a86876b689c6f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Sun, 8 Dec 2019 00:45:20 +0100 Subject: [PATCH 13/15] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d892495e..5cc740834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -### Version 4.19.0 (xxth December 2019) +### Version 4.19.0 (9th December 2019) #### Added -- Added `disableThirdPartySharing:` method to `Adjust` interface to allow disabling of data sharing with third parties outside of Adjust ecosystem. +- Added `disableThirdPartySharing` method to `Adjust` interface to allow disabling of data sharing with third parties outside of Adjust ecosystem. --- From 15656f6761d09e98638c6c4b7222611891fed512 Mon Sep 17 00:00:00 2001 From: yewton Date: Thu, 5 Dec 2019 15:34:44 +0900 Subject: [PATCH 14/15] Fix dead links --- doc/japanese/README.md | 2 +- doc/japanese/fb_pixel.md | 2 +- doc/web_views_ja.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/japanese/README.md b/doc/japanese/README.md index c387870cf..f9d5bed87 100644 --- a/doc/japanese/README.md +++ b/doc/japanese/README.md @@ -1091,7 +1091,7 @@ adjust SDKがトラッキングするよう設定された値が間違ってい [special-partners]: https://docs.adjust.com/en/special-partners [attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md -[ios-web-views-guide]: https://github.com/adjust/ios_sdk/blob/master/doc/japanese/web_views_ja.md +[ios-web-views-guide]: https://github.com/adjust/ios_sdk/blob/master/doc/japanese/web_views.md [currency-conversion]: https://docs.adjust.com/en/event-tracking/#tracking-purchases-in-different-currencies [universal-links-guide]: https://docs.adjust.com/en/universal-links/ diff --git a/doc/japanese/fb_pixel.md b/doc/japanese/fb_pixel.md index d3ce7dbd7..de155554b 100644 --- a/doc/japanese/fb_pixel.md +++ b/doc/japanese/fb_pixel.md @@ -63,7 +63,7 @@ fbq('set', 'mobileBridge', , ); ### Web viewの拡大 -[iOS web view](web_views_ja.md) アプリの統合ガイドに従ってください。こちらはWeb view bridgeをロードするセクションです。(以下を参照) +[iOS web view](web_views.md) アプリの統合ガイドに従ってください。こちらはWeb view bridgeをロードするセクションです。(以下を参照) ```objc diff --git a/doc/web_views_ja.md b/doc/web_views_ja.md index 23eaa45f2..34172897f 100644 --- a/doc/web_views_ja.md +++ b/doc/web_views_ja.md @@ -1,3 +1,3 @@ -WebviewのREADMEは移動しました。[こちら](https://github.com/adjust/ios_sdk/blob/master/doc/japanese/web_views_ja.md) をご覧ください。 \ No newline at end of file +WebviewのREADMEは移動しました。[こちら](https://github.com/adjust/ios_sdk/blob/master/doc/japanese/web_views.md) をご覧ください。 From 6c6608fe68e1d2c6426809025cc46b0087392d62 Mon Sep 17 00:00:00 2001 From: hamidreza <42313771+hamidreza411@users.noreply.github.com> Date: Tue, 25 Jun 2019 15:42:16 +0430 Subject: [PATCH 15/15] Fix spelling error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e8713458..d9a2a928e 100644 --- a/README.md +++ b/README.md @@ -812,7 +812,7 @@ Follow the same steps and implement the following delegate callback function for } ``` -The callback function will be called after the SDK receives a deffered deep link from our server and before opening it. Within the callback function you have access to the deep link. The returned boolean value determines if the SDK will launch the deep link. You could, for example, not allow the SDK to open the deep link at the current moment, save it, and open it yourself later. +The callback function will be called after the SDK receives a deferred deep link from our server and before opening it. Within the callback function you have access to the deep link. The returned boolean value determines if the SDK will launch the deep link. You could, for example, not allow the SDK to open the deep link at the current moment, save it, and open it yourself later. If this callback is not implemented, **the Adjust SDK will always try to open the deep link by default**.