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/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..0c683cab0 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 if ([ADJUserDefaults getDisableThirdPartySharing]) { + [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..072f452cb 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,74 @@ - (NSMutableDictionary *)getGdprParameters { return parameters; } +- (NSMutableDictionary *)getDisableThirdPartySharingParameters { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [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 { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + +#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; +} + + - (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..97cb7e643 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]; @@ -93,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/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 e4d3dd510..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. // @@ -259,6 +259,11 @@ 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; + /** * 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/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..a25e579a4 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', @@ -211,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/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 diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m index e5e804c67..f42dc99cc 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m @@ -30,8 +30,8 @@ - (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 doNotExitAfterEnd]; [self startTestSession]; 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/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) { diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a0b219d2..5cc740834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### 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. + +--- + ### Version 4.18.3 (27th September 2019) #### Changed - Removed reading of Facebook advertising identifier which sometimes caused blocking of the main thread. diff --git a/README.md b/README.md index 9785e99af..d9a2a928e 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) @@ -73,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' ``` --- @@ -611,6 +612,18 @@ 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 + +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 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. @@ -799,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**. 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 97fe0d14c..d3a9fcec7 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) @@ -63,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' ``` --- @@ -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. diff --git a/doc/japanese/README.md b/doc/japanese/README.md index 6fba23717..f9d5bed87 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' ``` --- @@ -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/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 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) をご覧ください。