diff --git a/Adjust.podspec b/Adjust.podspec index 493637c38..a61fe3089 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.15.0" + s.version = "4.16.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.15.0" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.16.0" } s.ios.deployment_target = '6.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index 69b5a3032..e60441c40 100644 --- a/Adjust.xcodeproj/project.pbxproj +++ b/Adjust.xcodeproj/project.pbxproj @@ -439,6 +439,13 @@ remoteGlobalIDString = 6F0842272007769F00568A31; remoteInfo = AdjustTestApp; }; + 6F7AF64F211878BD00F730B2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6F7AF626211878B900F730B2; + remoteInfo = AdjustWebBridgeTestApp; + }; 9679922318BBAE2800394606 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 9679920518BBAE2800394606 /* Project object */; @@ -557,6 +564,7 @@ /* Begin PBXFileReference section */ 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AdjustTestLibrary.xcodeproj; path = AdjustTestLibrary/AdjustTestLibrary.xcodeproj; sourceTree = ""; }; 6F084240200776A000568A31 /* AdjustTestApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AdjustTestApp.xcodeproj; path = AdjustTestApp/AdjustTestApp.xcodeproj; sourceTree = ""; }; + 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AdjustWebBridgeTestApp.xcodeproj; path = AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj; sourceTree = ""; }; 6FCC84F71F278CF300D6A0ED /* ADJReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; 6FCC84F81F278CF300D6A0ED /* ADJReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; 6FCC85021F27944600D6A0ED /* ADJReachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; @@ -767,12 +775,10 @@ 9D0E2E5C210B575600133B4F /* AdjustBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge.m; sourceTree = ""; }; 9D0E2E5D210B575600133B4F /* AdjustBridgeRegister.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridgeRegister.h; sourceTree = ""; }; 9D0E2E5F210B575600133B4F /* WebViewJavascriptBridgeBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridgeBase.m; sourceTree = ""; }; - 9D0E2E60210B575600133B4F /* AdjustBridge_JS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge_JS.m; sourceTree = ""; }; 9D0E2E61210B575600133B4F /* WKWebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKWebViewJavascriptBridge.m; sourceTree = ""; }; 9D0E2E62210B575600133B4F /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = ""; }; 9D0E2E63210B575600133B4F /* WebViewJavascriptBridge_JS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge_JS.h; sourceTree = ""; }; 9D0E2E64210B575600133B4F /* WebViewJavascriptBridgeBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridgeBase.h; sourceTree = ""; }; - 9D0E2E65210B575600133B4F /* AdjustBridge_JS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridge_JS.h; sourceTree = ""; }; 9D0E2E66210B575600133B4F /* WebViewJavascriptBridge_JS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge_JS.m; sourceTree = ""; }; 9D0E2E67210B575600133B4F /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = ""; }; 9D0E2E68210B575600133B4F /* WKWebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebViewJavascriptBridge.h; sourceTree = ""; }; @@ -1140,6 +1146,14 @@ name = Products; sourceTree = ""; }; + 6F7AF640211878BC00F730B2 /* Products */ = { + isa = PBXGroup; + children = ( + 6F7AF650211878BD00F730B2 /* AdjustWebBridgeTestApp.app */, + ); + name = Products; + sourceTree = ""; + }; 9648C5E41CD1765E00A3B049 /* AdjustBridge */ = { isa = PBXGroup; children = ( @@ -1296,8 +1310,9 @@ 96E5E39A18BBB49E008E7B30 /* AdjustTests */ = { isa = PBXGroup; children = ( - 6F084240200776A000568A31 /* AdjustTestApp.xcodeproj */, 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */, + 6F084240200776A000568A31 /* AdjustTestApp.xcodeproj */, + 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */, 6F0841FB2007749C00568A31 /* AdjustUnitTests */, ); path = AdjustTests; @@ -1419,8 +1434,6 @@ 9D0E2E5E210B575600133B4F /* WebViewJavascriptBridge */ = { isa = PBXGroup; children = ( - 9D0E2E65210B575600133B4F /* AdjustBridge_JS.h */, - 9D0E2E60210B575600133B4F /* AdjustBridge_JS.m */, 9D0E2E63210B575600133B4F /* WebViewJavascriptBridge_JS.h */, 9D0E2E66210B575600133B4F /* WebViewJavascriptBridge_JS.m */, 9D0E2E67210B575600133B4F /* WebViewJavascriptBridge.h */, @@ -2155,7 +2168,7 @@ 9679920518BBAE2800394606 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0940; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = "adjust GmbH"; TargetAttributes = { 9615158E1CD2CB2C0022D336 = { @@ -2236,6 +2249,10 @@ ProductGroup = 6F0842192007766700568A31 /* Products */; ProjectRef = 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */; }, + { + ProductGroup = 6F7AF640211878BC00F730B2 /* Products */; + ProjectRef = 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */; + }, ); projectRoot = ""; targets = ( @@ -2267,6 +2284,13 @@ remoteRef = 6F084244200776A100568A31 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 6F7AF650211878BD00F730B2 /* AdjustWebBridgeTestApp.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = AdjustWebBridgeTestApp.app; + remoteRef = 6F7AF64F211878BD00F730B2 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 9D01680420FF88DE0029CFFF /* AdjustExample-iMessage.app */ = { isa = PBXReferenceProxy; fileType = wrapper.application; diff --git a/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme b/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme index 5fce60714..1257534e0 100644 --- a/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme +++ b/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme @@ -1,6 +1,6 @@ )attributionHandlerForActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; + (BOOL)testing; + (NSTimeInterval)maxDelayStart; diff --git a/Adjust/ADJAdjustFactory.m b/Adjust/ADJAdjustFactory.m index d85a2ae70..34dd05e30 100644 --- a/Adjust/ADJAdjustFactory.m +++ b/Adjust/ADJAdjustFactory.m @@ -114,17 +114,14 @@ + (ADJBackoffStrategy *)sdkClickHandlerBackoffStrategy { } + (id)attributionHandlerForActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending { if (internalAttributionHandler == nil) { return [ADJAttributionHandler handlerWithActivityHandler:activityHandler - withAttributionPackage:attributionPackage startsSending:startsSending]; } return [internalAttributionHandler initWithActivityHandler:activityHandler - withAttributionPackage:attributionPackage startsSending:startsSending]; } diff --git a/Adjust/ADJAttributionHandler.h b/Adjust/ADJAttributionHandler.h index b460c63b7..783e6f079 100644 --- a/Adjust/ADJAttributionHandler.h +++ b/Adjust/ADJAttributionHandler.h @@ -13,7 +13,6 @@ @protocol ADJAttributionHandler - (id)initWithActivityHandler:(id) activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; - (void)checkSessionResponse:(ADJSessionResponseData *)sessionResponseData; @@ -35,7 +34,6 @@ @interface ADJAttributionHandler : NSObject + (id)handlerWithActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; @end diff --git a/Adjust/ADJAttributionHandler.m b/Adjust/ADJAttributionHandler.m index b6fafc384..22f2b77da 100644 --- a/Adjust/ADJAttributionHandler.m +++ b/Adjust/ADJAttributionHandler.m @@ -12,6 +12,7 @@ #import "ADJActivityHandler.h" #import "NSString+ADJAdditions.h" #import "ADJTimerOnce.h" +#import "ADJPackageBuilder.h" static const char * const kInternalQueueName = "com.adjust.AttributionQueue"; static NSString * const kAttributionTimerName = @"Attribution timer"; @@ -22,25 +23,22 @@ @interface ADJAttributionHandler() @property (nonatomic, weak) id activityHandler; @property (nonatomic, weak) id logger; @property (nonatomic, strong) ADJTimerOnce *attributionTimer; -@property (nonatomic, strong) ADJActivityPackage * attributionPackage; @property (atomic, assign) BOOL paused; @property (nonatomic, copy) NSString *basePath; +@property (nonatomic, copy) NSString *lastInitiatedBy; @end @implementation ADJAttributionHandler + (id)handlerWithActivityHandler:(id)activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; { return [[ADJAttributionHandler alloc] initWithActivityHandler:activityHandler - withAttributionPackage:attributionPackage startsSending:startsSending]; } - (id)initWithActivityHandler:(id) activityHandler - withAttributionPackage:(ADJActivityPackage *) attributionPackage startsSending:(BOOL)startsSending; { self = [super init]; @@ -49,7 +47,6 @@ - (id)initWithActivityHandler:(id) activityHandler self.internalQueue = dispatch_queue_create(kInternalQueueName, DISPATCH_QUEUE_SERIAL); self.activityHandler = activityHandler; self.logger = ADJAdjustFactory.logger; - self.attributionPackage = attributionPackage; self.paused = !startsSending; self.basePath = [activityHandler getBasePath]; __weak __typeof__(self) weakSelf = self; @@ -97,9 +94,9 @@ - (void)getAttribution { [ADJUtil launchInQueue:self.internalQueue selfInject:self block:^(ADJAttributionHandler* selfI) { + selfI.lastInitiatedBy = @"sdk"; [selfI waitRequestAttributionWithDelayI:selfI - milliSecondsDelay:0 - isSdkAskingForIt:YES]; + milliSecondsDelay:0]; }]; } @@ -147,9 +144,9 @@ - (void)checkAttributionI:(ADJAttributionHandler*)selfI if (timerMilliseconds != nil) { [selfI.activityHandler setAskingAttribution:YES]; + selfI.lastInitiatedBy = @"backend"; [selfI waitRequestAttributionWithDelayI:selfI - milliSecondsDelay:[timerMilliseconds intValue] - isSdkAskingForIt:NO]; + milliSecondsDelay:[timerMilliseconds intValue]]; return; } @@ -188,14 +185,17 @@ - (void)requestAttributionI:(ADJAttributionHandler*)selfI { [selfI.logger debug:@"Attribution request won't be fired for forgotten user"]; return; } - [selfI.logger verbose:@"%@", selfI.attributionPackage.extendedString]; + + ADJActivityPackage* attributionPackage = [selfI buildAndGetAttributionPackageI:selfI]; + + [selfI.logger verbose:@"%@", attributionPackage.extendedString]; NSURL * baseUrl = [NSURL URLWithString:[ADJAdjustFactory baseUrl]]; [ADJUtil sendGetRequest:baseUrl basePath:selfI.basePath prefixErrorMessage:@"Failed to get attribution" - activityPackage:selfI.attributionPackage + activityPackage:attributionPackage responseDataHandler:^(ADJResponseData * responseData) { // Check if any package response contains information that user has opted out. @@ -212,20 +212,13 @@ - (void)requestAttributionI:(ADJAttributionHandler*)selfI { } - (void)waitRequestAttributionWithDelayI:(ADJAttributionHandler*)selfI - milliSecondsDelay:(int)milliSecondsDelay - isSdkAskingForIt:(BOOL)isSdkAsking { + milliSecondsDelay:(int)milliSecondsDelay { NSTimeInterval secondsDelay = milliSecondsDelay / 1000; NSTimeInterval nextAskIn = [selfI.attributionTimer fireIn]; if (nextAskIn > secondsDelay) { return; } - if (isSdkAsking) { - [selfI.attributionPackage.parameters setObject:@"sdk" forKey:@"initiated_by"]; - } else { - [selfI.attributionPackage.parameters setObject:@"backend" forKey:@"initiated_by"]; - } - if (milliSecondsDelay > 0) { [selfI.logger debug:@"Waiting to query attribution in %d milliseconds", milliSecondsDelay]; } @@ -234,6 +227,23 @@ - (void)waitRequestAttributionWithDelayI:(ADJAttributionHandler*)selfI [selfI.attributionTimer startIn:secondsDelay]; } +- (ADJActivityPackage *)buildAndGetAttributionPackageI:(ADJAttributionHandler*)selfI +{ + double now = [NSDate.date timeIntervalSince1970]; + + ADJPackageBuilder *attributionBuilder = [[ADJPackageBuilder alloc] + initWithDeviceInfo:selfI.activityHandler.deviceInfo + activityState:selfI.activityHandler.activityState + config:selfI.activityHandler.adjustConfig + sessionParameters:selfI.activityHandler.sessionParameters + createdAt:now]; + ADJActivityPackage *attributionPackage = [attributionBuilder buildAttributionPackage:selfI.lastInitiatedBy]; + + selfI.lastInitiatedBy = nil; + + return attributionPackage; +} + #pragma mark - private - (void)teardown { @@ -246,7 +256,6 @@ - (void)teardown { self.activityHandler = nil; self.logger = nil; self.attributionTimer = nil; - self.attributionPackage = nil; } @end diff --git a/Adjust/ADJConfig.h b/Adjust/ADJConfig.h index c44c369e9..f316f8336 100644 --- a/Adjust/ADJConfig.h +++ b/Adjust/ADJConfig.h @@ -19,6 +19,7 @@ * @brief Optional delegate that will get informed about tracking results. */ @protocol AdjustDelegate + @optional /** diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index a8a82194d..c4be13364 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -1,9 +1,9 @@ // // ADJPackageBuilder.h -// Adjust +// Adjust SDK // -// Created by Christian Wellenbrock on 2013-07-03. -// Copyright (c) 2013 adjust GmbH. All rights reserved. +// Created by Christian Wellenbrock (@wellle) on 3rd July 2013. +// Copyright (c) 2013-2018 Adjust GmbH. All rights reserved. // #import "ADJEvent.h" @@ -12,17 +12,18 @@ #import "ADJActivityState.h" #import "ADJActivityPackage.h" #import "ADJSessionParameters.h" - #import @interface ADJPackageBuilder : NSObject +@property (nonatomic, copy) NSString *deeplink; + @property (nonatomic, copy) NSDate *clickTime; -@property (nonatomic, copy) NSDate *purchaseTime; -@property (nonatomic, copy) NSString *deeplink; +@property (nonatomic, copy) NSDate *purchaseTime; @property (nonatomic, strong) NSDictionary *attributionDetails; + @property (nonatomic, strong) NSDictionary *deeplinkParameters; @property (nonatomic, copy) ADJAttribution *attribution; @@ -35,19 +36,23 @@ - (ADJActivityPackage *)buildSessionPackage:(BOOL)isInDelay; -- (ADJActivityPackage *)buildAttributionPackage; - -- (ADJActivityPackage *)buildGdprPackage; - - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event isInDelay:(BOOL)isInDelay; +- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource; + - (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource; -- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource; +- (ADJActivityPackage *)buildAttributionPackage:(NSString *)initiatedBy; + +- (ADJActivityPackage *)buildGdprPackage; -+ (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key; ++ (void)parameters:(NSMutableDictionary *)parameters + setDictionary:(NSDictionary *)dictionary + forKey:(NSString *)key; -+ (void)parameters:(NSMutableDictionary *)parameters setString:(NSString *)value forKey:(NSString *)key; ++ (void)parameters:(NSMutableDictionary *)parameters + setString:(NSString *)value + forKey:(NSString *)key; @end diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index 8c2c45e35..6256eb51e 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -1,9 +1,9 @@ // // ADJPackageBuilder.m -// Adjust +// Adjust SDK // -// Created by Christian Wellenbrock on 2013-07-03. -// Copyright (c) 2013 adjust GmbH. All rights reserved. +// Created by Christian Wellenbrock (@wellle) on 3rd July 2013. +// Copyright (c) 2013-2018 Adjust GmbH. All rights reserved. // #import "ADJUtil.h" @@ -38,7 +38,6 @@ - (id)initWithDeviceInfo:(ADJDeviceInfo *)deviceInfo sessionParameters:(ADJSessionParameters *)sessionParameters createdAt:(double)createdAt { self = [super init]; - if (self == nil) { return nil; } @@ -55,53 +54,18 @@ - (id)initWithDeviceInfo:(ADJDeviceInfo *)deviceInfo #pragma mark - Public methods - (ADJActivityPackage *)buildSessionPackage:(BOOL)isInDelay { - NSMutableDictionary *parameters; - parameters = [self attributableParameters:isInDelay]; - + NSMutableDictionary *parameters = [self getSessionParameters:isInDelay]; ADJActivityPackage *sessionPackage = [self defaultActivityPackage]; sessionPackage.path = @"/session"; sessionPackage.activityKind = ADJActivityKindSession; sessionPackage.suffix = @""; sessionPackage.parameters = parameters; - return sessionPackage; } - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event isInDelay:(BOOL)isInDelay { - NSMutableDictionary *parameters = [self defaultParameters]; - - [ADJPackageBuilder parameters:parameters setInt:self.activityState.eventCount forKey:@"event_count"]; - [ADJPackageBuilder parameters:parameters setNumber:event.revenue forKey:@"revenue"]; - [ADJPackageBuilder parameters:parameters setString:event.currency forKey:@"currency"]; - [ADJPackageBuilder parameters:parameters setString:event.eventToken forKey:@"event_token"]; - [ADJPackageBuilder parameters:parameters setString:event.callbackId forKey:@"event_callback_id"]; - - if (!isInDelay) { - NSDictionary *mergedCallbackParameters = [ADJUtil mergeParameters:self.sessionParameters.callbackParameters - source:event.callbackParameters - parameterName:@"Callback"]; - NSDictionary *mergedPartnerParameters = [ADJUtil mergeParameters:self.sessionParameters.partnerParameters - source:event.partnerParameters - parameterName:@"Partner"]; - - [ADJPackageBuilder parameters:parameters setDictionary:mergedCallbackParameters forKey:@"callback_params"]; - [ADJPackageBuilder parameters:parameters setDictionary:mergedPartnerParameters forKey:@"partner_params"]; - } - - if (event.emptyReceipt) { - NSString *emptyReceipt = @"empty"; - - [ADJPackageBuilder parameters:parameters setString:emptyReceipt forKey:@"receipt"]; - [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; - } - - else if (event.receipt != nil) { - NSString *receiptBase64 = [event.receipt adjEncodeBase64]; - [ADJPackageBuilder parameters:parameters setString:receiptBase64 forKey:@"receipt"]; - [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; - } - + NSMutableDictionary *parameters = [self getEventParameters:isInDelay forEventPackage:event]; ADJActivityPackage *eventPackage = [self defaultActivityPackage]; eventPackage.path = @"/event"; eventPackage.activityKind = ADJActivityKindEvent; @@ -116,205 +80,403 @@ - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event return eventPackage; } -- (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource; -{ - NSMutableDictionary *parameters = [self attributableParameters:NO]; - - [ADJPackageBuilder parameters:parameters setString:clickSource forKey:@"source"]; - [ADJPackageBuilder parameters:parameters setDictionary:self.deeplinkParameters forKey:@"params"]; - [ADJPackageBuilder parameters:parameters setDate:self.clickTime forKey:@"click_time"]; - [ADJPackageBuilder parameters:parameters setDate:self.purchaseTime forKey:@"purchase_time"]; - - if (self.attribution != nil) { - [ADJPackageBuilder parameters:parameters setString:self.attribution.trackerName forKey:@"tracker"]; - [ADJPackageBuilder parameters:parameters setString:self.attribution.campaign forKey:@"campaign"]; - [ADJPackageBuilder parameters:parameters setString:self.attribution.adgroup forKey:@"adgroup"]; - [ADJPackageBuilder parameters:parameters setString:self.attribution.creative forKey:@"creative"]; - } - - [ADJPackageBuilder parameters:parameters setDictionary:self.attributionDetails forKey:@"details"]; - [ADJPackageBuilder parameters:parameters setString:self.deeplink forKey:@"deeplink"]; - - ADJActivityPackage *clickPackage = [self defaultActivityPackage]; - clickPackage.path = @"/sdk_click"; - clickPackage.activityKind = ADJActivityKindClick; - clickPackage.suffix = @""; - clickPackage.parameters = parameters; - - return clickPackage; -} - - (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource { - NSMutableDictionary *parameters = [self idsParameters]; - - [ADJPackageBuilder parameters:parameters setString:infoSource forKey:@"source"]; - - [self injectPushToken:self.activityState intoParamters:parameters]; - + NSMutableDictionary *parameters = [self getInfoParameters:infoSource]; ADJActivityPackage *infoPackage = [self defaultActivityPackage]; infoPackage.path = @"/sdk_info"; infoPackage.activityKind = ADJActivityKindInfo; infoPackage.suffix = @""; infoPackage.parameters = parameters; - return infoPackage; } -- (ADJActivityPackage *)buildAttributionPackage { - NSMutableDictionary *parameters = [self idsParameters]; +- (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource { + NSMutableDictionary *parameters = [self getClickParameters:clickSource]; + ADJActivityPackage *clickPackage = [self defaultActivityPackage]; + clickPackage.path = @"/sdk_click"; + clickPackage.activityKind = ADJActivityKindClick; + clickPackage.suffix = @""; + clickPackage.parameters = parameters; + return clickPackage; +} +- (ADJActivityPackage *)buildAttributionPackage:(NSString *)initiatedBy { + NSMutableDictionary *parameters = [self getAttributionParameters:initiatedBy]; ADJActivityPackage *attributionPackage = [self defaultActivityPackage]; attributionPackage.path = @"/attribution"; attributionPackage.activityKind = ADJActivityKindAttribution; attributionPackage.suffix = @""; attributionPackage.parameters = parameters; - return attributionPackage; } - (ADJActivityPackage *)buildGdprPackage { - NSMutableDictionary *parameters = [self idsParameters]; - // [ADJPackageBuilder parameters:parameters setString:@"push" forKey:@"source"]; - + NSMutableDictionary *parameters = [self getGdprParameters]; ADJActivityPackage *gdprPackage = [self defaultActivityPackage]; gdprPackage.path = @"/gdpr_forget_device"; gdprPackage.activityKind = ADJActivityKindGdpr; gdprPackage.suffix = @""; gdprPackage.parameters = parameters; - return gdprPackage; } -#pragma mark - Private & helper methods - -- (ADJActivityPackage *)defaultActivityPackage { - ADJActivityPackage *activityPackage = [[ADJActivityPackage alloc] init]; - activityPackage.clientSdk = self.deviceInfo.clientSdk; ++ (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key { + if (dictionary == nil) { + return; + } + if (dictionary.count == 0) { + return; + } + if (dictionary.count == 0) { + return; + } - return activityPackage; + NSDictionary *convertedDictionary = [ADJUtil convertDictionaryValues:dictionary]; + [ADJPackageBuilder parameters:parameters setDictionaryJson:convertedDictionary forKey:key]; } -- (NSMutableDictionary *)idsParameters { - NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - - [self injectDeviceInfoIds:self.deviceInfo intoParameters:parameters]; - [self injectConfig:self.adjustConfig intoParameters:parameters]; - [self injectIosUuid:self.activityState intoParamters:parameters]; - [self injectCommonParameters:parameters]; - - return parameters; ++ (void)parameters:(NSMutableDictionary *)parameters setString:(NSString *)value forKey:(NSString *)key { + if (value == nil || [value isEqualToString:@""]) { + return; + } + [parameters setObject:value forKey:key]; } -- (NSMutableDictionary *)attributableParameters:(BOOL)isInDelay { - NSMutableDictionary *parameters = [self defaultParameters]; +#pragma mark - Private & helper methods + +- (NSMutableDictionary *)getSessionParameters:(BOOL)isInDelay { + 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:[ADJUtil getInstallTime] forKey:@"installed_at"]; - [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; + [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 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.adjustConfig.defaultTracker forKey:@"default_tracker"]; + [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.fbAttributionId forKey:@"fb_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 setString:self.adjustConfig.secretId forKey:@"secret_id"]; + [ADJPackageBuilder parameters:parameters setInt:self.deviceInfo.trackingEnabled 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 (!isInDelay) { [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.callbackParameters forKey:@"callback_params"]; [ADJPackageBuilder parameters:parameters setDictionary:self.sessionParameters.partnerParameters forKey:@"partner_params"]; } +#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; } -- (NSMutableDictionary *)defaultParameters { +- (NSMutableDictionary *)getEventParameters:(BOOL)isInDelay forEventPackage:(ADJEvent *)event { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - [self injectDeviceInfo:self.deviceInfo intoParameters:parameters]; - [self injectConfig:self.adjustConfig intoParameters:parameters]; - [self injectActivityState:self.activityState intoParamters:parameters]; - [self injectCommonParameters:parameters]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [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 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:event.currency forKey:@"currency"]; + [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:event.callbackId forKey:@"event_callback_id"]; + [ADJPackageBuilder parameters:parameters setString:event.eventToken forKey:@"event_token"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.fbAttributionId forKey:@"fb_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: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 setNumber:event.revenue forKey:@"revenue"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + [ADJPackageBuilder parameters:parameters setInt:self.deviceInfo.trackingEnabled forKey:@"tracking_enabled"]; + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setInt:self.activityState.eventCount forKey:@"event_count"]; + [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 (!isInDelay) { + NSDictionary *mergedCallbackParameters = [ADJUtil mergeParameters:self.sessionParameters.callbackParameters + source:event.callbackParameters + parameterName:@"Callback"]; + NSDictionary *mergedPartnerParameters = [ADJUtil mergeParameters:self.sessionParameters.partnerParameters + source:event.partnerParameters + parameterName:@"Partner"]; + + [ADJPackageBuilder parameters:parameters setDictionary:mergedCallbackParameters forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDictionary:mergedPartnerParameters forKey:@"partner_params"]; + } + + if (event.emptyReceipt) { + NSString *emptyReceipt = @"empty"; + [ADJPackageBuilder parameters:parameters setString:emptyReceipt forKey:@"receipt"]; + [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; + } else if (event.receipt != nil) { + NSString *receiptBase64 = [event.receipt adjEncodeBase64]; + [ADJPackageBuilder parameters:parameters setString:receiptBase64 forKey:@"receipt"]; + [ADJPackageBuilder parameters:parameters setString:event.transactionId forKey:@"transaction_id"]; + } + +#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; } -- (void)injectCommonParameters:(NSMutableDictionary *)parameters { - [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; +- (NSMutableDictionary *)getInfoParameters:(NSString *)source { + 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 setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [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.adjustConfig.secretId forKey:@"secret_id"]; + [ADJPackageBuilder parameters:parameters setString:source forKey:@"source"]; -- (void)injectDeviceInfoIds:(ADJDeviceInfo *)deviceInfo intoParameters:(NSMutableDictionary *)parameters { - [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.vendorId forKey:@"idfv"]; + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + 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 { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + + return parameters; } -- (void)injectDeviceInfo:(ADJDeviceInfo *)deviceInfo intoParameters:(NSMutableDictionary *)parameters { - [self injectDeviceInfoIds:deviceInfo intoParameters:parameters]; - - [ADJPackageBuilder parameters:parameters setString:deviceInfo.fbAttributionId forKey:@"fb_id"]; - [ADJPackageBuilder parameters:parameters setInt:deviceInfo.trackingEnabled forKey:@"tracking_enabled"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.bundeIdentifier forKey:@"bundle_id"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.bundleVersion forKey:@"app_version"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.bundleShortVersion forKey:@"app_version_short"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.deviceType forKey:@"device_type"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.deviceName forKey:@"device_name"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.osName forKey:@"os_name"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.systemVersion forKey:@"os_version"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.languageCode forKey:@"language"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.countryCode forKey:@"country"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.machineModel forKey:@"hardware_name"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.cpuSubtype forKey:@"cpu_type"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; - [ADJPackageBuilder parameters:parameters setString:deviceInfo.osBuild forKey:@"os_build"]; +- (NSMutableDictionary *)getClickParameters:(NSString *)source { + 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.fbAttributionId forKey:@"fb_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 setString:source forKey:@"source"]; + [ADJPackageBuilder parameters:parameters setInt:self.deviceInfo.trackingEnabled 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 (self.attribution != nil) { + [ADJPackageBuilder parameters:parameters setString:self.attribution.adgroup forKey:@"adgroup"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.campaign forKey:@"campaign"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.creative forKey:@"creative"]; + [ADJPackageBuilder parameters:parameters setString:self.attribution.trackerName forKey:@"tracker"]; + } + #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 -} -- (void)injectConfig:(ADJConfig *)adjustConfig intoParameters:(NSMutableDictionary *) parameters { - [ADJPackageBuilder parameters:parameters setString:adjustConfig.appToken forKey:@"app_token"]; - [ADJPackageBuilder parameters:parameters setString:adjustConfig.environment forKey:@"environment"]; - [ADJPackageBuilder parameters:parameters setBool:adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; - if (adjustConfig.isDeviceKnown) { - [ADJPackageBuilder parameters:parameters setBool:adjustConfig.isDeviceKnown forKey:@"device_known"]; - } - [ADJPackageBuilder parameters:parameters setString:adjustConfig.secretId forKey:@"secret_id"]; - [ADJPackageBuilder parameters:parameters setString:adjustConfig.appSecret forKey:@"app_secret"]; + return parameters; } -- (void)injectActivityState:(ADJActivityState *)activityState intoParamters:(NSMutableDictionary *)parameters { - if (activityState == nil) { - return; +- (NSMutableDictionary *)getAttributionParameters:(NSString *)initiatedBy { + 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 setString:initiatedBy forKey:@"initiated_by"]; + [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"]; } - [self injectIosUuid:activityState intoParamters:parameters]; - [self injectPushToken:activityState intoParamters:parameters]; + 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"]; + } + } - [ADJPackageBuilder parameters:parameters setInt:activityState.sessionCount forKey:@"session_count"]; - [ADJPackageBuilder parameters:parameters setInt:activityState.subsessionCount forKey:@"subsession_count"]; - [ADJPackageBuilder parameters:parameters setDuration:activityState.sessionLength forKey:@"session_length"]; - [ADJPackageBuilder parameters:parameters setDuration:activityState.timeSpent forKey:@"time_spent"]; + return parameters; } -- (void)injectIosUuid:(ADJActivityState *)activityState intoParamters:(NSMutableDictionary *)parameters { - if (activityState == nil) { - return; - } +- (NSMutableDictionary *)getGdprParameters { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - // Check if UUID was persisted or not. - // If yes, assign it to persistent_ios_uuid parameter. - // If not, assign it to ios_uuid parameter. - if (activityState.isPersisted) { - [ADJPackageBuilder parameters:parameters setString:activityState.uuid forKey:@"persistent_ios_uuid"]; - } else { - [ADJPackageBuilder parameters:parameters setString:activityState.uuid forKey:@"ios_uuid"]; + [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"]; } -} -- (void)injectPushToken:(ADJActivityState *)activityState intoParamters:(NSMutableDictionary *)parameters { - if (activityState == nil) { - return; + 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"]; + } } - [ADJPackageBuilder parameters:parameters setString:activityState.deviceToken forKey:@"push_token"]; + return parameters; +} + +- (ADJActivityPackage *)defaultActivityPackage { + ADJActivityPackage *activityPackage = [[ADJActivityPackage alloc] init]; + activityPackage.clientSdk = self.deviceInfo.clientSdk; + return activityPackage; } - (NSString *)eventSuffix:(ADJEvent *)event { @@ -325,19 +487,11 @@ - (NSString *)eventSuffix:(ADJEvent *)event { } } -+ (void)parameters:(NSMutableDictionary *)parameters setString:(NSString *)value forKey:(NSString *)key { - if (value == nil || [value isEqualToString:@""]) return; - - [parameters setObject:value forKey:key]; -} - + (void)parameters:(NSMutableDictionary *)parameters setInt:(int)value forKey:(NSString *)key { if (value < 0) { return; } - NSString *valueString = [NSString stringWithFormat:@"%d", value]; - [ADJPackageBuilder parameters:parameters setString:valueString forKey:key]; } @@ -345,9 +499,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setDate1970:(double)value f if (value < 0) { return; } - NSString *dateString = [ADJUtil formatSeconds1970:value]; - [ADJPackageBuilder parameters:parameters setString:dateString forKey:key]; } @@ -355,9 +507,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setDate:(NSDate *)value for if (value == nil) { return; } - NSString *dateString = [ADJUtil formatDate:value]; - [ADJPackageBuilder parameters:parameters setString:dateString forKey:key]; } @@ -365,9 +515,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setDuration:(double)value f if (value < 0) { return; } - int intValue = round(value); - [ADJPackageBuilder parameters:parameters setInt:intValue forKey:key]; } @@ -375,42 +523,20 @@ + (void)parameters:(NSMutableDictionary *)parameters setDictionaryJson:(NSDictio if (dictionary == nil) { return; } - if (dictionary.count == 0) { return; } - if (![NSJSONSerialization isValidJSONObject:dictionary]) { return; } NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; NSString *dictionaryString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - [ADJPackageBuilder parameters:parameters setString:dictionaryString forKey:key]; } -+ (void)parameters:(NSMutableDictionary *)parameters setDictionary:(NSDictionary *)dictionary forKey:(NSString *)key { - if (dictionary == nil) { - return; - } - - if (dictionary.count == 0) { - return; - } - - if (dictionary.count == 0) { - return; - } - - NSDictionary *convertedDictionary = [ADJUtil convertDictionaryValues:dictionary]; - - [ADJPackageBuilder parameters:parameters setDictionaryJson:convertedDictionary forKey:key]; -} - + (void)parameters:(NSMutableDictionary *)parameters setBool:(BOOL)value forKey:(NSString *)key { int valueInt = [[NSNumber numberWithBool:value] intValue]; - [ADJPackageBuilder parameters:parameters setInt:valueInt forKey:key]; } @@ -418,9 +544,7 @@ + (void)parameters:(NSMutableDictionary *)parameters setNumber:(NSNumber *)value if (value == nil) { return; } - NSString *numberString = [NSString stringWithFormat:@"%.5f", [value doubleValue]]; - [ADJPackageBuilder parameters:parameters setString:numberString forKey:key]; } @@ -428,7 +552,6 @@ + (void)parameters:(NSMutableDictionary *)parameters setNumberInt:(NSNumber *)va if (value == nil) { return; } - [ADJPackageBuilder parameters:parameters setInt:[value intValue] forKey:key]; } diff --git a/Adjust/ADJUtil.h b/Adjust/ADJUtil.h index 784e86f71..9ad41a01d 100644 --- a/Adjust/ADJUtil.h +++ b/Adjust/ADJUtil.h @@ -112,6 +112,8 @@ typedef void (^isInactiveInjected)(BOOL); + (NSNumber *)readReachabilityFlags; ++ (BOOL)isDeeplinkValid:(NSURL *)url; + #if !TARGET_OS_TV + (NSString *)readMCC; diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 00a58f80a..d2a339b01 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -32,6 +32,7 @@ static NSNumberFormatter *secondsNumberFormatter = nil; static NSRegularExpression *optionalRedirectRegex = nil; static NSRegularExpression *shortUniversalLinkRegex = nil; +static NSRegularExpression *excludedDeeplinkRegex = nil; static NSURLSessionConfiguration *urlSessionConfiguration = nil; #if !TARGET_OS_TV @@ -39,13 +40,14 @@ static CTTelephonyNetworkInfo *networkInfo = nil; #endif -static NSString * const kClientSdk = @"ios4.15.0"; +static NSString * const kClientSdk = @"ios4.16.0"; static NSString * const kDeeplinkParam = @"deep_link="; static NSString * const kSchemeDelimiter = @"://"; static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; static NSString * const kUniversalLinkPattern = @"https://[^.]*\\.ulink\\.adjust\\.com/ulink/?(.*)"; static NSString * const kOptionalRedirectPattern = @"adjust_redirect=[^&#]*"; static NSString * const kShortUniversalLinkPattern = @"http[s]?://[a-z0-9]{4}\\.adj\\.st/?(.*)"; +static NSString * const kExcludedDeeplinksPattern = @"^(fb|vk)[0-9]{5,}[^:]*://authorize.*access_token=.*"; static NSString * const kDateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z"; @implementation ADJUtil @@ -59,6 +61,7 @@ + (void)initialize { [self initializeSecondsNumberFormatter]; [self initializeShortUniversalLinkRegex]; [self initializeOptionalRedirectRegex]; + [self initializeExcludedDeeplinkRegex]; [self initializeUrlSessionConfiguration]; [self initializeReachability]; #if !TARGET_OS_TV @@ -116,6 +119,18 @@ + (void)initializeOptionalRedirectRegex { optionalRedirectRegex = regex; } ++ (void)initializeExcludedDeeplinkRegex { + NSError *error = NULL; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:kExcludedDeeplinksPattern + options:NSRegularExpressionCaseInsensitive + error:&error]; + if ([ADJUtil isNotNull:error]) { + [ADJAdjustFactory.logger error:@"Excluded deep link regex rule error (%@)", [error description]]; + return; + } + excludedDeeplinkRegex = regex; +} + + (void)initializeSecondsNumberFormatter { secondsNumberFormatter = [[NSNumberFormatter alloc] init]; [secondsNumberFormatter setPositiveFormat:@"0.0"]; @@ -1264,6 +1279,30 @@ + (NSNumber *)readReachabilityFlags { return [reachability currentReachabilityFlags]; } ++ (BOOL)isDeeplinkValid:(NSURL *)url { + if (url == nil) { + return NO; + } + if ([[url absoluteString] length] == 0) { + return NO; + } + if (excludedDeeplinkRegex == nil) { + [ADJAdjustFactory.logger error:@"Excluded deep link regex not correctly configured"]; + return NO; + } + + NSString *urlString = [url absoluteString]; + NSArray *matches = [excludedDeeplinkRegex matchesInString:urlString + options:0 + range:NSMakeRange(0, [urlString length])]; + if ([matches count] > 0) { + [ADJAdjustFactory.logger debug:[NSString stringWithFormat:@"Deep link (%@) processing skipped", urlString]]; + return NO; + } + + return YES; +} + #if !TARGET_OS_TV + (NSString *)readMCC { if (carrier == nil) { diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index b7b20046d..4f4666471 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust // -// V4.15.0 +// V4.16.0 // Created by Christian Wellenbrock (wellle) on 23rd July 2013. // Copyright © 2012-2017 Adjust GmbH. All rights reserved. // diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index b541d257a..bcc181885 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -20,13 +20,13 @@ @interface AdjustBridge() @property BOOL openDeferredDeeplink; @property (nonatomic, copy) NSString *fbPixelDefaultEventToken; -@property (nonatomic, strong) NSMutableDictionary* fbPixelMapping; @property (nonatomic, copy) NSString *attributionCallbackName; @property (nonatomic, copy) NSString *eventSuccessCallbackName; @property (nonatomic, copy) NSString *eventFailureCallbackName; @property (nonatomic, copy) NSString *sessionSuccessCallbackName; @property (nonatomic, copy) NSString *sessionFailureCallbackName; @property (nonatomic, copy) NSString *deferredDeeplinkCallbackName; +@property (nonatomic, strong) NSMutableDictionary *fbPixelMapping; @end @@ -41,9 +41,19 @@ - (id)init { } _bridgeRegister = nil; + [self resetAdjustBridge]; return self; } +- (void)resetAdjustBridge { + self.attributionCallbackName = nil; + self.eventSuccessCallbackName = nil; + self.eventFailureCallbackName = nil; + self.sessionSuccessCallbackName = nil; + self.sessionFailureCallbackName = nil; + self.deferredDeeplinkCallbackName = nil; +} + #pragma mark - AdjustDelegate methods - (void)adjustAttributionChanged:(ADJAttribution *)attribution { @@ -64,7 +74,12 @@ - (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData [eventSuccessResponseDataDictionary setValue:eventSuccessResponseData.adid forKey:@"adid"]; [eventSuccessResponseDataDictionary setValue:eventSuccessResponseData.eventToken forKey:@"eventToken"]; [eventSuccessResponseDataDictionary setValue:eventSuccessResponseData.callbackId forKey:@"callbackId"]; - [eventSuccessResponseDataDictionary setValue:eventSuccessResponseData.jsonResponse forKey:@"jsonResponse"]; + + NSString *jsonResponse = [self convertJsonDictionaryToNSString:eventSuccessResponseData.jsonResponse]; + if (jsonResponse == nil) { + jsonResponse = @"{}"; + } + [eventSuccessResponseDataDictionary setValue:jsonResponse forKey:@"jsonResponse"]; [self.bridgeRegister callHandler:self.eventSuccessCallbackName data:eventSuccessResponseDataDictionary]; } @@ -80,9 +95,13 @@ - (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData { [eventFailureResponseDataDictionary setValue:eventFailureResponseData.adid forKey:@"adid"]; [eventFailureResponseDataDictionary setValue:eventFailureResponseData.eventToken forKey:@"eventToken"]; [eventFailureResponseDataDictionary setValue:eventFailureResponseData.callbackId forKey:@"callbackId"]; - [eventFailureResponseDataDictionary setValue:[NSNumber numberWithBool:eventFailureResponseData.willRetry] forKey:@"willRetry"]; - [eventFailureResponseDataDictionary setValue:eventFailureResponseData.jsonResponse forKey:@"jsonResponse"]; + + NSString *jsonResponse = [self convertJsonDictionaryToNSString:eventFailureResponseData.jsonResponse]; + if (jsonResponse == nil) { + jsonResponse = @"{}"; + } + [eventFailureResponseDataDictionary setValue:jsonResponse forKey:@"jsonResponse"]; [self.bridgeRegister callHandler:self.eventFailureCallbackName data:eventFailureResponseDataDictionary]; } @@ -96,7 +115,12 @@ - (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessRespon [sessionSuccessResponseDataDictionary setValue:sessionSuccessResponseData.message forKey:@"message"]; [sessionSuccessResponseDataDictionary setValue:sessionSuccessResponseData.timeStamp forKey:@"timestamp"]; [sessionSuccessResponseDataDictionary setValue:sessionSuccessResponseData.adid forKey:@"adid"]; - [sessionSuccessResponseDataDictionary setValue:sessionSuccessResponseData.jsonResponse forKey:@"jsonResponse"]; + + NSString *jsonResponse = [self convertJsonDictionaryToNSString:sessionSuccessResponseData.jsonResponse]; + if (jsonResponse == nil) { + jsonResponse = @"{}"; + } + [sessionSuccessResponseDataDictionary setValue:jsonResponse forKey:@"jsonResponse"]; [self.bridgeRegister callHandler:self.sessionSuccessCallbackName data:sessionSuccessResponseDataDictionary]; } @@ -111,7 +135,12 @@ - (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseD [sessionFailureResponseDataDictionary setValue:sessionFailureResponseData.timeStamp forKey:@"timestamp"]; [sessionFailureResponseDataDictionary setValue:sessionFailureResponseData.adid forKey:@"adid"]; [sessionFailureResponseDataDictionary setValue:[NSNumber numberWithBool:sessionFailureResponseData.willRetry] forKey:@"willRetry"]; - [sessionFailureResponseDataDictionary setValue:sessionFailureResponseData.jsonResponse forKey:@"jsonResponse"]; + + NSString *jsonResponse = [self convertJsonDictionaryToNSString:sessionFailureResponseData.jsonResponse]; + if (jsonResponse == nil) { + jsonResponse = @"{}"; + } + [sessionFailureResponseDataDictionary setValue:jsonResponse forKey:@"jsonResponse"]; [self.bridgeRegister callHandler:self.sessionFailureCallbackName data:sessionFailureResponseDataDictionary]; } @@ -150,11 +179,7 @@ - (void)loadUIWebViewBridge:(WVJB_WEBVIEW_TYPE *)webView // WebViewBridge already loaded. return; } -/* - AdjustUIBridgeRegister *uiBridgeRegister = [AdjustUIBridgeRegister bridgeRegisterWithUIWebView:webView]; - [uiBridgeRegister setWebViewDelegate:webViewDelegate]; - _bridgeRegister = uiBridgeRegister; - */ + [self loadWebViewBridge:webView webViewDelegate:webViewDelegate]; } @@ -164,11 +189,7 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView // WebViewBridge already loaded. return; } -/* - AdjustWKBridgeRegister *wkBridgeRegister = [AdjustWKBridgeRegister bridgeRegisterWithWKWebView:wkWebView]; - [wkBridgeRegister setWebViewDelegate:wkWebViewDelegate]; - _bridgeRegister = wkBridgeRegister; -*/ + [self loadWebViewBridge:wkWebView webViewDelegate:wkWebViewDelegate]; } @@ -189,19 +210,19 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { NSString *userAgent = [data objectForKey:@"userAgent"]; NSNumber *isDeviceKnown = [data objectForKey:@"isDeviceKnown"]; NSNumber *secretId = [data objectForKey:@"secretId"]; - NSNumber *info1 = [data objectForKey:@"info1"]; - NSNumber *info2 = [data objectForKey:@"info2"]; - NSNumber *info3 = [data objectForKey:@"info3"]; - NSNumber *info4 = [data objectForKey:@"info4"]; + NSString *info1 = [data objectForKey:@"info1"]; + NSString *info2 = [data objectForKey:@"info2"]; + NSString *info3 = [data objectForKey:@"info3"]; + NSString *info4 = [data objectForKey:@"info4"]; NSNumber *openDeferredDeeplink = [data objectForKey:@"openDeferredDeeplink"]; NSString *fbPixelDefaultEventToken = [data objectForKey:@"fbPixelDefaultEventToken"]; id fbPixelMapping = [data objectForKey:@"fbPixelMapping"]; - NSString * attributionCallback = [data objectForKey:@"attributionCallback"]; - NSString * eventSuccessCallback = [data objectForKey:@"eventSuccessCallback"]; - NSString * eventFailureCallback = [data objectForKey:@"eventFailureCallback"]; - NSString * sessionSuccessCallback = [data objectForKey:@"sessionSuccessCallback"]; - NSString * sessionFailureCallback = [data objectForKey:@"sessionFailureCallback"]; - NSString * deferredDeeplinkCallback = [data objectForKey:@"deferredDeeplinkCallback"]; + NSString *attributionCallback = [data objectForKey:@"attributionCallback"]; + NSString *eventSuccessCallback = [data objectForKey:@"eventSuccessCallback"]; + NSString *eventFailureCallback = [data objectForKey:@"eventFailureCallback"]; + NSString *sessionSuccessCallback = [data objectForKey:@"sessionSuccessCallback"]; + NSString *sessionFailureCallback = [data objectForKey:@"sessionFailureCallback"]; + NSString *deferredDeeplinkCallback = [data objectForKey:@"deferredDeeplinkCallback"]; ADJConfig *adjustConfig; if ([self isFieldValid:allowSuppressLogLevel]) { @@ -245,11 +266,11 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { && [self isFieldValid:info3] && [self isFieldValid:info4]; if (isAppSecretDefined) { - [adjustConfig setAppSecret:[secretId unsignedIntegerValue] - info1:[info1 unsignedIntegerValue] - info2:[info2 unsignedIntegerValue] - info3:[info3 unsignedIntegerValue] - info4:[info4 unsignedIntegerValue]]; + [adjustConfig setAppSecret:[[self fieldToNSNumber:secretId] unsignedIntegerValue] + info1:[[self fieldToNSNumber:info1] unsignedIntegerValue] + info2:[[self fieldToNSNumber:info2] unsignedIntegerValue] + info3:[[self fieldToNSNumber:info3] unsignedIntegerValue] + info4:[[self fieldToNSNumber:info4] unsignedIntegerValue]]; } if ([self isFieldValid:openDeferredDeeplink]) { self.openDeferredDeeplink = [openDeferredDeeplink boolValue]; @@ -285,14 +306,13 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { } // Set self as delegate if any callback is configured. - // Change to swifle the methods in the future. + // Change to swizzle the methods in the future. if (self.attributionCallbackName != nil || self.eventSuccessCallbackName != nil || self.eventFailureCallbackName != nil || self.sessionSuccessCallbackName != nil || self.sessionFailureCallbackName != nil - || self.deferredDeeplinkCallbackName != nil) - { + || self.deferredDeeplinkCallbackName != nil) { [adjustConfig setDelegate:self]; } @@ -397,6 +417,7 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { if (responseCallback == nil) { return; } + ADJAttribution *attribution = [Adjust attribution]; NSDictionary *attributionDictionary = nil; if (attribution != nil) { @@ -437,22 +458,76 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { }]; [self.bridgeRegister registerHandler:@"adjust_resetSessionCallbackParameters" handler:^(id data, WVJBResponseCallback responseCallback) { - if (![data isKindOfClass:[NSString class]]) { - return; - } [Adjust resetSessionCallbackParameters]; }]; [self.bridgeRegister registerHandler:@"adjust_resetSessionPartnerParameters" handler:^(id data, WVJBResponseCallback responseCallback) { - if (![data isKindOfClass:[NSString class]]) { - return; - } [Adjust resetSessionPartnerParameters]; }]; [self.bridgeRegister registerHandler:@"adjust_gdprForgetMe" handler:^(id data, WVJBResponseCallback responseCallback) { [Adjust gdprForgetMe]; }]; + + [self.bridgeRegister registerHandler:@"adjust_setTestOptions" handler:^(id data, WVJBResponseCallback responseCallback) { + NSString *baseUrl = [data objectForKey:@"baseUrl"]; + NSString *gdprUrl = [data objectForKey:@"gdprUrl"]; + NSString *basePath = [data objectForKey:@"basePath"]; + NSString *gdprPath = [data objectForKey:@"gdprPath"]; + NSNumber *timerIntervalInMilliseconds = [data objectForKey:@"timerIntervalInMilliseconds"]; + NSNumber *timerStartInMilliseconds = [data objectForKey:@"timerStartInMilliseconds"]; + NSNumber *sessionIntervalInMilliseconds = [data objectForKey:@"sessionIntervalInMilliseconds"]; + NSNumber *subsessionIntervalInMilliseconds = [data objectForKey:@"subsessionIntervalInMilliseconds"]; + NSNumber *teardown = [data objectForKey:@"teardown"]; + NSNumber *deleteState = [data objectForKey:@"deleteState"]; + NSNumber *noBackoffWait = [data objectForKey:@"noBackoffWait"]; + NSNumber *iAdFrameworkEnabled = [data objectForKey:@"iAdFrameworkEnabled"]; + + AdjustTestOptions *testOptions = [[AdjustTestOptions alloc] init]; + + if ([self isFieldValid:baseUrl]) { + testOptions.baseUrl = baseUrl; + } + if ([self isFieldValid:gdprUrl]) { + testOptions.gdprUrl = gdprUrl; + } + if ([self isFieldValid:basePath]) { + testOptions.basePath = basePath; + } + if ([self isFieldValid:gdprPath]) { + testOptions.gdprPath = gdprPath; + } + if ([self isFieldValid:timerIntervalInMilliseconds]) { + testOptions.timerIntervalInMilliseconds = timerIntervalInMilliseconds; + } + if ([self isFieldValid:timerStartInMilliseconds]) { + testOptions.timerStartInMilliseconds = timerStartInMilliseconds; + } + if ([self isFieldValid:sessionIntervalInMilliseconds]) { + testOptions.sessionIntervalInMilliseconds = sessionIntervalInMilliseconds; + } + if ([self isFieldValid:subsessionIntervalInMilliseconds]) { + testOptions.subsessionIntervalInMilliseconds = subsessionIntervalInMilliseconds; + } + if ([self isFieldValid:teardown]) { + testOptions.teardown = [teardown boolValue]; + if (testOptions.teardown) { + [self resetAdjustBridge]; + } + } + if ([self isFieldValid:deleteState]) { + testOptions.deleteState = [deleteState boolValue]; + } + if ([self isFieldValid:noBackoffWait]) { + testOptions.noBackoffWait = [noBackoffWait boolValue]; + } + if ([self isFieldValid:iAdFrameworkEnabled]) { + testOptions.iAdFrameworkEnabled = [iAdFrameworkEnabled boolValue]; + } + + [Adjust setTestOptions:testOptions]; + }]; + } - (void)registerAugmentedView { @@ -479,7 +554,6 @@ - (void)registerAugmentedView { } id customData = [data objectForKey:@"customData"]; - [fbPixelEvent addPartnerParameter:@"_fb_pixel_referral_id" value:pixelID]; // [fbPixelEvent addPartnerParameter:@"_eventName" value:evtName]; if ([customData isKindOfClass:[NSString class]]) { @@ -506,15 +580,18 @@ - (BOOL)isFieldValid:(NSObject *)field { if ([field isKindOfClass:[NSNull class]]) { return NO; } - return YES; + if ([[field description] length] == 0) { + return NO; + } + return !!field; } - (NSString *)getFbAppId { NSString *facebookLoggingOverrideAppID = [self getValueFromBundleByKey:@"FacebookLoggingOverrideAppID"]; - if (facebookLoggingOverrideAppID != nil) { return facebookLoggingOverrideAppID; } + return [self getValueFromBundleByKey:@"FacebookAppID"]; } @@ -526,7 +603,34 @@ - (NSString *)getEventTokenFromFbPixelEventName:(NSString *)fbPixelEventName { if (self.fbPixelMapping == nil) { return nil; } + return [self.fbPixelMapping objectForKey:fbPixelEventName]; } +- (NSString *)convertJsonDictionaryToNSString:(NSDictionary *)jsonDictionary { + if (jsonDictionary == nil) { + return nil; + } + + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary + options:NSJSONWritingPrettyPrinted + error:&error]; + if (!jsonData) { + NSLog(@"Unable to conver NSDictionary with JSON response to JSON string: %@", error); + return nil; + } + + NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + return jsonString; +} + +- (NSNumber *)fieldToNSNumber:(NSObject *)field { + if (![self isFieldValid:field]) { + return nil; + } + NSNumberFormatter *formatString = [[NSNumberFormatter alloc] init]; + return [formatString numberFromString:[field description]]; +} + @end diff --git a/AdjustBridge/AdjustBridgeRegister.h b/AdjustBridge/AdjustBridgeRegister.h index d35042223..24074cade 100644 --- a/AdjustBridge/AdjustBridgeRegister.h +++ b/AdjustBridge/AdjustBridgeRegister.h @@ -11,36 +11,12 @@ @interface AdjustBridgeRegister : NSObject ++ (NSString *)AdjustBridge_js; + - (id)initWithWebView:(id)webView; - (void)setWebViewDelegate:(id)webViewDelegate; - - (void)callHandler:(NSString *)handlerName data:(id)data; - (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler; - (void)augmentHybridWebView:(NSString *)fbAppId; -+ (NSString *)AdjustBridge_js; - -@end -/* -@protocol AdjustBridgeRegister - -- (void)callHandler:(NSString *)handlerName data:(id)data; -- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler; -- (void)augmentHybridWebView; -+ (NSString *)AdjustBridge_js; - -@end - -@interface AdjustUIBridgeRegister : NSObject - -+ (id)bridgeRegisterWithUIWebView:(WVJB_WEBVIEW_TYPE *)webView; -- (void)setWebViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE *)webViewDelegate; - -@end - -@interface AdjustWKBridgeRegister : NSObject - -+ (id)bridgeRegisterWithWKWebView:(WKWebView *)webView; -- (void)setWebViewDelegate:(id)webViewDelegate; @end -*/ diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 212865914..17f4be2da 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -75,130 +75,135 @@ + (NSString *)augmented_js { } + (NSString *)adjust_js { - static NSString * preprocessorJSCode = @__adj_js_func__(;(function() { + static NSString *preprocessorJSCode = @__adj_js_func__(;(function() { if (window.Adjust) { return; } // copied from adjust.js window.Adjust = { - appDidLaunch: function (adjustConfig) { - if (WebViewJavascriptBridge) { - if (adjustConfig) { - adjustConfig.registerCallbackHandlers(); - WebViewJavascriptBridge.callHandler('adjust_appDidLaunch', adjustConfig, null); + appDidLaunch: function (adjustConfig) { + if (WebViewJavascriptBridge) { + if (adjustConfig) { + adjustConfig.registerCallbackHandlers(); + WebViewJavascriptBridge.callHandler('adjust_appDidLaunch', adjustConfig, null); + } + } + }, + trackEvent: function (adjustEvent) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_trackEvent', adjustEvent, null); + } + }, + trackSubsessionStart: function() { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_trackSubsessionStart', null, null); + } + }, + trackSubsessionEnd: function() { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_trackSubsessionEnd', null, null); + } + }, + setEnabled: function (enabled) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_setEnabled', enabled, null); + } + }, + isEnabled: function (callback) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_isEnabled', null, + function(response) { + callback(new Boolean(response)); + } + ); + } + }, + appWillOpenUrl: function (url) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_appWillOpenUrl', url, null); + } + }, + setDeviceToken: function (deviceToken) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_setDeviceToken', deviceToken, null); + } + }, + setOfflineMode: function(isOffline) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_setOfflineMode', isOffline, null); + } + }, + getIdfa: function (callback) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_idfa', null, callback); + } + }, + getAdid: function (callback) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_adid', null, callback); + } + }, + getAttribution: function (callback) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_attribution', null, callback); + } + }, + sendFirstPackages: function () { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_sendFirstPackages', null, null); + } + }, + addSessionCallbackParameter: function (key, value) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_addSessionCallbackParameter', {key: key, value: value}, null); + } + }, + addSessionPartnerParameter: function (key, value) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_addSessionPartnerParameter', {key: key, value: value}, null); + } + }, + removeSessionCallbackParameter: function (key) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_removeSessionCallbackParameter', key, null); + } + }, + removeSessionPartnerParameter: function (key) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_removeSessionPartnerParameter', key, null); + } + }, + resetSessionCallbackParameters: function () { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_resetSessionCallbackParameters', null, null); + } + }, + resetSessionPartnerParameters: function () { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_resetSessionPartnerParameters', null, null); + } + }, + gdprForgetMe: function () { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_gdprForgetMe', null, null); + } + }, + fbPixelEvent: function (pixelID, evtName, customData) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_fbPixelEvent', + { pixelID: pixelID, + evtName:evtName, + customData: customData + }, + null); + } + }, + setTestOptions: function (testOptions) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_setTestOptions', testOptions, null); } } - }, - trackEvent: function (adjustEvent) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_trackEvent', adjustEvent, null); - } - }, - trackSubsessionStart: function() { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_trackSubsessionStart', null, null); - } - }, - trackSubsessionEnd: function() { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_trackSubsessionEnd', null, null); - } - }, - setEnabled: function (enabled) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_setEnabled', enabled, null); - } - }, - isEnabled: function (callback) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_isEnabled', null, - function(response) { - callback(new Boolean(response)); - } - ); - } - }, - appWillOpenUrl: function (url) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_appWillOpenUrl', url, null); - } - }, - setDeviceToken: function (deviceToken) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_setDeviceToken', deviceToken, null); - } - }, - setOfflineMode: function(isOffline) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_setOfflineMode', isOffline, null); - } - }, - getIdfa: function (callback) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_idfa', null, callback); - } - }, - getAdid: function (callback) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_adid', null, callback); - } - }, - getAttribution: function (callback) { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_attribution', null, callback); - } - }, - sendFirstPackages: function () { - if (WebViewJavascriptBridge) { - WebViewJavascriptBridge.callHandler('adjust_sendFirstPackages', null, null); - } - }, - addSessionCallbackParameter: function (key, value) { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_addSessionCallbackParameter', {key: key, value: value}, null); - } - }, - addSessionPartnerParameter: function (key, value) { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_addSessionPartnerParameter', {key: key, value: value}, null); - } - }, - removeSessionCallbackParameter: function (key) { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_removeSessionCallbackParameter', key, null); - } - }, - removeSessionPartnerParameter: function (key) { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_removeSessionPartnerParameter', key, null); - } - }, - resetSessionCallbackParameters: function () { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_resetSessionCallbackParameters', null, null); - } - }, - resetSessionPartnerParameters: function () { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_resetSessionPartnerParameters', null, null); - } - }, - gdprForgetMe: function () { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_gdprForgetMe', null, null); - } - }, - fbPixelEvent: function (pixelID, evtName, customData) { - if (WebViewJavascriptBridge != null) { - WebViewJavascriptBridge.callHandler('adjust_fbPixelEvent', - { pixelID: pixelID, - evtName:evtName, - customData: customData - }, - null); - } - } }; // copied from adjust_event.js @@ -259,7 +264,7 @@ + (NSString *)adjust_js { } } - this.sdkPrefix = 'web-bridge4.15.0'; + this.sdkPrefix = 'web-bridge4.16.0'; this.defaultTracker = null; this.logLevel = null; this.eventBufferingEnabled = null; diff --git a/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m b/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m index 73c923db6..e104c7687 100644 --- a/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m +++ b/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m @@ -96,7 +96,7 @@ - (void)WKFlushMessageQueue { if (error != nil) { NSLog(@"WebViewJavascriptBridge: WARNING: Error when trying to fetch data from WKWebView: %@", error); } - [_base flushMessageQueue:result]; + [self->_base flushMessageQueue:result]; }]; } diff --git a/AdjustSdkWebBridge/AdjustSdkWebBridge.h b/AdjustSdkWebBridge/AdjustSdkWebBridge.h index 9c057d66d..41390f6e3 100644 --- a/AdjustSdkWebBridge/AdjustSdkWebBridge.h +++ b/AdjustSdkWebBridge/AdjustSdkWebBridge.h @@ -28,7 +28,6 @@ FOUNDATION_EXPORT const unsigned char AdjustSdkWebBridgeVersionString[]; #import // Exposing entire WebViewJavascriptBridge framework -#import #import #import #import diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj index 9e6c655b0..06744588b 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj @@ -59,6 +59,9 @@ 6FFCFE70200797D100467F01 /* ATAAdjustDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FFCFE66200797D000467F01 /* ATAAdjustDelegate.m */; }; 6FFCFE71200797D100467F01 /* ATAAdjustDelegateEventSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FFCFE69200797D000467F01 /* ATAAdjustDelegateEventSuccess.m */; }; 6FFCFE72200797D100467F01 /* ATAAdjustDelegateSessionSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FFCFE6A200797D000467F01 /* ATAAdjustDelegateSessionSuccess.m */; }; + 9D1D8E9E219246E50088E3CF /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D1D8E9D219246E50088E3CF /* iAd.framework */; }; + 9D1D8EA0219246EA0088E3CF /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D1D8E9F219246EA0088E3CF /* AdSupport.framework */; }; + 9D1D8EA2219246EF0088E3CF /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D1D8EA1219246EF0088E3CF /* CoreTelephony.framework */; }; 9D75AFDB210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75AFDA210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m */; }; /* End PBXBuildFile section */ @@ -167,6 +170,9 @@ 6FFCFE6A200797D000467F01 /* ATAAdjustDelegateSessionSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATAAdjustDelegateSessionSuccess.m; sourceTree = ""; }; 6FFCFE6B200797D000467F01 /* ATAAdjustDelegateEventSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATAAdjustDelegateEventSuccess.h; sourceTree = ""; }; 6FFCFE6C200797D000467F01 /* ATAAdjustDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATAAdjustDelegate.h; sourceTree = ""; }; + 9D1D8E9D219246E50088E3CF /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; }; + 9D1D8E9F219246EA0088E3CF /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; + 9D1D8EA1219246EF0088E3CF /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; 9D75AFD9210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ATAAdjustDelegateDeferredDeeplink.h; sourceTree = ""; }; 9D75AFDA210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ATAAdjustDelegateDeferredDeeplink.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -176,6 +182,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9D1D8E9E219246E50088E3CF /* iAd.framework in Frameworks */, + 9D1D8EA0219246EA0088E3CF /* AdSupport.framework in Frameworks */, + 9D1D8EA2219246EF0088E3CF /* CoreTelephony.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -187,6 +196,7 @@ children = ( 6F0842292007769F00568A31 /* AdjustTestApp */, 6F0842282007769F00568A31 /* Products */, + 9D1D8E9C219246E50088E3CF /* Frameworks */, ); sourceTree = ""; }; @@ -344,6 +354,16 @@ path = Delegates; sourceTree = ""; }; + 9D1D8E9C219246E50088E3CF /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9D1D8EA1219246EF0088E3CF /* CoreTelephony.framework */, + 9D1D8E9F219246EA0088E3CF /* AdSupport.framework */, + 9D1D8E9D219246E50088E3CF /* iAd.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m index 58c65b45b..833b09600 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m @@ -36,7 +36,7 @@ - (void)viewDidLoad { } - (void)startTestSession { - [self.testLibrary startTestSession:@"ios4.15.0"]; + [self.testLibrary startTestSession:@"ios4.16.0"]; } - (void)didReceiveMemoryWarning { diff --git a/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj b/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj index 6e2b6200d..f18ae26b6 100644 --- a/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj @@ -168,7 +168,7 @@ 6F0842042007766700568A31 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0940; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = adjust; TargetAttributes = { 20E71745203B162B0073AC91 = { diff --git a/AdjustTests/AdjustUnitTests/ADJPackageFields.m b/AdjustTests/AdjustUnitTests/ADJPackageFields.m index 4bdd13b98..180e3bf5e 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.15.0"; + self.clientSdk = @"ios4.16.0"; self.suffix = @""; self.environment = @"sandbox"; diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj new file mode 100644 index 000000000..0230a01d2 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -0,0 +1,709 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 6F7AF62B211878BA00F730B2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF62A211878BA00F730B2 /* AppDelegate.m */; }; + 6F7AF631211878BA00F730B2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6F7AF62F211878BA00F730B2 /* Main.storyboard */; }; + 6F7AF633211878BC00F730B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F7AF632211878BC00F730B2 /* Assets.xcassets */; }; + 6F7AF636211878BC00F730B2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6F7AF634211878BC00F730B2 /* LaunchScreen.storyboard */; }; + 6F7AF639211878BC00F730B2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF638211878BC00F730B2 /* main.m */; }; + 6F7AF73121187CFF00F730B2 /* ADJDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6EE21187CFE00F730B2 /* ADJDeviceInfo.m */; }; + 6F7AF73221187CFF00F730B2 /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6EF21187CFE00F730B2 /* ADJTimerOnce.m */; }; + 6F7AF73321187CFF00F730B2 /* ADJAttributionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6F021187CFE00F730B2 /* ADJAttributionHandler.m */; }; + 6F7AF73421187CFF00F730B2 /* ADJRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6F321187CFE00F730B2 /* ADJRequestHandler.m */; }; + 6F7AF73521187CFF00F730B2 /* ADJKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6F621187CFE00F730B2 /* ADJKeychain.m */; }; + 6F7AF73621187CFF00F730B2 /* ADJSdkClickHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6F721187CFE00F730B2 /* ADJSdkClickHandler.m */; }; + 6F7AF73721187CFF00F730B2 /* ADJEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6F921187CFE00F730B2 /* ADJEvent.m */; }; + 6F7AF73821187CFF00F730B2 /* ADJSessionSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6FD21187CFE00F730B2 /* ADJSessionSuccess.m */; }; + 6F7AF73921187CFF00F730B2 /* ADJEventFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF6FE21187CFE00F730B2 /* ADJEventFailure.m */; }; + 6F7AF73A21187CFF00F730B2 /* ADJEventSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70021187CFE00F730B2 /* ADJEventSuccess.m */; }; + 6F7AF73B21187CFF00F730B2 /* ADJActivityState.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70121187CFE00F730B2 /* ADJActivityState.m */; }; + 6F7AF73C21187CFF00F730B2 /* ADJSessionFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70221187CFE00F730B2 /* ADJSessionFailure.m */; }; + 6F7AF73D21187CFF00F730B2 /* ADJTimerCycle.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70621187CFE00F730B2 /* ADJTimerCycle.m */; }; + 6F7AF73E21187CFF00F730B2 /* ADJSessionParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70721187CFE00F730B2 /* ADJSessionParameters.m */; }; + 6F7AF73F21187CFF00F730B2 /* ADJLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70821187CFE00F730B2 /* ADJLogger.m */; }; + 6F7AF74021187CFF00F730B2 /* ADJBackoffStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70921187CFE00F730B2 /* ADJBackoffStrategy.m */; }; + 6F7AF74121187CFF00F730B2 /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70B21187CFE00F730B2 /* Adjust.m */; }; + 6F7AF74221187CFF00F730B2 /* ADJConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF70F21187CFE00F730B2 /* ADJConfig.m */; }; + 6F7AF74321187CFF00F730B2 /* ADJPackageHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71021187CFE00F730B2 /* ADJPackageHandler.m */; }; + 6F7AF74421187CFF00F730B2 /* ADJActivityKind.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71321187CFE00F730B2 /* ADJActivityKind.m */; }; + 6F7AF74521187CFF00F730B2 /* NSString+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71621187CFE00F730B2 /* NSString+ADJAdditions.m */; }; + 6F7AF74621187CFF00F730B2 /* NSData+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71821187CFE00F730B2 /* NSData+ADJAdditions.m */; }; + 6F7AF74721187CFF00F730B2 /* UIDevice+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71A21187CFE00F730B2 /* UIDevice+ADJAdditions.m */; }; + 6F7AF74821187CFF00F730B2 /* ADJAttribution.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71C21187CFE00F730B2 /* ADJAttribution.m */; }; + 6F7AF74921187CFF00F730B2 /* ADJSystemProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71D21187CFE00F730B2 /* ADJSystemProfile.m */; }; + 6F7AF74A21187CFF00F730B2 /* ADJActivityPackage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF71F21187CFE00F730B2 /* ADJActivityPackage.m */; }; + 6F7AF74B21187CFF00F730B2 /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF72021187CFE00F730B2 /* ADJUtil.m */; }; + 6F7AF74C21187CFF00F730B2 /* ADJAdjustFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF72321187CFE00F730B2 /* ADJAdjustFactory.m */; }; + 6F7AF74D21187CFF00F730B2 /* ADJResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF72621187CFE00F730B2 /* ADJResponseData.m */; }; + 6F7AF74E21187CFF00F730B2 /* ADJPackageBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF72821187CFE00F730B2 /* ADJPackageBuilder.m */; }; + 6F7AF74F21187CFF00F730B2 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF72921187CFE00F730B2 /* ADJUserDefaults.m */; }; + 6F7AF75121187CFF00F730B2 /* ADJActivityHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF72F21187CFF00F730B2 /* ADJActivityHandler.m */; }; + 6F7AF75221187CFF00F730B2 /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF73021187CFF00F730B2 /* ADJReachability.m */; }; + 6F7AF76321187D0500F730B2 /* AdjustBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF75421187D0500F730B2 /* AdjustBridge.m */; }; + 6F7AF76421187D0500F730B2 /* WebViewJavascriptBridgeBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF75721187D0500F730B2 /* WebViewJavascriptBridgeBase.m */; }; + 6F7AF76621187D0500F730B2 /* WKWebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF75921187D0500F730B2 /* WKWebViewJavascriptBridge.m */; }; + 6F7AF76721187D0500F730B2 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF75A21187D0500F730B2 /* WebViewJavascriptBridge.m */; }; + 6F7AF76821187D0500F730B2 /* WebViewJavascriptBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF75E21187D0500F730B2 /* WebViewJavascriptBridge_JS.m */; }; + 6F7AF76921187D0500F730B2 /* AdjustBridgeRegister.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF76221187D0500F730B2 /* AdjustBridgeRegister.m */; }; + 6F7AF77821187D1C00F730B2 /* ATLTestInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF76B21187D1C00F730B2 /* ATLTestInfo.m */; }; + 6F7AF77921187D1C00F730B2 /* ATLUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF77221187D1C00F730B2 /* ATLUtil.m */; }; + 6F7AF77A21187D1C00F730B2 /* ATLControlChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF77421187D1C00F730B2 /* ATLControlChannel.m */; }; + 6F7AF77B21187D1C00F730B2 /* ATLUtilNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF77521187D1C00F730B2 /* ATLUtilNetworking.m */; }; + 6F7AF77C21187D1C00F730B2 /* ATLTestLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF77621187D1C00F730B2 /* ATLTestLibrary.m */; }; + 6F7AF77D21187D1C00F730B2 /* ATLBlockingQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF77721187D1C00F730B2 /* ATLBlockingQueue.m */; }; + 6F7AF78821187EA400F730B2 /* UIWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF78721187EA400F730B2 /* UIWebViewController.m */; }; + 6F7AF78B21187EC500F730B2 /* WKWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF78A21187EC500F730B2 /* WKWebViewController.m */; }; + 6F7AF78D2118808400F730B2 /* AdjustTestApp-WebView.html in Resources */ = {isa = PBXBuildFile; fileRef = 6F7AF78C2118808300F730B2 /* AdjustTestApp-WebView.html */; }; + 6F7AF790211888B500F730B2 /* TestLibraryBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF78F211888B500F730B2 /* TestLibraryBridge.m */; }; + 6F7AF7B02118949C00F730B2 /* TestLibraryBridge.js in Resources */ = {isa = PBXBuildFile; fileRef = 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */; }; + 6F7AF7BB2118992200F730B2 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F7AF7BA2118992200F730B2 /* WebKit.framework */; }; + 6FD0412C211C71D1008D42D0 /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD0412B211C71D1008D42D0 /* iAd.framework */; }; + 6FD0412E211C71D9008D42D0 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD0412D211C71D9008D42D0 /* AdSupport.framework */; }; + 6FD04130211C71E8008D42D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD0412F211C71E8008D42D0 /* Foundation.framework */; }; + 6FD04132211C71EF008D42D0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD04131211C71EE008D42D0 /* UIKit.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 6F7AF626211878B900F730B2 /* AdjustWebBridgeTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AdjustWebBridgeTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6F7AF629211878BA00F730B2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 6F7AF62A211878BA00F730B2 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 6F7AF630211878BA00F730B2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 6F7AF632211878BC00F730B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6F7AF635211878BC00F730B2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 6F7AF637211878BC00F730B2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6F7AF638211878BC00F730B2 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 6F7AF6ED21187CFE00F730B2 /* ADJConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJConfig.h; sourceTree = ""; }; + 6F7AF6EE21187CFE00F730B2 /* ADJDeviceInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJDeviceInfo.m; sourceTree = ""; }; + 6F7AF6EF21187CFE00F730B2 /* ADJTimerOnce.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerOnce.m; sourceTree = ""; }; + 6F7AF6F021187CFE00F730B2 /* ADJAttributionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttributionHandler.m; sourceTree = ""; }; + 6F7AF6F121187CFE00F730B2 /* Adjust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Adjust.h; sourceTree = ""; }; + 6F7AF6F221187CFE00F730B2 /* ADJActivityPackage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityPackage.h; sourceTree = ""; }; + 6F7AF6F321187CFE00F730B2 /* ADJRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJRequestHandler.m; sourceTree = ""; }; + 6F7AF6F421187CFE00F730B2 /* ADJSystemProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSystemProfile.h; sourceTree = ""; }; + 6F7AF6F521187CFE00F730B2 /* ADJAttribution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttribution.h; sourceTree = ""; }; + 6F7AF6F621187CFE00F730B2 /* ADJKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJKeychain.m; sourceTree = ""; }; + 6F7AF6F721187CFE00F730B2 /* ADJSdkClickHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSdkClickHandler.m; sourceTree = ""; }; + 6F7AF6F821187CFE00F730B2 /* ADJActivityKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityKind.h; sourceTree = ""; }; + 6F7AF6F921187CFE00F730B2 /* ADJEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEvent.m; sourceTree = ""; }; + 6F7AF6FA21187CFE00F730B2 /* ADJPackageHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageHandler.h; sourceTree = ""; }; + 6F7AF6FB21187CFE00F730B2 /* ADJPackageBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageBuilder.h; sourceTree = ""; }; + 6F7AF6FC21187CFE00F730B2 /* ADJResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJResponseData.h; sourceTree = ""; }; + 6F7AF6FD21187CFE00F730B2 /* ADJSessionSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionSuccess.m; sourceTree = ""; }; + 6F7AF6FE21187CFE00F730B2 /* ADJEventFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventFailure.m; sourceTree = ""; }; + 6F7AF6FF21187CFE00F730B2 /* ADJAdjustFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAdjustFactory.h; sourceTree = ""; }; + 6F7AF70021187CFE00F730B2 /* ADJEventSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventSuccess.m; sourceTree = ""; }; + 6F7AF70121187CFE00F730B2 /* ADJActivityState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityState.m; sourceTree = ""; }; + 6F7AF70221187CFE00F730B2 /* ADJSessionFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionFailure.m; sourceTree = ""; }; + 6F7AF70321187CFE00F730B2 /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; + 6F7AF70421187CFE00F730B2 /* ADJReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; + 6F7AF70521187CFE00F730B2 /* ADJActivityHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityHandler.h; sourceTree = ""; }; + 6F7AF70621187CFE00F730B2 /* ADJTimerCycle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerCycle.m; sourceTree = ""; }; + 6F7AF70721187CFE00F730B2 /* ADJSessionParameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionParameters.m; sourceTree = ""; }; + 6F7AF70821187CFE00F730B2 /* ADJLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJLogger.m; sourceTree = ""; }; + 6F7AF70921187CFE00F730B2 /* ADJBackoffStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJBackoffStrategy.m; sourceTree = ""; }; + 6F7AF70A21187CFE00F730B2 /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; + 6F7AF70B21187CFE00F730B2 /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; + 6F7AF70C21187CFE00F730B2 /* ADJAttributionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttributionHandler.h; sourceTree = ""; }; + 6F7AF70D21187CFE00F730B2 /* ADJTimerOnce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerOnce.h; sourceTree = ""; }; + 6F7AF70E21187CFE00F730B2 /* ADJDeviceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJDeviceInfo.h; sourceTree = ""; }; + 6F7AF70F21187CFE00F730B2 /* ADJConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJConfig.m; sourceTree = ""; }; + 6F7AF71021187CFE00F730B2 /* ADJPackageHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageHandler.m; sourceTree = ""; }; + 6F7AF71121187CFE00F730B2 /* ADJEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEvent.h; sourceTree = ""; }; + 6F7AF71221187CFE00F730B2 /* ADJSdkClickHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSdkClickHandler.h; sourceTree = ""; }; + 6F7AF71321187CFE00F730B2 /* ADJActivityKind.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityKind.m; sourceTree = ""; }; + 6F7AF71421187CFE00F730B2 /* ADJKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJKeychain.h; sourceTree = ""; }; + 6F7AF71621187CFE00F730B2 /* NSString+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+ADJAdditions.m"; sourceTree = ""; }; + 6F7AF71721187CFE00F730B2 /* UIDevice+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+ADJAdditions.h"; sourceTree = ""; }; + 6F7AF71821187CFE00F730B2 /* NSData+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ADJAdditions.m"; sourceTree = ""; }; + 6F7AF71921187CFE00F730B2 /* NSData+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ADJAdditions.h"; sourceTree = ""; }; + 6F7AF71A21187CFE00F730B2 /* UIDevice+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+ADJAdditions.m"; sourceTree = ""; }; + 6F7AF71B21187CFE00F730B2 /* NSString+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+ADJAdditions.h"; sourceTree = ""; }; + 6F7AF71C21187CFE00F730B2 /* ADJAttribution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttribution.m; sourceTree = ""; }; + 6F7AF71D21187CFE00F730B2 /* ADJSystemProfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSystemProfile.m; sourceTree = ""; }; + 6F7AF71E21187CFE00F730B2 /* ADJRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJRequestHandler.h; sourceTree = ""; }; + 6F7AF71F21187CFE00F730B2 /* ADJActivityPackage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityPackage.m; sourceTree = ""; }; + 6F7AF72021187CFE00F730B2 /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; + 6F7AF72121187CFE00F730B2 /* ADJSessionFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionFailure.h; sourceTree = ""; }; + 6F7AF72221187CFE00F730B2 /* ADJActivityState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityState.h; sourceTree = ""; }; + 6F7AF72321187CFE00F730B2 /* ADJAdjustFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAdjustFactory.m; sourceTree = ""; }; + 6F7AF72421187CFE00F730B2 /* ADJEventSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventSuccess.h; sourceTree = ""; }; + 6F7AF72521187CFE00F730B2 /* ADJEventFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventFailure.h; sourceTree = ""; }; + 6F7AF72621187CFE00F730B2 /* ADJResponseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJResponseData.m; sourceTree = ""; }; + 6F7AF72721187CFE00F730B2 /* ADJSessionSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionSuccess.h; sourceTree = ""; }; + 6F7AF72821187CFE00F730B2 /* ADJPackageBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageBuilder.m; sourceTree = ""; }; + 6F7AF72921187CFE00F730B2 /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; + 6F7AF72A21187CFE00F730B2 /* ADJBackoffStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJBackoffStrategy.h; sourceTree = ""; }; + 6F7AF72B21187CFE00F730B2 /* ADJLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJLogger.h; sourceTree = ""; }; + 6F7AF72C21187CFF00F730B2 /* ADJSessionParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionParameters.h; sourceTree = ""; }; + 6F7AF72E21187CFF00F730B2 /* ADJTimerCycle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerCycle.h; sourceTree = ""; }; + 6F7AF72F21187CFF00F730B2 /* ADJActivityHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityHandler.m; sourceTree = ""; }; + 6F7AF73021187CFF00F730B2 /* ADJReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; + 6F7AF75421187D0500F730B2 /* AdjustBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge.m; sourceTree = ""; }; + 6F7AF75521187D0500F730B2 /* AdjustBridgeRegister.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridgeRegister.h; sourceTree = ""; }; + 6F7AF75721187D0500F730B2 /* WebViewJavascriptBridgeBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridgeBase.m; sourceTree = ""; }; + 6F7AF75921187D0500F730B2 /* WKWebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKWebViewJavascriptBridge.m; sourceTree = ""; }; + 6F7AF75A21187D0500F730B2 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = ""; }; + 6F7AF75B21187D0500F730B2 /* WebViewJavascriptBridge_JS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge_JS.h; sourceTree = ""; }; + 6F7AF75C21187D0500F730B2 /* WebViewJavascriptBridgeBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridgeBase.h; sourceTree = ""; }; + 6F7AF75E21187D0500F730B2 /* WebViewJavascriptBridge_JS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge_JS.m; sourceTree = ""; }; + 6F7AF75F21187D0500F730B2 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = ""; }; + 6F7AF76021187D0500F730B2 /* WKWebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebViewJavascriptBridge.h; sourceTree = ""; }; + 6F7AF76121187D0500F730B2 /* AdjustBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridge.h; sourceTree = ""; }; + 6F7AF76221187D0500F730B2 /* AdjustBridgeRegister.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridgeRegister.m; sourceTree = ""; }; + 6F7AF76B21187D1C00F730B2 /* ATLTestInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLTestInfo.m; sourceTree = ""; }; + 6F7AF76C21187D1C00F730B2 /* ATLUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATLUtil.h; sourceTree = ""; }; + 6F7AF76D21187D1C00F730B2 /* ATLControlChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATLControlChannel.h; sourceTree = ""; }; + 6F7AF76E21187D1C00F730B2 /* ATLConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATLConstants.h; sourceTree = ""; }; + 6F7AF76F21187D1C00F730B2 /* ATLTestLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATLTestLibrary.h; sourceTree = ""; }; + 6F7AF77021187D1C00F730B2 /* ATLUtilNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATLUtilNetworking.h; sourceTree = ""; }; + 6F7AF77121187D1C00F730B2 /* ATLBlockingQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATLBlockingQueue.h; sourceTree = ""; }; + 6F7AF77221187D1C00F730B2 /* ATLUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLUtil.m; sourceTree = ""; }; + 6F7AF77321187D1C00F730B2 /* ATLTestInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATLTestInfo.h; sourceTree = ""; }; + 6F7AF77421187D1C00F730B2 /* ATLControlChannel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLControlChannel.m; sourceTree = ""; }; + 6F7AF77521187D1C00F730B2 /* ATLUtilNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLUtilNetworking.m; sourceTree = ""; }; + 6F7AF77621187D1C00F730B2 /* ATLTestLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLTestLibrary.m; sourceTree = ""; }; + 6F7AF77721187D1C00F730B2 /* ATLBlockingQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLBlockingQueue.m; sourceTree = ""; }; + 6F7AF78621187EA400F730B2 /* UIWebViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIWebViewController.h; sourceTree = ""; }; + 6F7AF78721187EA400F730B2 /* UIWebViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIWebViewController.m; sourceTree = ""; }; + 6F7AF78921187EC500F730B2 /* WKWebViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKWebViewController.h; sourceTree = ""; }; + 6F7AF78A21187EC500F730B2 /* WKWebViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKWebViewController.m; sourceTree = ""; }; + 6F7AF78C2118808300F730B2 /* AdjustTestApp-WebView.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "AdjustTestApp-WebView.html"; sourceTree = ""; }; + 6F7AF78E211888B500F730B2 /* TestLibraryBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestLibraryBridge.h; sourceTree = ""; }; + 6F7AF78F211888B500F730B2 /* TestLibraryBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestLibraryBridge.m; sourceTree = ""; }; + 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = TestLibraryBridge.js; sourceTree = ""; }; + 6F7AF7BA2118992200F730B2 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 6FD0412B211C71D1008D42D0 /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; }; + 6FD0412D211C71D9008D42D0 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; + 6FD0412F211C71E8008D42D0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 6FD04131211C71EE008D42D0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6F7AF623211878B900F730B2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6FD04132211C71EF008D42D0 /* UIKit.framework in Frameworks */, + 6FD04130211C71E8008D42D0 /* Foundation.framework in Frameworks */, + 6FD0412E211C71D9008D42D0 /* AdSupport.framework in Frameworks */, + 6FD0412C211C71D1008D42D0 /* iAd.framework in Frameworks */, + 6F7AF7BB2118992200F730B2 /* WebKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6F7AF61D211878B900F730B2 = { + isa = PBXGroup; + children = ( + 6F7AF628211878B900F730B2 /* AdjustWebBridgeTestApp */, + 6F7AF627211878B900F730B2 /* Products */, + 6F7AF7B92118992200F730B2 /* Frameworks */, + ); + sourceTree = ""; + }; + 6F7AF627211878B900F730B2 /* Products */ = { + isa = PBXGroup; + children = ( + 6F7AF626211878B900F730B2 /* AdjustWebBridgeTestApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 6F7AF628211878B900F730B2 /* AdjustWebBridgeTestApp */ = { + isa = PBXGroup; + children = ( + 6F7AF629211878BA00F730B2 /* AppDelegate.h */, + 6F7AF62A211878BA00F730B2 /* AppDelegate.m */, + 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */, + 6F7AF78E211888B500F730B2 /* TestLibraryBridge.h */, + 6F7AF78F211888B500F730B2 /* TestLibraryBridge.m */, + 6F7AF78621187EA400F730B2 /* UIWebViewController.h */, + 6F7AF78721187EA400F730B2 /* UIWebViewController.m */, + 6F7AF78921187EC500F730B2 /* WKWebViewController.h */, + 6F7AF78A21187EC500F730B2 /* WKWebViewController.m */, + 6F7AF78C2118808300F730B2 /* AdjustTestApp-WebView.html */, + 6F7AF638211878BC00F730B2 /* main.m */, + 6F7AF637211878BC00F730B2 /* Info.plist */, + 6F7AF632211878BC00F730B2 /* Assets.xcassets */, + 6F7AF62F211878BA00F730B2 /* Main.storyboard */, + 6F7AF634211878BC00F730B2 /* LaunchScreen.storyboard */, + 6F7AF6EC21187CFE00F730B2 /* Adjust */, + 6F7AF75321187D0500F730B2 /* AdjustBridge */, + 6F7AF76A21187D1C00F730B2 /* AdjustTestLibrary */, + ); + path = AdjustWebBridgeTestApp; + sourceTree = ""; + }; + 6F7AF6EC21187CFE00F730B2 /* Adjust */ = { + isa = PBXGroup; + children = ( + 6F7AF6ED21187CFE00F730B2 /* ADJConfig.h */, + 6F7AF6EE21187CFE00F730B2 /* ADJDeviceInfo.m */, + 6F7AF6EF21187CFE00F730B2 /* ADJTimerOnce.m */, + 6F7AF6F021187CFE00F730B2 /* ADJAttributionHandler.m */, + 6F7AF6F121187CFE00F730B2 /* Adjust.h */, + 6F7AF6F221187CFE00F730B2 /* ADJActivityPackage.h */, + 6F7AF6F321187CFE00F730B2 /* ADJRequestHandler.m */, + 6F7AF6F421187CFE00F730B2 /* ADJSystemProfile.h */, + 6F7AF6F521187CFE00F730B2 /* ADJAttribution.h */, + 6F7AF6F621187CFE00F730B2 /* ADJKeychain.m */, + 6F7AF6F721187CFE00F730B2 /* ADJSdkClickHandler.m */, + 6F7AF6F821187CFE00F730B2 /* ADJActivityKind.h */, + 6F7AF6F921187CFE00F730B2 /* ADJEvent.m */, + 6F7AF6FA21187CFE00F730B2 /* ADJPackageHandler.h */, + 6F7AF6FB21187CFE00F730B2 /* ADJPackageBuilder.h */, + 6F7AF6FC21187CFE00F730B2 /* ADJResponseData.h */, + 6F7AF6FD21187CFE00F730B2 /* ADJSessionSuccess.m */, + 6F7AF6FE21187CFE00F730B2 /* ADJEventFailure.m */, + 6F7AF6FF21187CFE00F730B2 /* ADJAdjustFactory.h */, + 6F7AF70021187CFE00F730B2 /* ADJEventSuccess.m */, + 6F7AF70121187CFE00F730B2 /* ADJActivityState.m */, + 6F7AF70221187CFE00F730B2 /* ADJSessionFailure.m */, + 6F7AF70321187CFE00F730B2 /* ADJUtil.h */, + 6F7AF70421187CFE00F730B2 /* ADJReachability.h */, + 6F7AF70521187CFE00F730B2 /* ADJActivityHandler.h */, + 6F7AF70621187CFE00F730B2 /* ADJTimerCycle.m */, + 6F7AF70721187CFE00F730B2 /* ADJSessionParameters.m */, + 6F7AF70821187CFE00F730B2 /* ADJLogger.m */, + 6F7AF70921187CFE00F730B2 /* ADJBackoffStrategy.m */, + 6F7AF70A21187CFE00F730B2 /* ADJUserDefaults.h */, + 6F7AF70B21187CFE00F730B2 /* Adjust.m */, + 6F7AF70C21187CFE00F730B2 /* ADJAttributionHandler.h */, + 6F7AF70D21187CFE00F730B2 /* ADJTimerOnce.h */, + 6F7AF70E21187CFE00F730B2 /* ADJDeviceInfo.h */, + 6F7AF70F21187CFE00F730B2 /* ADJConfig.m */, + 6F7AF71021187CFE00F730B2 /* ADJPackageHandler.m */, + 6F7AF71121187CFE00F730B2 /* ADJEvent.h */, + 6F7AF71221187CFE00F730B2 /* ADJSdkClickHandler.h */, + 6F7AF71321187CFE00F730B2 /* ADJActivityKind.m */, + 6F7AF71421187CFE00F730B2 /* ADJKeychain.h */, + 6F7AF71521187CFE00F730B2 /* ADJAdditions */, + 6F7AF71C21187CFE00F730B2 /* ADJAttribution.m */, + 6F7AF71D21187CFE00F730B2 /* ADJSystemProfile.m */, + 6F7AF71E21187CFE00F730B2 /* ADJRequestHandler.h */, + 6F7AF71F21187CFE00F730B2 /* ADJActivityPackage.m */, + 6F7AF72021187CFE00F730B2 /* ADJUtil.m */, + 6F7AF72121187CFE00F730B2 /* ADJSessionFailure.h */, + 6F7AF72221187CFE00F730B2 /* ADJActivityState.h */, + 6F7AF72321187CFE00F730B2 /* ADJAdjustFactory.m */, + 6F7AF72421187CFE00F730B2 /* ADJEventSuccess.h */, + 6F7AF72521187CFE00F730B2 /* ADJEventFailure.h */, + 6F7AF72621187CFE00F730B2 /* ADJResponseData.m */, + 6F7AF72721187CFE00F730B2 /* ADJSessionSuccess.h */, + 6F7AF72821187CFE00F730B2 /* ADJPackageBuilder.m */, + 6F7AF72921187CFE00F730B2 /* ADJUserDefaults.m */, + 6F7AF72A21187CFE00F730B2 /* ADJBackoffStrategy.h */, + 6F7AF72B21187CFE00F730B2 /* ADJLogger.h */, + 6F7AF72C21187CFF00F730B2 /* ADJSessionParameters.h */, + 6F7AF72E21187CFF00F730B2 /* ADJTimerCycle.h */, + 6F7AF72F21187CFF00F730B2 /* ADJActivityHandler.m */, + 6F7AF73021187CFF00F730B2 /* ADJReachability.m */, + ); + name = Adjust; + path = ../../../Adjust; + sourceTree = ""; + }; + 6F7AF71521187CFE00F730B2 /* ADJAdditions */ = { + isa = PBXGroup; + children = ( + 6F7AF71621187CFE00F730B2 /* NSString+ADJAdditions.m */, + 6F7AF71721187CFE00F730B2 /* UIDevice+ADJAdditions.h */, + 6F7AF71821187CFE00F730B2 /* NSData+ADJAdditions.m */, + 6F7AF71921187CFE00F730B2 /* NSData+ADJAdditions.h */, + 6F7AF71A21187CFE00F730B2 /* UIDevice+ADJAdditions.m */, + 6F7AF71B21187CFE00F730B2 /* NSString+ADJAdditions.h */, + ); + path = ADJAdditions; + sourceTree = ""; + }; + 6F7AF75321187D0500F730B2 /* AdjustBridge */ = { + isa = PBXGroup; + children = ( + 6F7AF76121187D0500F730B2 /* AdjustBridge.h */, + 6F7AF75421187D0500F730B2 /* AdjustBridge.m */, + 6F7AF75521187D0500F730B2 /* AdjustBridgeRegister.h */, + 6F7AF76221187D0500F730B2 /* AdjustBridgeRegister.m */, + 6F7AF75621187D0500F730B2 /* WebViewJavascriptBridge */, + ); + name = AdjustBridge; + path = ../../../AdjustBridge; + sourceTree = ""; + }; + 6F7AF75621187D0500F730B2 /* WebViewJavascriptBridge */ = { + isa = PBXGroup; + children = ( + 6F7AF75721187D0500F730B2 /* WebViewJavascriptBridgeBase.m */, + 6F7AF75921187D0500F730B2 /* WKWebViewJavascriptBridge.m */, + 6F7AF75A21187D0500F730B2 /* WebViewJavascriptBridge.m */, + 6F7AF75B21187D0500F730B2 /* WebViewJavascriptBridge_JS.h */, + 6F7AF75C21187D0500F730B2 /* WebViewJavascriptBridgeBase.h */, + 6F7AF75E21187D0500F730B2 /* WebViewJavascriptBridge_JS.m */, + 6F7AF75F21187D0500F730B2 /* WebViewJavascriptBridge.h */, + 6F7AF76021187D0500F730B2 /* WKWebViewJavascriptBridge.h */, + ); + path = WebViewJavascriptBridge; + sourceTree = ""; + }; + 6F7AF76A21187D1C00F730B2 /* AdjustTestLibrary */ = { + isa = PBXGroup; + children = ( + 6F7AF76B21187D1C00F730B2 /* ATLTestInfo.m */, + 6F7AF76C21187D1C00F730B2 /* ATLUtil.h */, + 6F7AF76D21187D1C00F730B2 /* ATLControlChannel.h */, + 6F7AF76E21187D1C00F730B2 /* ATLConstants.h */, + 6F7AF76F21187D1C00F730B2 /* ATLTestLibrary.h */, + 6F7AF77021187D1C00F730B2 /* ATLUtilNetworking.h */, + 6F7AF77121187D1C00F730B2 /* ATLBlockingQueue.h */, + 6F7AF77221187D1C00F730B2 /* ATLUtil.m */, + 6F7AF77321187D1C00F730B2 /* ATLTestInfo.h */, + 6F7AF77421187D1C00F730B2 /* ATLControlChannel.m */, + 6F7AF77521187D1C00F730B2 /* ATLUtilNetworking.m */, + 6F7AF77621187D1C00F730B2 /* ATLTestLibrary.m */, + 6F7AF77721187D1C00F730B2 /* ATLBlockingQueue.m */, + ); + name = AdjustTestLibrary; + path = ../../AdjustTestLibrary/AdjustTestLibrary; + sourceTree = ""; + }; + 6F7AF7B92118992200F730B2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6FD04131211C71EE008D42D0 /* UIKit.framework */, + 6FD0412F211C71E8008D42D0 /* Foundation.framework */, + 6FD0412D211C71D9008D42D0 /* AdSupport.framework */, + 6FD0412B211C71D1008D42D0 /* iAd.framework */, + 6F7AF7BA2118992200F730B2 /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6F7AF625211878B900F730B2 /* AdjustWebBridgeTestApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6F7AF63C211878BC00F730B2 /* Build configuration list for PBXNativeTarget "AdjustWebBridgeTestApp" */; + buildPhases = ( + 6F7AF622211878B900F730B2 /* Sources */, + 6F7AF623211878B900F730B2 /* Frameworks */, + 6F7AF624211878B900F730B2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AdjustWebBridgeTestApp; + productName = AdjustWebBridgeTestApp; + productReference = 6F7AF626211878B900F730B2 /* AdjustWebBridgeTestApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 6F7AF61E211878B900F730B2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = adjust; + TargetAttributes = { + 6F7AF625211878B900F730B2 = { + CreatedOnToolsVersion = 10.0; + }; + }; + }; + buildConfigurationList = 6F7AF621211878B900F730B2 /* Build configuration list for PBXProject "AdjustWebBridgeTestApp" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 6F7AF61D211878B900F730B2; + productRefGroup = 6F7AF627211878B900F730B2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6F7AF625211878B900F730B2 /* AdjustWebBridgeTestApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6F7AF624211878B900F730B2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F7AF78D2118808400F730B2 /* AdjustTestApp-WebView.html in Resources */, + 6F7AF636211878BC00F730B2 /* LaunchScreen.storyboard in Resources */, + 6F7AF7B02118949C00F730B2 /* TestLibraryBridge.js in Resources */, + 6F7AF633211878BC00F730B2 /* Assets.xcassets in Resources */, + 6F7AF631211878BA00F730B2 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6F7AF622211878B900F730B2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F7AF73621187CFF00F730B2 /* ADJSdkClickHandler.m in Sources */, + 6F7AF74C21187CFF00F730B2 /* ADJAdjustFactory.m in Sources */, + 6F7AF74721187CFF00F730B2 /* UIDevice+ADJAdditions.m in Sources */, + 6F7AF790211888B500F730B2 /* TestLibraryBridge.m in Sources */, + 6F7AF74D21187CFF00F730B2 /* ADJResponseData.m in Sources */, + 6F7AF77D21187D1C00F730B2 /* ATLBlockingQueue.m in Sources */, + 6F7AF73221187CFF00F730B2 /* ADJTimerOnce.m in Sources */, + 6F7AF74521187CFF00F730B2 /* NSString+ADJAdditions.m in Sources */, + 6F7AF73821187CFF00F730B2 /* ADJSessionSuccess.m in Sources */, + 6F7AF74E21187CFF00F730B2 /* ADJPackageBuilder.m in Sources */, + 6F7AF77921187D1C00F730B2 /* ATLUtil.m in Sources */, + 6F7AF74021187CFF00F730B2 /* ADJBackoffStrategy.m in Sources */, + 6F7AF73421187CFF00F730B2 /* ADJRequestHandler.m in Sources */, + 6F7AF78821187EA400F730B2 /* UIWebViewController.m in Sources */, + 6F7AF73721187CFF00F730B2 /* ADJEvent.m in Sources */, + 6F7AF74621187CFF00F730B2 /* NSData+ADJAdditions.m in Sources */, + 6F7AF74321187CFF00F730B2 /* ADJPackageHandler.m in Sources */, + 6F7AF73A21187CFF00F730B2 /* ADJEventSuccess.m in Sources */, + 6F7AF74A21187CFF00F730B2 /* ADJActivityPackage.m in Sources */, + 6F7AF75221187CFF00F730B2 /* ADJReachability.m in Sources */, + 6F7AF74421187CFF00F730B2 /* ADJActivityKind.m in Sources */, + 6F7AF73521187CFF00F730B2 /* ADJKeychain.m in Sources */, + 6F7AF74921187CFF00F730B2 /* ADJSystemProfile.m in Sources */, + 6F7AF73B21187CFF00F730B2 /* ADJActivityState.m in Sources */, + 6F7AF76621187D0500F730B2 /* WKWebViewJavascriptBridge.m in Sources */, + 6F7AF73F21187CFF00F730B2 /* ADJLogger.m in Sources */, + 6F7AF78B21187EC500F730B2 /* WKWebViewController.m in Sources */, + 6F7AF73121187CFF00F730B2 /* ADJDeviceInfo.m in Sources */, + 6F7AF73D21187CFF00F730B2 /* ADJTimerCycle.m in Sources */, + 6F7AF639211878BC00F730B2 /* main.m in Sources */, + 6F7AF74121187CFF00F730B2 /* Adjust.m in Sources */, + 6F7AF74821187CFF00F730B2 /* ADJAttribution.m in Sources */, + 6F7AF73C21187CFF00F730B2 /* ADJSessionFailure.m in Sources */, + 6F7AF77821187D1C00F730B2 /* ATLTestInfo.m in Sources */, + 6F7AF74221187CFF00F730B2 /* ADJConfig.m in Sources */, + 6F7AF74F21187CFF00F730B2 /* ADJUserDefaults.m in Sources */, + 6F7AF77C21187D1C00F730B2 /* ATLTestLibrary.m in Sources */, + 6F7AF77A21187D1C00F730B2 /* ATLControlChannel.m in Sources */, + 6F7AF77B21187D1C00F730B2 /* ATLUtilNetworking.m in Sources */, + 6F7AF76921187D0500F730B2 /* AdjustBridgeRegister.m in Sources */, + 6F7AF74B21187CFF00F730B2 /* ADJUtil.m in Sources */, + 6F7AF73921187CFF00F730B2 /* ADJEventFailure.m in Sources */, + 6F7AF76721187D0500F730B2 /* WebViewJavascriptBridge.m in Sources */, + 6F7AF73321187CFF00F730B2 /* ADJAttributionHandler.m in Sources */, + 6F7AF62B211878BA00F730B2 /* AppDelegate.m in Sources */, + 6F7AF75121187CFF00F730B2 /* ADJActivityHandler.m in Sources */, + 6F7AF76821187D0500F730B2 /* WebViewJavascriptBridge_JS.m in Sources */, + 6F7AF73E21187CFF00F730B2 /* ADJSessionParameters.m in Sources */, + 6F7AF76421187D0500F730B2 /* WebViewJavascriptBridgeBase.m in Sources */, + 6F7AF76321187D0500F730B2 /* AdjustBridge.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 6F7AF62F211878BA00F730B2 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6F7AF630211878BA00F730B2 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 6F7AF634211878BC00F730B2 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6F7AF635211878BC00F730B2 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 6F7AF63A211878BC00F730B2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 6F7AF63B211878BC00F730B2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 6F7AF63D211878BC00F730B2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QGUGW9AUMK; + INFOPLIST_FILE = AdjustWebBridgeTestApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.AdjustWebBridgeTestApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 6F7AF63E211878BC00F730B2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QGUGW9AUMK; + INFOPLIST_FILE = AdjustWebBridgeTestApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.AdjustWebBridgeTestApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 6F7AF621211878B900F730B2 /* Build configuration list for PBXProject "AdjustWebBridgeTestApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6F7AF63A211878BC00F730B2 /* Debug */, + 6F7AF63B211878BC00F730B2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6F7AF63C211878BC00F730B2 /* Build configuration list for PBXNativeTarget "AdjustWebBridgeTestApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6F7AF63D211878BC00F730B2 /* Debug */, + 6F7AF63E211878BC00F730B2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 6F7AF61E211878B900F730B2 /* Project object */; +} diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html new file mode 100644 index 000000000..aa20f4281 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html @@ -0,0 +1,55 @@ + + + + + +

Adjust TestApp

+ + + +
+
+ +
+
+
+ diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h new file mode 100644 index 000000000..dd10666d2 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h @@ -0,0 +1,15 @@ +// +// AppDelegate.h +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m new file mode 100644 index 000000000..5178c6100 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m @@ -0,0 +1,60 @@ +// +// AppDelegate.m +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import "AppDelegate.h" +#import "UIWebViewController.h" +#import "WKWebViewController.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // 1. Create the UIWebView example + UIWebViewController *uiWebViewExampleController = [[UIWebViewController alloc] init]; + uiWebViewExampleController.tabBarItem.title = @"UIWebView"; + + // 2. Create the tab footer and add the UIWebView example + UITabBarController *tabBarController = [[UITabBarController alloc] init]; + [tabBarController addChildViewController:uiWebViewExampleController]; + + // 3. Create the WKWebView example for devices >= iOS 8 + if ([WKWebView class]) { + WKWebViewController *wkWebViewExampleController = [[WKWebViewController alloc] init]; + wkWebViewExampleController.tabBarItem.title = @"WKWebView"; + [tabBarController addChildViewController:wkWebViewExampleController]; + } + + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + self.window.rootViewController = tabBarController; + [self.window makeKeyAndVisible]; + + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d8db8d65f --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/Contents.json b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/LaunchScreen.storyboard b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..bfa361294 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/Main.storyboard b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/Main.storyboard new file mode 100644 index 000000000..942f0bc45 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Info.plist b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Info.plist new file mode 100644 index 000000000..16be3b681 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h new file mode 100644 index 000000000..b3cc5bd0e --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h @@ -0,0 +1,20 @@ +// +// TestLibraryBridge.h +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import +#import "ATLTestLibrary.h" +#import "AdjustBridgeRegister.h" + +static NSString * baseUrl = @"http://127.0.0.1:8080"; +static NSString * gdprUrl = @"http://127.0.0.1:8080"; + +@interface TestLibraryBridge : NSObject + +- (id)initWithAdjustBridgeRegister:(AdjustBridgeRegister *)adjustBridgeRegister; + +@end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js new file mode 100644 index 000000000..9be43d3b6 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -0,0 +1,532 @@ +var localBaseUrl = 'http://127.0.0.1:8080'; +var localGdprUrl = 'http://127.0.0.1:8080'; + +// local reference of the command executor +// originally it was this.adjustCommandExecutor of TestLibraryBridge var +// but for some reason, "this" on "startTestSession" was different in "adjustCommandExecutor" +var localAdjustCommandExecutor; + +var TestLibraryBridge = { + adjustCommandExecutor: function(commandRawJson) { + console.log('TestLibraryBridge adjustCommandExecutor'); + const command = JSON.parse(commandRawJson); + console.log('className: ' + command.className); + console.log('functionName: ' + command.functionName); + console.log('params: ' + JSON.stringify(command.params)); + + // reflection based technique to call functions with the same name as the command function + localAdjustCommandExecutor[command.functionName](command.params); + }, + startTestSession: function () { + console.log('TestLibraryBridge startTestSession'); + if (WebViewJavascriptBridge) { + console.log('TestLibraryBridge startTestSession callHandler'); + localAdjustCommandExecutor = new AdjustCommandExecutor(localBaseUrl, localGdprUrl); + // register objc->JS function for commands + WebViewJavascriptBridge.registerHandler('adjustJS_commandExecutor', TestLibraryBridge.adjustCommandExecutor); + // start test session in obj-c + WebViewJavascriptBridge.callHandler('adjustTLB_startTestSession', null, null); + } + } +}; + +var AdjustCommandExecutor = function(baseUrl, gdprUrl) { + this.baseUrl = baseUrl; + this.gdprUrl = gdprUrl; + this.basePath = null; + this.gdprPath = null; + this.savedEvents = {}; + this.savedConfigs = {}; + this.savedCommands = []; + this.nextToSendCounter = 0; +}; + +AdjustCommandExecutor.prototype.testOptions = function(params) { + console.log('TestLibraryBridge testOptions'); + console.log('params: ' + JSON.stringify(params)); + + var TestOptions = function() { + this.baseUrl = null; + this.gdprUrl = null; + this.basePath = null; + this.gdprPath = null; + this.timerIntervalInMilliseconds = null; + this.timerStartInMilliseconds = null; + this.sessionIntervalInMilliseconds = null; + this.subsessionIntervalInMilliseconds = null; + this.teardown = null; + this.deleteState = null; + this.noBackoffWait = null; + this.iAdFrameworkEnabled = null; + }; + + var testOptions = new TestOptions(); + testOptions.baseUrl = this.baseUrl; + testOptions.gdprUrl = this.gdprUrl; + + if ('basePath' in params) { + var basePath = getFirstValue(params, 'basePath'); + console.log('TestLibraryBridge hasOwnProperty basePath, first: ' + basePath); + this.basePath = basePath; + this.gdprPath = basePath; + } + if ('timerInterval' in params) { + testOptions.timerIntervalInMilliseconds = getFirstValue(params, 'timerInterval'); + } + if ('timerStart' in params) { + testOptions.timerStartInMilliseconds = getFirstValue(params, 'timerStart'); + } + if ('sessionInterval' in params) { + testOptions.sessionIntervalInMilliseconds = getFirstValue(params, 'sessionInterval'); + } + if ('subsessionInterval' in params) { + testOptions.subsessionIntervalInMilliseconds = getFirstValue(params, 'subsessionInterval'); + } + if ('noBackoffWait' in params) { + testOptions.noBackoffWait = getFirstValue(params, 'noBackoffWait'); + } + // iAd will not be used in test app by default + testOptions.iAdFrameworkEnabled = false; + if ('iAdFrameworkEnabled' in params) { + testOptions.iAdFrameworkEnabled = getFirstValue(params, 'iAdFrameworkEnabled'); + } + if ('teardown' in params) { + console.log('TestLibraryBridge hasOwnProperty teardown: ' + params['teardown']); + + var teardownOptions = params['teardown']; + var teardownOptionsLength = teardownOptions.length; + + for (var i = 0; i < teardownOptionsLength; i++) { + let teardownOption = teardownOptions[i]; + console.log('TestLibraryBridge teardown option nr ' + i + ' with value: ' + teardownOption); + switch(teardownOption) { + case 'resetSdk': + testOptions.teardown = true; + testOptions.basePath = this.basePath; + testOptions.gdprPath = this.gdprPath; + break; + case 'deleteState': + testOptions.deleteState = true; + break; + case 'resetTest': + // TODO: reset configs + // TODO: reset events + testOptions.timerIntervalInMilliseconds = -1; + testOptions.timerStartInMilliseconds = -1; + testOptions.sessionIntervalInMilliseconds = -1; + testOptions.subsessionIntervalInMilliseconds = -1; + break; + case 'sdk': + testOptions.teardown = true; + testOptions.basePath = null; + testOptions.gdprPath = null; + break; + case 'test': + // TODO: null configs + // TODO: null events + // TODO: null delegate + this.basePath = null; + this.gdprPath = null; + testOptions.timerIntervalInMilliseconds = -1; + testOptions.timerStartInMilliseconds = -1; + testOptions.sessionIntervalInMilliseconds = -1; + testOptions.subsessionIntervalInMilliseconds = -1; + break; + } + } + } + Adjust.setTestOptions(testOptions); +}; + +AdjustCommandExecutor.prototype.config = function(params) { + var configNumber = 0; + if ('configName' in params) { + var configName = getFirstValue(params, 'configName'); + configNumber = parseInt(configName.substr(configName.length - 1)); + } + + var adjustConfig; + if (configNumber in this.savedConfigs) { + adjustConfig = this.savedConfigs[configNumber]; + } else { + var environment = getFirstValue(params, 'environment'); + var appToken = getFirstValue(params, 'appToken'); + + adjustConfig = new AdjustConfig(appToken, environment); + adjustConfig.setLogLevel(AdjustConfig.LogLevelVerbose); + + this.savedConfigs[configNumber] = adjustConfig; + } + + if ('logLevel' in params) { + var logLevelS = getFirstValue(params, 'logLevel'); + var logLevel = null; + switch (logLevelS) { + case "verbose": + logLevel = AdjustConfig.LogLevelVerbose; + break; + case "debug": + logLevel = AdjustConfig.LogLevelDebug; + break; + case "info": + logLevel = AdjustConfig.LogLevelInfo; + break; + case "warn": + logLevel = AdjustConfig.LogLevelWarn; + break; + case "error": + logLevel = AdjustConfig.LogLevelError; + break; + case "assert": + logLevel = AdjustConfig.LogLevelAssert; + break; + case "suppress": + logLevel = AdjustConfig.LogLevelSuppress; + break; + } + + adjustConfig.setLogLevel(logLevel); + } + + if ('sdkPrefix' in params) { + var sdkPrefix = getFirstValue(params, 'sdkPrefix'); + adjustConfig.setSdkPrefix(sdkPrefix); + } + + if ('defaultTracker' in params) { + var defaultTracker = getFirstValue(params, 'defaultTracker'); + adjustConfig.setDefaultTracker(defaultTracker); + } + + if ('appSecret' in params) { + var appSecretArray = getValues(params, 'appSecret'); + var secretId = appSecretArray[0].toString(); + var info1 = appSecretArray[1].toString(); + var info2 = appSecretArray[2].toString(); + var info3 = appSecretArray[3].toString(); + var info4 = appSecretArray[4].toString(); + adjustConfig.setAppSecret(secretId, info1, info2, info3, info4); + } + + if ('delayStart' in params) { + var delayStartS = getFirstValue(params, 'delayStart'); + var delayStart = parseFloat(delayStartS); + adjustConfig.setDelayStart(delayStart); + } + + if ('deviceKnown' in params) { + var deviceKnownS = getFirstValue(params, 'deviceKnown'); + var deviceKnown = deviceKnownS == 'true'; + adjustConfig.setIsDeviceKnown(deviceKnown); + } + + if ('eventBufferingEnabled' in params) { + var eventBufferingEnabledS = getFirstValue(params, 'eventBufferingEnabled'); + var eventBufferingEnabled = eventBufferingEnabledS == 'true'; + adjustConfig.setEventBufferingEnabled(eventBufferingEnabled); + } + + if ('sendInBackground' in params) { + var sendInBackgroundS = getFirstValue(params, 'sendInBackground'); + var sendInBackground = sendInBackgroundS == 'true'; + adjustConfig.setSendInBackground(sendInBackground); + } + + if ('userAgent' in params) { + var userAgent = getFirstValue(params, 'userAgent'); + adjustConfig.setUserAgent(userAgent); + } + + if ('attributionCallbackSendAll' in params) { + console.log('AdjustCommandExecutor.prototype.config attributionCallbackSendAll'); + var basePath = this.basePath; + adjustConfig.setAttributionCallback( + function(attribution) { + console.log('attributionCallback: ' + JSON.stringify(attribution)); + addInfoToSend('trackerToken', attribution.trackerToken); + addInfoToSend('trackerName', attribution.trackerName); + addInfoToSend('network', attribution.network); + addInfoToSend('campaign', attribution.campaign); + addInfoToSend('adgroup', attribution.adgroup); + addInfoToSend('creative', attribution.creative); + addInfoToSend('clickLabel', attribution.click_label); + addInfoToSend('adid', attribution.adid); + WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); + } + ); + } + + if ('sessionCallbackSendSuccess' in params) { + console.log('AdjustCommandExecutor.prototype.config sessionCallbackSendSuccess'); + var basePath = this.basePath; + adjustConfig.setSessionSuccessCallback( + function(sessionSuccessResponseData) { + console.log('sessionSuccessCallback: ' + JSON.stringify(sessionSuccessResponseData)); + addInfoToSend('message', sessionSuccessResponseData.message); + addInfoToSend('timestamp', sessionSuccessResponseData.timestamp); + addInfoToSend('adid', sessionSuccessResponseData.adid); + addInfoToSend('jsonResponse', sessionSuccessResponseData.jsonResponse); + WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); + } + ); + } + + if ('sessionCallbackSendFailure' in params) { + console.log('AdjustCommandExecutor.prototype.config sessionCallbackSendFailure'); + var basePath = this.basePath; + adjustConfig.setSessionFailureCallback( + function(sessionFailureResponseData) { + console.log('sessionFailureCallback: ' + JSON.stringify(sessionFailureResponseData)); + addInfoToSend('message', sessionFailureResponseData.message); + addInfoToSend('timestamp', sessionFailureResponseData.timestamp); + addInfoToSend('adid', sessionFailureResponseData.adid); + addInfoToSend('willRetry', sessionFailureResponseData.willRetry ? 'true' : 'false'); + addInfoToSend('jsonResponse', sessionFailureResponseData.jsonResponse); + WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); + } + ); + } + + if ('eventCallbackSendSuccess' in params) { + console.log('AdjustCommandExecutor.prototype.config eventCallbackSendSuccess'); + var basePath = this.basePath; + adjustConfig.setEventSuccessCallback( + function(eventSuccessResponseData) { + console.log('eventSuccessCallback: ' + JSON.stringify(eventSuccessResponseData)); + addInfoToSend('message', eventSuccessResponseData.message); + addInfoToSend('timestamp', eventSuccessResponseData.timestamp); + addInfoToSend('adid', eventSuccessResponseData.adid); + addInfoToSend('eventToken', eventSuccessResponseData.eventToken); + addInfoToSend('callbackId', eventSuccessResponseData.callbackId); + addInfoToSend('jsonResponse', eventSuccessResponseData.jsonResponse); + WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); + } + ); + } + + if ('eventCallbackSendFailure' in params) { + console.log('AdjustCommandExecutor.prototype.config eventCallbackSendFailure'); + var basePath = this.basePath; + adjustConfig.setEventFailureCallback( + function(eventFailureResponseData) { + console.log('eventFailureCallback: ' + JSON.stringify(eventFailureResponseData)); + addInfoToSend('message', eventFailureResponseData.message); + addInfoToSend('timestamp', eventFailureResponseData.timestamp); + addInfoToSend('adid', eventFailureResponseData.adid); + addInfoToSend('eventToken', eventFailureResponseData.eventToken); + addInfoToSend('callbackId', eventFailureResponseData.callbackId); + addInfoToSend('willRetry', eventFailureResponseData.willRetry ? 'true' : 'false'); + addInfoToSend('jsonResponse', eventFailureResponseData.jsonResponse); + WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); + } + ); + } + + if ('deferredDeeplinkCallback' in params) { + console.log('AdjustCommandExecutor.prototype.config deferredDeeplinkCallback'); + var shouldOpenDeeplinkS = getFirstValue(params, 'deferredDeeplinkCallback'); + if (shouldOpenDeeplinkS === 'true') { + adjustConfig.setOpenDeferredDeeplink(true); + } + if (shouldOpenDeeplinkS === 'false') { + adjustConfig.setOpenDeferredDeeplink(false); + } + var basePath = this.basePath; + adjustConfig.setDeferredDeeplinkCallback( + function(deeplink) { + console.log('deferredDeeplinkCallback: ' + JSON.stringify(deeplink)); + addInfoToSend('deeplink', deeplink); + WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); + } + ); + } +}; + +var addInfoToSend = function(key, value) { + WebViewJavascriptBridge.callHandler('adjustTLB_addInfoToSend', {key: key, value: value}, null); +}; + +AdjustCommandExecutor.prototype.start = function(params) { + this.config(params); + var configNumber = 0; + if ('configName' in params) { + var configName = getFirstValue(params, 'configName'); + configNumber = parseInt(configName.substr(configName.length - 1)); + } + + var adjustConfig = this.savedConfigs[configNumber]; + Adjust.appDidLaunch(adjustConfig); + + delete this.savedConfigs[0]; +}; + +AdjustCommandExecutor.prototype.event = function(params) { + var eventNumber = 0; + if ('eventName' in params) { + var eventName = getFirstValue(params, 'eventName'); + eventNumber = parseInt(eventName.substr(eventName.length - 1)) + } + + var adjustEvent; + if (eventNumber in this.savedEvents) { + adjustEvent = this.savedEvents[eventNumber]; + } else { + var eventToken = getFirstValue(params, 'eventToken'); + adjustEvent = new AdjustEvent(eventToken); + this.savedEvents[eventNumber] = adjustEvent; + } + + if ('revenue' in params) { + var revenueParams = getValues(params, 'revenue'); + var currency = revenueParams[0]; + var revenue = parseFloat(revenueParams[1]); + adjustEvent.setRevenue(revenue, currency); + } + + if ('callbackParams' in params) { + var callbackParams = getValues(params, 'callbackParams'); + for (var i = 0; i < callbackParams.length; i = i + 2) { + var key = callbackParams[i]; + var value = callbackParams[i + 1]; + adjustEvent.addCallbackParameter(key, value); + } + } + + if ('partnerParams' in params) { + var partnerParams = getValues(params, 'partnerParams'); + for (var i = 0; i < partnerParams.length; i = i + 2) { + var key = partnerParams[i]; + var value = partnerParams[i + 1]; + adjustEvent.addPartnerParameter(key, value); + } + } + + if ('orderId' in params) { + var orderId = getFirstValue(params, 'orderId'); + adjustEvent.setTransactionId(orderId); + } + + if ('callbackId' in params) { + var callbackId = getFirstValue(params, 'callbackId'); + adjustEvent.setCallbackId(callbackId); + } +}; + +AdjustCommandExecutor.prototype.trackEvent = function(params) { + this.event(params); + var eventNumber = 0; + if ('eventName' in params) { + var eventName = getFirstValue(params, 'eventName'); + eventNumber = parseInt(eventName.substr(eventName.length - 1)) + } + + var adjustEvent = this.savedEvents[eventNumber]; + Adjust.trackEvent(adjustEvent); + + delete this.savedEvents[0]; +}; + +AdjustCommandExecutor.prototype.pause = function(params) { + Adjust.trackSubsessionEnd(); +}; + +AdjustCommandExecutor.prototype.resume = function(params) { + Adjust.trackSubsessionStart(); +}; + +AdjustCommandExecutor.prototype.setEnabled = function(params) { + var enabled = getFirstValue(params, 'enabled') == 'true'; + Adjust.setEnabled(enabled); +}; + +AdjustCommandExecutor.prototype.setOfflineMode = function(params) { + var enabled = getFirstValue(params, 'enabled') == 'true'; + Adjust.setOfflineMode(enabled); +}; + +AdjustCommandExecutor.prototype.sendFirstPackages = function(params) { + Adjust.sendFirstPackages(); +}; + +AdjustCommandExecutor.prototype.gdprForgetMe = function(params) { + Adjust.gdprForgetMe(); +}; + +AdjustCommandExecutor.prototype.addSessionCallbackParameter = function(params) { + var list = getValues(params, 'KeyValue'); + + for (var i = 0; i < list.length; i = i+2){ + var key = list[i]; + var value = list[i+1]; + Adjust.addSessionCallbackParameter(key, value); + } +}; + +AdjustCommandExecutor.prototype.addSessionPartnerParameter = function(params) { + var list = getValues(params, 'KeyValue'); + + for (var i = 0; i < list.length; i = i+2){ + var key = list[i]; + var value = list[i+1]; + Adjust.addSessionPartnerParameter(key, value); + } +}; + +AdjustCommandExecutor.prototype.removeSessionCallbackParameter = function(params) { + var list = getValues(params, 'key'); + + for (var i = 0; i < list.length; i++) { + var key = list[i]; + Adjust.removeSessionCallbackParameter(key); + } +}; + +AdjustCommandExecutor.prototype.removeSessionPartnerParameter = function(params) { + var list = getValues(params, 'key'); + + for (var i = 0; i < list.length; i++) { + var key = list[i]; + Adjust.removeSessionPartnerParameter(key); + } +}; + +AdjustCommandExecutor.prototype.resetSessionCallbackParameters = function(params) { + Adjust.resetSessionCallbackParameters(); +}; + +AdjustCommandExecutor.prototype.resetSessionPartnerParameters = function(params) { + Adjust.resetSessionPartnerParameters(); +}; + +AdjustCommandExecutor.prototype.setPushToken = function(params) { + var token = getFirstValue(params, 'pushToken'); + Adjust.setDeviceToken(token); +}; + +AdjustCommandExecutor.prototype.openDeeplink = function(params) { + var deeplink = getFirstValue(params, 'deeplink'); + Adjust.appWillOpenUrl(deeplink); +}; + +// Util +function getValues(params, key) { + if (key in params) { + return params[key]; + } + + return null; +} + +function getFirstValue(params, key) { + if (key in params) { + var param = params[key]; + + if(param != null && param.length >= 1) { + return param[0]; + } + } + + return null; +} + +module.exports = TestLibraryBridge; diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m new file mode 100644 index 000000000..6cba8b8f2 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m @@ -0,0 +1,69 @@ +// +// TestLibraryBridge.m +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import "TestLibraryBridge.h" + +@interface TestLibraryBridge () + +@property WVJBResponseCallback commandExecutorCallback; +@property (nonatomic, strong) ATLTestLibrary *testLibrary; +@property (nonatomic, weak) AdjustBridgeRegister *adjustBridgeRegister; + +@end + +@implementation TestLibraryBridge + +- (id)initWithAdjustBridgeRegister:(AdjustBridgeRegister *)adjustBridgeRegister { + self = [super init]; + if (self == nil) { + return nil; + } + + self.testLibrary = [ATLTestLibrary testLibraryWithBaseUrl:baseUrl + andCommandDelegate:self]; + + [adjustBridgeRegister registerHandler:@"adjustTLB_startTestSession" handler:^(id data, WVJBResponseCallback responseCallback) { + NSLog(@"TestLibraryBridge adjustTLB_startTestSession"); + // self.commandExecutorCallback = responseCallback; + [self.adjustBridgeRegister callHandler:@"adjustjs_commandExecutor" data:@"test"]; + [self.testLibrary startTestSession:@"web-bridge4.16.0@ios4.16.0"]; + }]; + + [adjustBridgeRegister registerHandler:@"adjustTLB_addInfoToSend" handler:^(id data, WVJBResponseCallback responseCallback) { + NSLog(@"TestLibraryBridge adjustTLB_addInfoToSend"); + NSString *key = [data objectForKey:@"key"]; + NSString *value = [data objectForKey:@"value"]; + [self.testLibrary addInfoToSend:key value:value]; + }]; + + [adjustBridgeRegister registerHandler:@"adjustTLB_sendInfoToServer" handler:^(id data, WVJBResponseCallback responseCallback) { + NSLog(@"TestLibraryBridge adjustTLB_sendInfoToServer"); + if (![data isKindOfClass:[NSString class]]) { + NSLog(@"TestLibraryBridge adjustTLB_sendInfoToServer data not string %@", data); + return; + } + + NSString *basePath = (NSString *)data; + [self.testLibrary sendInfoToServer:basePath]; + }]; + + self.adjustBridgeRegister = adjustBridgeRegister; + NSLog(@"TestLibraryBridge initWithAdjustBridgeRegister"); + return self; +} + +- (void)executeCommandRawJson:(NSString *)json { + NSLog(@"TestLibraryBridge executeCommandRawJson: %@", json); + if (self.commandExecutorCallback == nil) { + NSLog(@"TestLibraryBridge nil commandExecutorCallback"); + } + // self.commandExecutorCallback(json); + [self.adjustBridgeRegister callHandler:@"adjustJS_commandExecutor" data:json]; +} + +@end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h new file mode 100644 index 000000000..6897c6da4 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h @@ -0,0 +1,18 @@ +// +// UIWebViewController.h +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIWebViewController : UINavigationController + +@end + +NS_ASSUME_NONNULL_END diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m new file mode 100644 index 000000000..60088002d --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m @@ -0,0 +1,50 @@ +// +// UIWebViewController.m +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import "AdjustBridge.h" +#import "TestLibraryBridge.h" +#import "UIWebViewController.h" +#import "WebViewJavascriptBridge.h" +#import + +@interface UIWebViewController () + +@property JSContext *jsContext; +@property AdjustBridge *adjustBridge; +@property WebViewJavascriptBridge *bridge; +@property TestLibraryBridge *testLibraryBridge; + +@end + +@implementation UIWebViewController + +- (void)viewWillAppear:(BOOL)animated { + if (_bridge) { + return; + } + + UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; + [self.view addSubview:webView]; + + self.adjustBridge = [[AdjustBridge alloc] init]; + [self.adjustBridge loadUIWebViewBridge:webView webViewDelegate:self]; + + _jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; + _jsContext[@"console"][@"log"] = ^(JSValue *msg) { + NSLog(@"JavaScript %@ log message: %@", [JSContext currentContext], msg); + }; + + self.testLibraryBridge = [[TestLibraryBridge alloc] initWithAdjustBridgeRegister:[self.adjustBridge bridgeRegister]]; + + NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"AdjustTestApp-WebView" ofType:@"html"]; + NSString *appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil]; + NSURL *baseURL = [NSURL fileURLWithPath:htmlPath]; + [webView loadHTMLString:appHtml baseURL:baseURL]; +} + +@end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h new file mode 100644 index 000000000..8b0dc3d09 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h @@ -0,0 +1,19 @@ +// +// WKWebViewController.h +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface WKWebViewController : UINavigationController + +@end + +NS_ASSUME_NONNULL_END diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m new file mode 100644 index 000000000..40f6c4dbf --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m @@ -0,0 +1,82 @@ +// +// WKWebViewController.m +// AdjustWebBridgeTestApp +// +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import "WKWebViewController.h" +#import "WebViewJavascriptBridge.h" + +@interface WKWebViewController () + +@property WebViewJavascriptBridge *bridge; + +@end + +@implementation WKWebViewController + +- (void)viewWillAppear:(BOOL)animated { + if (_bridge) { + return; + } + + WKWebView *webView = [[NSClassFromString(@"WKWebView") alloc] initWithFrame:self.view.bounds]; + webView.navigationDelegate = self; + [self.view addSubview:webView]; + [WebViewJavascriptBridge enableLogging]; + _bridge = [WebViewJavascriptBridge bridgeForWebView:webView]; + [_bridge setWebViewDelegate:self]; + + [_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) { + NSLog(@"testObjcCallback called: %@", data); + responseCallback(@"Response from testObjcCallback"); + }]; + [_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }]; + + [self renderButtons:webView]; + [self loadExamplePage:webView]; +} + +- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { + NSLog(@"webViewDidStartLoad"); +} + +- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { + NSLog(@"webViewDidFinishLoad"); +} + +- (void)renderButtons:(WKWebView *)webView { + UIFont *font = [UIFont fontWithName:@"HelveticaNeue" size:12.0]; + + UIButton *callbackButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; + [callbackButton setTitle:@"Call handler" forState:UIControlStateNormal]; + [callbackButton addTarget:self action:@selector(callHandler:) forControlEvents:UIControlEventTouchUpInside]; + [self.view insertSubview:callbackButton aboveSubview:webView]; + callbackButton.frame = CGRectMake(10, 400, 100, 35); + callbackButton.titleLabel.font = font; + + UIButton *reloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; + [reloadButton setTitle:@"Reload webview" forState:UIControlStateNormal]; + [reloadButton addTarget:webView action:@selector(reload) forControlEvents:UIControlEventTouchUpInside]; + [self.view insertSubview:reloadButton aboveSubview:webView]; + reloadButton.frame = CGRectMake(110, 400, 100, 35); + reloadButton.titleLabel.font = font; +} + +- (void)callHandler:(id)sender { + id data = @{ @"greetingFromObjC": @"Hi there, JS!" }; + [_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) { + NSLog(@"testJavascriptHandler responded: %@", response); + }]; +} + +- (void)loadExamplePage:(WKWebView *)webView { + NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"AdjustTestApp-WebView" ofType:@"html"]; + NSString *appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil]; + NSURL *baseURL = [NSURL fileURLWithPath:htmlPath]; + [webView loadHTMLString:appHtml baseURL:baseURL]; +} + +@end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/main.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/main.m new file mode 100644 index 000000000..1e0ffaa05 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/main.m @@ -0,0 +1,16 @@ +// +// main.m +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index acd387ce3..846b80ecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 4.16.0 (7th November 2018) +#### Added +- Added sending of UUID string with each attribution request. + +--- + ### Version 4.15.0 (31st August 2018) #### Added - Added `setCallbackId` method on `ADJEvent` object for users to set custom ID on event object which will later be reported in event success/failure callbacks. diff --git a/README.md b/README.md index fd1947dc9..1dbb5464e 100644 --- a/README.md +++ b/README.md @@ -70,13 +70,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.15.0' +pod 'Adjust', '~> 4.16.0' ``` or: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.15.0' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.16.0' ``` --- diff --git a/VERSION b/VERSION index 5c517bf11..ecbc3b030 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.15.0 +4.16.0 diff --git a/doc/english/migrate.md b/doc/english/migrate.md index 32d8245f8..97bfc64b6 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for iOS to v4.15.0 from v3.4.0 +## Migrate your adjust SDK for iOS to v4.16.0 from v3.4.0 ### Initial setup diff --git a/doc/english/web_view_migration.md b/doc/english/web_view_migration.md index 60670554b..a426f8923 100644 --- a/doc/english/web_view_migration.md +++ b/doc/english/web_view_migration.md @@ -1,4 +1,4 @@ -## Migrate your Adjust web bridge SDK to v4.15.0 or later from v4.9.1 or earlier +## Migrate your Adjust web bridge SDK to v4.16.0 or later from v4.9.1 or earlier ### Integration diff --git a/doc/english/web_views.md b/doc/english/web_views.md index a764c000b..909bbe2f6 100644 --- a/doc/english/web_views.md +++ b/doc/english/web_views.md @@ -63,7 +63,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.15.0' +pod 'Adjust/WebBridge', '~> 4.16.0' ``` --- diff --git a/doc/japanese/migrate_ja.md b/doc/japanese/migrate_ja.md index f828663f4..97e0eef83 100644 --- a/doc/japanese/migrate_ja.md +++ b/doc/japanese/migrate_ja.md @@ -1,4 +1,4 @@ -## iOS用adjust SDKのv3.4.0からv4.15.0への移行 +## iOS用adjust SDKのv3.4.0からv4.16.0への移行 ### 初期設定 diff --git a/doc/migrate.md b/doc/migrate.md index 32d8245f8..97bfc64b6 100644 --- a/doc/migrate.md +++ b/doc/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for iOS to v4.15.0 from v3.4.0 +## Migrate your adjust SDK for iOS to v4.16.0 from v3.4.0 ### Initial setup diff --git a/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift b/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift index 652337803..ee2a1e7a9 100644 --- a/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift +++ b/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift @@ -45,24 +45,24 @@ class AppDelegate: UIResponder, UIApplicationDelegate, AdjustDelegate { return true } - func adjustAttributionChanged(_attribution: ADJAttribution) { - NSLog("adjust attribution %@", _attribution) + func adjustAttributionChanged(_ attribution: ADJAttribution?) { + NSLog("adjust attribution %@", attribution ?? "") } - func adjustEventTrackingSucceeded(_eventSuccessResponseData: ADJEventSuccess) { - NSLog("adjust event success %@", _eventSuccessResponseData) + func adjustEventTrackingSucceeded(_ eventSuccessResponseData: ADJEventSuccess?) { + NSLog("adjust event success %@", eventSuccessResponseData ?? "") } - func adjustEventTrackingFailed(_eventFailureResponseData: ADJEventFailure) { - NSLog("adjust event failure %@", _eventFailureResponseData) + func adjustEventTrackingFailed(_ eventFailureResponseData: ADJEventFailure?) { + NSLog("adjust event failure %@", eventFailureResponseData ?? "") } - func adjustSessionTrackingSucceeded(_sessionSuccessResponseData: ADJSessionSuccess) { - NSLog("adjust session success %@", _sessionSuccessResponseData) + func adjustSessionTrackingSucceeded(_ sessionSuccessResponseData: ADJSessionSuccess?) { + NSLog("adjust session success %@", sessionSuccessResponseData ?? "") } - func adjustSessionTrackingFailed(_sessionFailureResponseData: ADJSessionFailure) { - NSLog("adjust session failure %@", _sessionFailureResponseData) + func adjustSessionTrackingFailed(_ sessionFailureResponseData: ADJSessionFailure?) { + NSLog("adjust session failure %@", sessionFailureResponseData ?? "") } @objc func adjustDeeplinkResponse(_deeplink: NSURL!) -> Bool { diff --git a/examples/AdjustExample-iOS/AdjustExample-iOS.xcodeproj/project.pbxproj b/examples/AdjustExample-iOS/AdjustExample-iOS.xcodeproj/project.pbxproj index b4344af66..08fa93c38 100644 --- a/examples/AdjustExample-iOS/AdjustExample-iOS.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-iOS/AdjustExample-iOS.xcodeproj/project.pbxproj @@ -535,6 +535,7 @@ CODE_SIGN_ENTITLEMENTS = "AdjustExample-iOS/AdjustExample-iOS.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = QGUGW9AUMK; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "AdjustExample-iOS/Info.plist"; @@ -543,6 +544,7 @@ OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = com.adjust.examples; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Debug; }; @@ -554,6 +556,7 @@ CODE_SIGN_ENTITLEMENTS = "AdjustExample-iOS/AdjustExample-iOS.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = QGUGW9AUMK; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "AdjustExample-iOS/Info.plist"; @@ -562,6 +565,7 @@ OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = com.adjust.examples; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; }; name = Release; }; diff --git a/examples/AdjustExample-iOS/AdjustExample-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/AdjustExample-iOS/AdjustExample-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json index 1d060ed28..d8db8d65f 100644 --- a/examples/AdjustExample-iOS/AdjustExample-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/examples/AdjustExample-iOS/AdjustExample-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -84,6 +84,11 @@ "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : {