From 3e0ee996850bcdbc40ede89836c9da18b2bb3275 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 15:00:59 +0200 Subject: [PATCH 01/36] Create bridge test app --- Adjust.xcodeproj/project.pbxproj | 30 ++ .../project.pbxproj | 342 ++++++++++++++++++ .../AdjustWebBridgeTestApp/AppDelegate.h | 17 + .../AdjustWebBridgeTestApp/AppDelegate.m | 51 +++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../Base.lproj/Main.storyboard | 24 ++ .../AdjustWebBridgeTestApp/Info.plist | 45 +++ .../AdjustWebBridgeTestApp/ViewController.h | 15 + .../AdjustWebBridgeTestApp/ViewController.m | 23 ++ .../AdjustWebBridgeTestApp/main.m | 16 + 12 files changed, 692 insertions(+) create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Assets.xcassets/Contents.json create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/LaunchScreen.storyboard create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Base.lproj/Main.storyboard create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/Info.plist create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.h create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/main.m diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index 69b5a3032..854e6a96f 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,9 @@ /* 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 = ""; }; + 6FA69FD52101E00100FCD3B5 /* AdjustBridge_JS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdjustBridge_JS.h; sourceTree = ""; }; + 6FA69FD62101E00100FCD3B5 /* AdjustBridge_JS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge_JS.m; 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 = ""; }; @@ -1140,6 +1150,14 @@ name = Products; sourceTree = ""; }; + 6F7AF640211878BC00F730B2 /* Products */ = { + isa = PBXGroup; + children = ( + 6F7AF650211878BD00F730B2 /* AdjustWebBridgeTestApp.app */, + ); + name = Products; + sourceTree = ""; + }; 9648C5E41CD1765E00A3B049 /* AdjustBridge */ = { isa = PBXGroup; children = ( @@ -1296,6 +1314,7 @@ 96E5E39A18BBB49E008E7B30 /* AdjustTests */ = { isa = PBXGroup; children = ( + 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */, 6F084240200776A000568A31 /* AdjustTestApp.xcodeproj */, 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */, 6F0841FB2007749C00568A31 /* AdjustUnitTests */, @@ -2236,6 +2255,10 @@ ProductGroup = 6F0842192007766700568A31 /* Products */; ProjectRef = 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */; }, + { + ProductGroup = 6F7AF640211878BC00F730B2 /* Products */; + ProjectRef = 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */; + }, ); projectRoot = ""; targets = ( @@ -2267,6 +2290,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/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj new file mode 100644 index 000000000..09aa80964 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -0,0 +1,342 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 6F7AF62B211878BA00F730B2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF62A211878BA00F730B2 /* AppDelegate.m */; }; + 6F7AF62E211878BA00F730B2 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF62D211878BA00F730B2 /* ViewController.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 */; }; +/* 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 = ""; }; + 6F7AF62C211878BA00F730B2 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 6F7AF62D211878BA00F730B2 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6F7AF623211878B900F730B2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6F7AF61D211878B900F730B2 = { + isa = PBXGroup; + children = ( + 6F7AF628211878B900F730B2 /* AdjustWebBridgeTestApp */, + 6F7AF627211878B900F730B2 /* Products */, + ); + sourceTree = ""; + }; + 6F7AF627211878B900F730B2 /* Products */ = { + isa = PBXGroup; + children = ( + 6F7AF626211878B900F730B2 /* AdjustWebBridgeTestApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 6F7AF628211878B900F730B2 /* AdjustWebBridgeTestApp */ = { + isa = PBXGroup; + children = ( + 6F7AF629211878BA00F730B2 /* AppDelegate.h */, + 6F7AF62A211878BA00F730B2 /* AppDelegate.m */, + 6F7AF62C211878BA00F730B2 /* ViewController.h */, + 6F7AF62D211878BA00F730B2 /* ViewController.m */, + 6F7AF62F211878BA00F730B2 /* Main.storyboard */, + 6F7AF632211878BC00F730B2 /* Assets.xcassets */, + 6F7AF634211878BC00F730B2 /* LaunchScreen.storyboard */, + 6F7AF637211878BC00F730B2 /* Info.plist */, + 6F7AF638211878BC00F730B2 /* main.m */, + ); + path = AdjustWebBridgeTestApp; + 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 = ( + 6F7AF636211878BC00F730B2 /* LaunchScreen.storyboard 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 = ( + 6F7AF62E211878BA00F730B2 /* ViewController.m in Sources */, + 6F7AF639211878BC00F730B2 /* main.m in Sources */, + 6F7AF62B211878BA00F730B2 /* AppDelegate.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; + 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; + 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; + 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; + 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/AppDelegate.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h new file mode 100644 index 000000000..4232b241c --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h @@ -0,0 +1,17 @@ +// +// AppDelegate.h +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. 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..988bd4809 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m @@ -0,0 +1,51 @@ +// +// AppDelegate.m +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + 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/ViewController.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.h new file mode 100644 index 000000000..76caab67d --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.h @@ -0,0 +1,15 @@ +// +// ViewController.h +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. All rights reserved. +// + +#import + +@interface ViewController : UIViewController + + +@end + diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m new file mode 100644 index 000000000..61349e732 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m @@ -0,0 +1,23 @@ +// +// ViewController.m +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. All rights reserved. +// + +#import "ViewController.h" + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} + + +@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])); + } +} From 7074c882497dce2bf301617fe3684d4fe4f2f74a Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 6 Aug 2018 16:44:00 +0200 Subject: [PATCH 02/36] Link test library and sdk --- .../project.pbxproj | 322 ++++++++++++++++++ 1 file changed, 322 insertions(+) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj index 09aa80964..2cffdce7f 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -13,6 +13,52 @@ 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 */; }; + 6F7AF76521187D0500F730B2 /* AdjustBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF75821187D0500F730B2 /* AdjustBridge_JS.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 */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -26,6 +72,99 @@ 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 = ""; }; + 6F7AF75821187D0500F730B2 /* AdjustBridge_JS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge_JS.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 = ""; }; + 6F7AF75D21187D0500F730B2 /* AdjustBridge_JS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridge_JS.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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -67,10 +206,147 @@ 6F7AF634211878BC00F730B2 /* LaunchScreen.storyboard */, 6F7AF637211878BC00F730B2 /* Info.plist */, 6F7AF638211878BC00F730B2 /* main.m */, + 6F7AF76A21187D1C00F730B2 /* AdjustTestLibrary */, + 6F7AF75321187D0500F730B2 /* AdjustBridge */, + 6F7AF6EC21187CFE00F730B2 /* Adjust */, + 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */, ); 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 = ( + 6F7AF75421187D0500F730B2 /* AdjustBridge.m */, + 6F7AF75521187D0500F730B2 /* AdjustBridgeRegister.h */, + 6F7AF75621187D0500F730B2 /* WebViewJavascriptBridge */, + 6F7AF76121187D0500F730B2 /* AdjustBridge.h */, + 6F7AF76221187D0500F730B2 /* AdjustBridgeRegister.m */, + ); + name = AdjustBridge; + path = ../../../AdjustBridge; + sourceTree = ""; + }; + 6F7AF75621187D0500F730B2 /* WebViewJavascriptBridge */ = { + isa = PBXGroup; + children = ( + 6F7AF75721187D0500F730B2 /* WebViewJavascriptBridgeBase.m */, + 6F7AF75821187D0500F730B2 /* AdjustBridge_JS.m */, + 6F7AF75921187D0500F730B2 /* WKWebViewJavascriptBridge.m */, + 6F7AF75A21187D0500F730B2 /* WebViewJavascriptBridge.m */, + 6F7AF75B21187D0500F730B2 /* WebViewJavascriptBridge_JS.h */, + 6F7AF75C21187D0500F730B2 /* WebViewJavascriptBridgeBase.h */, + 6F7AF75D21187D0500F730B2 /* AdjustBridge_JS.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 = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -141,9 +417,55 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6F7AF73621187CFF00F730B2 /* ADJSdkClickHandler.m in Sources */, + 6F7AF74C21187CFF00F730B2 /* ADJAdjustFactory.m in Sources */, + 6F7AF74721187CFF00F730B2 /* UIDevice+ADJAdditions.m in Sources */, 6F7AF62E211878BA00F730B2 /* ViewController.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 */, + 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 */, + 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 */, + 6F7AF76521187D0500F730B2 /* AdjustBridge_JS.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; }; From 6c6c30bbf39324001b2e4a02044162e7447e0059 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 15:04:31 +0200 Subject: [PATCH 03/36] Clean and reorder linking --- .../AdjustWebBridgeTestApp.xcodeproj/project.pbxproj | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj index 2cffdce7f..9a7108aea 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -48,7 +48,6 @@ 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 */; }; - 6F7AF76521187D0500F730B2 /* AdjustBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF75821187D0500F730B2 /* AdjustBridge_JS.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 */; }; @@ -141,12 +140,10 @@ 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 = ""; }; - 6F7AF75821187D0500F730B2 /* AdjustBridge_JS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge_JS.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 = ""; }; - 6F7AF75D21187D0500F730B2 /* AdjustBridge_JS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridge_JS.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 = ""; }; @@ -209,7 +206,6 @@ 6F7AF76A21187D1C00F730B2 /* AdjustTestLibrary */, 6F7AF75321187D0500F730B2 /* AdjustBridge */, 6F7AF6EC21187CFE00F730B2 /* Adjust */, - 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */, ); path = AdjustWebBridgeTestApp; sourceTree = ""; @@ -299,11 +295,11 @@ 6F7AF75321187D0500F730B2 /* AdjustBridge */ = { isa = PBXGroup; children = ( + 6F7AF76121187D0500F730B2 /* AdjustBridge.h */, 6F7AF75421187D0500F730B2 /* AdjustBridge.m */, 6F7AF75521187D0500F730B2 /* AdjustBridgeRegister.h */, - 6F7AF75621187D0500F730B2 /* WebViewJavascriptBridge */, - 6F7AF76121187D0500F730B2 /* AdjustBridge.h */, 6F7AF76221187D0500F730B2 /* AdjustBridgeRegister.m */, + 6F7AF75621187D0500F730B2 /* WebViewJavascriptBridge */, ); name = AdjustBridge; path = ../../../AdjustBridge; @@ -313,12 +309,10 @@ isa = PBXGroup; children = ( 6F7AF75721187D0500F730B2 /* WebViewJavascriptBridgeBase.m */, - 6F7AF75821187D0500F730B2 /* AdjustBridge_JS.m */, 6F7AF75921187D0500F730B2 /* WKWebViewJavascriptBridge.m */, 6F7AF75A21187D0500F730B2 /* WebViewJavascriptBridge.m */, 6F7AF75B21187D0500F730B2 /* WebViewJavascriptBridge_JS.h */, 6F7AF75C21187D0500F730B2 /* WebViewJavascriptBridgeBase.h */, - 6F7AF75D21187D0500F730B2 /* AdjustBridge_JS.h */, 6F7AF75E21187D0500F730B2 /* WebViewJavascriptBridge_JS.m */, 6F7AF75F21187D0500F730B2 /* WebViewJavascriptBridge.h */, 6F7AF76021187D0500F730B2 /* WKWebViewJavascriptBridge.h */, @@ -453,7 +447,6 @@ 6F7AF74F21187CFF00F730B2 /* ADJUserDefaults.m in Sources */, 6F7AF77C21187D1C00F730B2 /* ATLTestLibrary.m in Sources */, 6F7AF77A21187D1C00F730B2 /* ATLControlChannel.m in Sources */, - 6F7AF76521187D0500F730B2 /* AdjustBridge_JS.m in Sources */, 6F7AF77B21187D1C00F730B2 /* ATLUtilNetworking.m in Sources */, 6F7AF76921187D0500F730B2 /* AdjustBridgeRegister.m in Sources */, 6F7AF74B21187CFF00F730B2 /* ADJUtil.m in Sources */, From ace755d89c2ebee13fc9dcbd73975bd47786a618 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 15:50:24 +0200 Subject: [PATCH 04/36] Add test options to bridge --- AdjustBridge/AdjustBridge.m | 57 +++++++ AdjustBridge/AdjustBridgeRegister.m | 235 ++++++++++++++-------------- 2 files changed, 177 insertions(+), 115 deletions(-) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index b541d257a..74bb717d3 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -453,6 +453,63 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { [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 ([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 { diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 212865914..f90f079c7 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -82,123 +82,128 @@ + (NSString *)adjust_js { // 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 From ea59e624be5e273a6630aca589053b62909da4a8 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 16:06:01 +0200 Subject: [PATCH 05/36] Reset callbacks in web bridge for testing --- AdjustBridge/AdjustBridge.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index 74bb717d3..38db3ac01 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -41,9 +41,20 @@ - (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 { @@ -496,6 +507,9 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { } if ([self isFieldValid:teardown]) { testOptions.teardown = [teardown boolValue]; + if (testOptions.teardown) { + [self resetAdjustBridge]; + } } if ([self isFieldValid:deleteState]) { testOptions.deleteState = [deleteState boolValue]; From a9a5619e38f9fd58052064feccdac596c719e287 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 16:06:35 +0200 Subject: [PATCH 06/36] Send valid jsonResponse --- AdjustBridge/AdjustBridge.m | 47 +++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index 38db3ac01..eb700e3be 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -75,7 +75,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]; } @@ -91,9 +96,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]; } @@ -107,7 +116,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]; } @@ -122,7 +136,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]; } @@ -600,4 +619,22 @@ - (NSString *)getEventTokenFromFbPixelEventName:(NSString *)fbPixelEventName { 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; +} + @end From 00da5a5dabc567c63440118fda0ae6083cbe025f Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 16:09:24 +0200 Subject: [PATCH 07/36] Treat secret and info as strings --- AdjustBridge/AdjustBridge.m | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index eb700e3be..1b06ef8de 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -219,10 +219,10 @@ - (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"]; @@ -275,11 +275,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]; @@ -637,4 +637,12 @@ - (NSString *)convertJsonDictionaryToNSString:(NSDictionary *)jsonDictionary { return jsonString; } +- (NSNumber *)fieldToNSNumber:(NSObject *)field { + if (![self isFieldValid:field]) { + return nil; + } + NSNumberFormatter *formatString = [[NSNumberFormatter alloc] init]; + return [formatString numberFromString:[field description]]; +} + @end From bb7ea28070b6cd085652e6f32924f86d1bb871a9 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 16:09:43 +0200 Subject: [PATCH 08/36] Fix reset session parameters --- AdjustBridge/AdjustBridge.m | 6 ------ 1 file changed, 6 deletions(-) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index 1b06ef8de..a2dd245c8 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -467,16 +467,10 @@ - (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]; }]; From 705771c491b15850a639e2fcb624e3334898fc2e Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 16:15:11 +0200 Subject: [PATCH 09/36] Clean comments --- AdjustBridge/AdjustBridge.m | 12 ++---------- AdjustBridge/AdjustBridgeRegister.h | 24 ------------------------ 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index a2dd245c8..ca8838c55 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -180,11 +180,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]; } @@ -194,11 +190,7 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView // WebViewBridge already loaded. return; } -/* - AdjustWKBridgeRegister *wkBridgeRegister = [AdjustWKBridgeRegister bridgeRegisterWithWKWebView:wkWebView]; - [wkBridgeRegister setWebViewDelegate:wkWebViewDelegate]; - _bridgeRegister = wkBridgeRegister; -*/ + [self loadWebViewBridge:wkWebView webViewDelegate:wkWebViewDelegate]; } diff --git a/AdjustBridge/AdjustBridgeRegister.h b/AdjustBridge/AdjustBridgeRegister.h index d35042223..571c7cca1 100644 --- a/AdjustBridge/AdjustBridgeRegister.h +++ b/AdjustBridge/AdjustBridgeRegister.h @@ -20,27 +20,3 @@ + (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 -*/ From 8b40b2d35d9107b58a6c68655debe016273f16c4 Mon Sep 17 00:00:00 2001 From: nonelse Date: Fri, 7 Sep 2018 16:16:24 +0200 Subject: [PATCH 10/36] First commands --- AdjustBridge/AdjustBridge.m | 1 - .../project.pbxproj | 56 ++++ .../AdjustTestApp-WebView.html | 76 +++++ .../AdjustWebBridgeTestApp/AppDelegate.m | 23 +- .../TestLibraryBridge.h | 20 ++ .../TestLibraryBridge.js | 273 ++++++++++++++++++ .../TestLibraryBridge.m | 60 ++++ .../UIWebViewController.h | 18 ++ .../UIWebViewController.m | 46 +++ .../WKWebViewController.h | 19 ++ .../WKWebViewController.m | 82 ++++++ 11 files changed, 672 insertions(+), 2 deletions(-) create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h create mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index ca8838c55..ca7b7fe76 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -42,7 +42,6 @@ - (id)init { _bridgeRegister = nil; [self resetAdjustBridge]; - return self; } diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj index 9a7108aea..0892e890f 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -58,6 +58,16 @@ 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 */ @@ -162,6 +172,19 @@ 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 */ @@ -169,6 +192,11 @@ 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; }; @@ -180,6 +208,7 @@ children = ( 6F7AF628211878B900F730B2 /* AdjustWebBridgeTestApp */, 6F7AF627211878B900F730B2 /* Products */, + 6F7AF7B92118992200F730B2 /* Frameworks */, ); sourceTree = ""; }; @@ -203,6 +232,14 @@ 6F7AF634211878BC00F730B2 /* LaunchScreen.storyboard */, 6F7AF637211878BC00F730B2 /* Info.plist */, 6F7AF638211878BC00F730B2 /* main.m */, + 6F7AF78C2118808300F730B2 /* AdjustTestApp-WebView.html */, + 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */, + 6F7AF78E211888B500F730B2 /* TestLibraryBridge.h */, + 6F7AF78F211888B500F730B2 /* TestLibraryBridge.m */, + 6F7AF78621187EA400F730B2 /* UIWebViewController.h */, + 6F7AF78721187EA400F730B2 /* UIWebViewController.m */, + 6F7AF78921187EC500F730B2 /* WKWebViewController.h */, + 6F7AF78A21187EC500F730B2 /* WKWebViewController.m */, 6F7AF76A21187D1C00F730B2 /* AdjustTestLibrary */, 6F7AF75321187D0500F730B2 /* AdjustBridge */, 6F7AF6EC21187CFE00F730B2 /* Adjust */, @@ -341,6 +378,18 @@ 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 */ @@ -398,7 +447,9 @@ 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 */, ); @@ -415,6 +466,7 @@ 6F7AF74C21187CFF00F730B2 /* ADJAdjustFactory.m in Sources */, 6F7AF74721187CFF00F730B2 /* UIDevice+ADJAdditions.m in Sources */, 6F7AF62E211878BA00F730B2 /* ViewController.m in Sources */, + 6F7AF790211888B500F730B2 /* TestLibraryBridge.m in Sources */, 6F7AF74D21187CFF00F730B2 /* ADJResponseData.m in Sources */, 6F7AF77D21187D1C00F730B2 /* ATLBlockingQueue.m in Sources */, 6F7AF73221187CFF00F730B2 /* ADJTimerOnce.m in Sources */, @@ -424,6 +476,7 @@ 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 */, @@ -436,6 +489,7 @@ 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 */, @@ -539,6 +593,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; name = Debug; @@ -591,6 +646,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html new file mode 100644 index 000000000..1dc41b63b --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html @@ -0,0 +1,76 @@ + + + + + +

Adjust TestApp

+ + + +
+
+ +
+
+
+ diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m index 988bd4809..5af538198 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m @@ -7,6 +7,8 @@ // #import "AppDelegate.h" +#import "UIWebViewController.h" +#import "WKWebViewController.h" @interface AppDelegate () @@ -16,7 +18,26 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - // Override point for customization after application launch. + // 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; + return YES; } diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h new file mode 100644 index 000000000..9d7c31b42 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h @@ -0,0 +1,20 @@ +// +// TestLibraryBridge.h +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. 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..1f3d0fe65 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -0,0 +1,273 @@ +var localBaseUrl = 'http://127.0.0.1:8080'; +var localGdprUrl = 'http://127.0.0.1:8080'; +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)); + + this.adjustCommandExecutor[command.functionName](command.params); + }, + startTestSession: function () { + console.log('TestLibraryBridge startTestSession'); + if (WebViewJavascriptBridge) { + console.log('TestLibraryBridge startTestSession callHandler'); + WebViewJavascriptBridge.registerHandler('adjustJS_commandExecutor', TestLibraryBridge.adjustCommandExecutor); + this.adjustCommandExecutor = new AdjustCommandExecutor(localBaseUrl, localGdprUrl); + WebViewJavascriptBridge.callHandler('adjust_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.imerStartInMilliseconds = 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': + //TODOD reset configs + //TODOD 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.testOptions = 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); + } + + // TODO callbacks +}; + +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]; +}; + +//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..47884eb3c --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m @@ -0,0 +1,60 @@ +// +// TestLibraryBridge.m +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. All rights reserved. +// + +#import "TestLibraryBridge.h" + +@interface TestLibraryBridge () + +@property (nonatomic, strong) ATLTestLibrary *testLibrary; +@property WVJBResponseCallback commandExecutorCallback; +@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:@"adjust_startTestSession" handler:^(id data, WVJBResponseCallback responseCallback) { + + NSLog(@"TestLibraryBridge adjust_startTestSession"); + + //self.commandExecutorCallback = responseCallback; + + [self.adjustBridgeRegister callHandler:@"adjustjs_commandExecutor" data:@"test"]; + + + [self.testLibrary addTest:@"current/event-buffering/Test_EventBuffering_sensitive_packets"]; + + [self.testLibrary startTestSession:@"web-bridge4.14.0@ios4.14.2"]; + + }]; + + 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..ca7cb6ecf --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h @@ -0,0 +1,18 @@ +// +// UIWebViewController.h +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. 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..655908291 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m @@ -0,0 +1,46 @@ +// +// UIWebViewController.m +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. All rights reserved. +// +#import +#import "UIWebViewController.h" +#import "WebViewJavascriptBridge.h" +#import "AdjustBridge.h" +#import "TestLibraryBridge.h" + +@interface UIWebViewController () +@property WebViewJavascriptBridge* bridge; +@property AdjustBridge *adjustBridge; +@property JSContext *jsContext; +@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..b50a3ea24 --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h @@ -0,0 +1,19 @@ +// +// WKWebViewController.h +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. 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..5bf301d2f --- /dev/null +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m @@ -0,0 +1,82 @@ +// +// WKWebViewController.m +// AdjustWebBridgeTestApp +// +// Created by Pedro on 06.08.18. +// Copyright © 2018 adjust. 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:@"ExampleApp" ofType:@"html"]; + NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil]; + NSURL *baseURL = [NSURL fileURLWithPath:htmlPath]; + [webView loadHTMLString:appHtml baseURL:baseURL]; +} + +@end From 6df0e554f835b2126dc6f65a16f435fd4e50aa7b Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 11:34:36 +0200 Subject: [PATCH 11/36] Increase isFieldValid checks --- AdjustBridge/AdjustBridge.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index ca7b7fe76..604e6fe65 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -581,7 +581,10 @@ - (BOOL)isFieldValid:(NSObject *)field { if ([field isKindOfClass:[NSNull class]]) { return NO; } - return YES; + if ([[field description] length] == 0) { + return NO; + } + return !!field; } - (NSString *)getFbAppId { From 327aa0c16b6a7ac0556193ff5863349e33e198fa Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 11:35:04 +0200 Subject: [PATCH 12/36] Use local reference instead of this --- .../AdjustWebBridgeTestApp/TestLibraryBridge.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 1f3d0fe65..5183cc6ba 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -1,5 +1,11 @@ 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'); @@ -8,14 +14,18 @@ var TestLibraryBridge = { console.log('functionName: ' + command.functionName); console.log('params: ' + JSON.stringify(command.params)); - this.adjustCommandExecutor[command.functionName](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); - this.adjustCommandExecutor = new AdjustCommandExecutor(localBaseUrl, localGdprUrl); + // start test session in obj-c WebViewJavascriptBridge.callHandler('adjust_startTestSession', null, null); } } From 014e48362d92d4460f62c814d33d6f5ad117f4ec Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 11:35:46 +0200 Subject: [PATCH 13/36] Fix JS typos --- .../AdjustWebBridgeTestApp/TestLibraryBridge.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 5183cc6ba..8b127f032 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -76,7 +76,7 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { testOptions.timerIntervalInMilliseconds = getFirstValue(params, 'timerInterval'); } if ('timerStart' in params) { - testOptions.imerStartInMilliseconds = getFirstValue(params, 'timerStart'); + testOptions.timerStartInMilliseconds = getFirstValue(params, 'timerStart'); } if ('sessionInterval' in params) { testOptions.sessionIntervalInMilliseconds = getFirstValue(params, 'sessionInterval'); @@ -140,7 +140,7 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { Adjust.setTestOptions(testOptions); }; -AdjustCommandExecutor.prototype.testOptions = function(params) { +AdjustCommandExecutor.prototype.config = function(params) { var configNumber = 0; if ('configName' in params) { var configName = getFirstValue(params, 'configName'); From c0a4fb605c42b71301b4beb2aecad17b76b7773f Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 11:38:00 +0200 Subject: [PATCH 14/36] Rename handlers and add send info handlers --- .../TestLibraryBridge.js | 6 ++++- .../TestLibraryBridge.m | 27 +++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 8b127f032..49d04c469 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -26,7 +26,7 @@ var TestLibraryBridge = { // register objc->JS function for commands WebViewJavascriptBridge.registerHandler('adjustJS_commandExecutor', TestLibraryBridge.adjustCommandExecutor); // start test session in obj-c - WebViewJavascriptBridge.callHandler('adjust_startTestSession', null, null); + WebViewJavascriptBridge.callHandler('adjustTLB_startTestSession', null, null); } } }; @@ -243,6 +243,10 @@ AdjustCommandExecutor.prototype.config = function(params) { // TODO callbacks }; +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; diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m index 47884eb3c..aaf74ef43 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m @@ -27,9 +27,9 @@ - (id)initWithAdjustBridgeRegister:(AdjustBridgeRegister *)adjustBridgeRegister self.testLibrary = [ATLTestLibrary testLibraryWithBaseUrl:baseUrl andCommandDelegate:self]; - [adjustBridgeRegister registerHandler:@"adjust_startTestSession" handler:^(id data, WVJBResponseCallback responseCallback) { + [adjustBridgeRegister registerHandler:@"adjustTLB_startTestSession" handler:^(id data, WVJBResponseCallback responseCallback) { - NSLog(@"TestLibraryBridge adjust_startTestSession"); + NSLog(@"TestLibraryBridge adjustTLB_startTestSession"); //self.commandExecutorCallback = responseCallback; @@ -42,6 +42,29 @@ - (id)initWithAdjustBridgeRegister:(AdjustBridgeRegister *)adjustBridgeRegister }]; + [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"); From 9322ff09e743578480886a0bd139fa3a961a8f40 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 11:38:22 +0200 Subject: [PATCH 15/36] Add test callbacks --- .../TestLibraryBridge.js | 107 +++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 49d04c469..9bc26c560 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -240,7 +240,112 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setUserAgent(userAgent); } - // TODO callbacks + 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('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('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) { From 7fa777bf352c7946f6b1ec30fa63f4ec374a6dc8 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 11:38:50 +0200 Subject: [PATCH 16/36] Add remaining commands --- .../TestLibraryBridge.js | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 9bc26c560..35e049146 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -366,6 +366,152 @@ AdjustCommandExecutor.prototype.start = function(params) { 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); + } +}; + +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) { From 44bb1b4a1de4c4d43e420033abafb14a68e0cdab Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 12:30:18 +0200 Subject: [PATCH 17/36] Update sdk client version --- .../AdjustWebBridgeTestApp/TestLibraryBridge.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m index aaf74ef43..33a27352b 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m @@ -38,7 +38,7 @@ - (id)initWithAdjustBridgeRegister:(AdjustBridgeRegister *)adjustBridgeRegister [self.testLibrary addTest:@"current/event-buffering/Test_EventBuffering_sensitive_packets"]; - [self.testLibrary startTestSession:@"web-bridge4.14.0@ios4.14.2"]; + [self.testLibrary startTestSession:@"web-bridge4.15.0@ios4.15.0"]; }]; From 6202134c4589bae4f8d751158c10da504096bca0 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 12:31:11 +0200 Subject: [PATCH 18/36] Cleanup comments and logs --- .../AdjustTestApp-WebView.html | 25 ++----------------- .../TestLibraryBridge.js | 4 +-- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html index 1dc41b63b..aa20f4281 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AdjustTestApp-WebView.html @@ -41,31 +41,10 @@

Adjust TestApp

var btnTrackSimpleEvent = document.getElementById('btnStartTestSession'); btnTrackSimpleEvent.onclick = function(e) { e.preventDefault(); - //alert('btnStartTestSession'); + console.log('btnStartTestSession'); TestLibraryBridge.startTestSession(); }; - -/* - bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) { - log('ObjC called testJavascriptHandler with', data) - var responseData = { 'Javascript Says':'Right back atcha!' } - log('JS responding with', responseData) - responseCallback(responseData) - }) - - document.body.appendChild(document.createElement('br')) - - var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button')) - callbackButton.innerHTML = 'Fire testObjcCallback' - callbackButton.onclick = function(e) { - e.preventDefault() - log('JS calling handler "testObjcCallback"') - bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) { - log('JS got response', response) - }) - } - */ - }) + });
diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 35e049146..ce3b11d50 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -67,7 +67,7 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { if ('basePath' in params) { var basePath = getFirstValue(params, 'basePath'); - console.log('TestLibraryBridge hasOwnProperty basePath, first: ' basePath); + console.log('TestLibraryBridge hasOwnProperty basePath, first: ' + basePath); this.basePath = basePath; this.gdprPath = basePath; } @@ -511,7 +511,6 @@ AdjustCommandExecutor.prototype.openDeeplink = function(params) { Adjust.appWillOpenUrl(deeplink); }; - //Util //====================== function getValues(params, key) { @@ -534,5 +533,4 @@ function getFirstValue(params, key) { return null; } - module.exports = TestLibraryBridge; From 294d7a7ff3af0b1e66fdb29410e3766548942704 Mon Sep 17 00:00:00 2001 From: nonelse Date: Mon, 10 Sep 2018 12:41:06 +0200 Subject: [PATCH 19/36] Add callback id for testing --- .../AdjustWebBridgeTestApp/TestLibraryBridge.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index ce3b11d50..4954da23e 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -303,6 +303,7 @@ AdjustCommandExecutor.prototype.config = function(params) { 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); @@ -320,6 +321,7 @@ AdjustCommandExecutor.prototype.config = function(params) { 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); @@ -411,6 +413,11 @@ AdjustCommandExecutor.prototype.event = function(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) { From 26266a951c575770b7fd5373c71c6ed2cc6a1bd1 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 11 Sep 2018 15:20:55 +0200 Subject: [PATCH 20/36] Set test app iOS deployment target to 9.0 --- .../AdjustWebBridgeTestApp.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj index 0892e890f..ee498165e 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -659,6 +659,7 @@ 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", @@ -676,6 +677,7 @@ 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", From 24fa20c819ea7b38d20fe7b8a788ae0b686373a8 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 11 Sep 2018 15:26:08 +0200 Subject: [PATCH 21/36] Run all tests + minor cleanup --- .../TestLibraryBridge.m | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m index 33a27352b..e5e172913 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m @@ -10,8 +10,8 @@ @interface TestLibraryBridge () -@property (nonatomic, strong) ATLTestLibrary *testLibrary; @property WVJBResponseCallback commandExecutorCallback; +@property (nonatomic, strong) ATLTestLibrary *testLibrary; @property (nonatomic, weak) AdjustBridgeRegister * adjustBridgeRegister; @end @@ -28,45 +28,31 @@ - (id)initWithAdjustBridgeRegister:(AdjustBridgeRegister *)adjustBridgeRegister andCommandDelegate:self]; [adjustBridgeRegister registerHandler:@"adjustTLB_startTestSession" handler:^(id data, WVJBResponseCallback responseCallback) { - NSLog(@"TestLibraryBridge adjustTLB_startTestSession"); - - //self.commandExecutorCallback = responseCallback; - + // self.commandExecutorCallback = responseCallback; [self.adjustBridgeRegister callHandler:@"adjustjs_commandExecutor" data:@"test"]; - - - [self.testLibrary addTest:@"current/event-buffering/Test_EventBuffering_sensitive_packets"]; - [self.testLibrary startTestSession:@"web-bridge4.15.0@ios4.15.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; - + NSString *basePath = (NSString *)data; [self.testLibrary sendInfoToServer:basePath]; }]; self.adjustBridgeRegister = adjustBridgeRegister; - NSLog(@"TestLibraryBridge initWithAdjustBridgeRegister"); return self; } @@ -76,7 +62,7 @@ - (void)executeCommandRawJson:(NSString *)json { if (self.commandExecutorCallback == nil) { NSLog(@"TestLibraryBridge nil commandExecutorCallback"); } - //self.commandExecutorCallback(json); + // self.commandExecutorCallback(json); [self.adjustBridgeRegister callHandler:@"adjustJS_commandExecutor" data:json]; } From 5a5c5d8d1fba5e6ef349e34b8045cfc56bb66a19 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 11 Sep 2018 20:28:50 +0200 Subject: [PATCH 22/36] AdjustWebBridgeTestApp cleanup --- Adjust.xcodeproj/project.pbxproj | 4 +-- .../project.pbxproj | 22 +++++--------- .../AdjustWebBridgeTestApp/AppDelegate.h | 6 ++-- .../AdjustWebBridgeTestApp/AppDelegate.m | 21 ++++--------- .../TestLibraryBridge.h | 4 +-- .../TestLibraryBridge.js | 23 ++++---------- .../TestLibraryBridge.m | 6 ++-- .../UIWebViewController.h | 4 +-- .../UIWebViewController.m | 30 +++++++++++-------- .../AdjustWebBridgeTestApp/ViewController.h | 15 ---------- .../AdjustWebBridgeTestApp/ViewController.m | 23 -------------- .../WKWebViewController.h | 4 +-- .../WKWebViewController.m | 26 ++++++++-------- 13 files changed, 61 insertions(+), 127 deletions(-) delete mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.h delete mode 100644 AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index 854e6a96f..b15b2cb51 100644 --- a/Adjust.xcodeproj/project.pbxproj +++ b/Adjust.xcodeproj/project.pbxproj @@ -565,8 +565,6 @@ 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 = ""; }; - 6FA69FD52101E00100FCD3B5 /* AdjustBridge_JS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdjustBridge_JS.h; sourceTree = ""; }; - 6FA69FD62101E00100FCD3B5 /* AdjustBridge_JS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge_JS.m; 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 = ""; }; @@ -1314,8 +1312,8 @@ 96E5E39A18BBB49E008E7B30 /* AdjustTests */ = { isa = PBXGroup; children = ( - 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */, 6F084240200776A000568A31 /* AdjustTestApp.xcodeproj */, + 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */, 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */, 6F0841FB2007749C00568A31 /* AdjustUnitTests */, ); diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj index ee498165e..0230a01d2 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 6F7AF62B211878BA00F730B2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF62A211878BA00F730B2 /* AppDelegate.m */; }; - 6F7AF62E211878BA00F730B2 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF62D211878BA00F730B2 /* ViewController.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 */; }; @@ -74,8 +73,6 @@ 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 = ""; }; - 6F7AF62C211878BA00F730B2 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 6F7AF62D211878BA00F730B2 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.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 = ""; }; @@ -225,14 +222,6 @@ children = ( 6F7AF629211878BA00F730B2 /* AppDelegate.h */, 6F7AF62A211878BA00F730B2 /* AppDelegate.m */, - 6F7AF62C211878BA00F730B2 /* ViewController.h */, - 6F7AF62D211878BA00F730B2 /* ViewController.m */, - 6F7AF62F211878BA00F730B2 /* Main.storyboard */, - 6F7AF632211878BC00F730B2 /* Assets.xcassets */, - 6F7AF634211878BC00F730B2 /* LaunchScreen.storyboard */, - 6F7AF637211878BC00F730B2 /* Info.plist */, - 6F7AF638211878BC00F730B2 /* main.m */, - 6F7AF78C2118808300F730B2 /* AdjustTestApp-WebView.html */, 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */, 6F7AF78E211888B500F730B2 /* TestLibraryBridge.h */, 6F7AF78F211888B500F730B2 /* TestLibraryBridge.m */, @@ -240,9 +229,15 @@ 6F7AF78721187EA400F730B2 /* UIWebViewController.m */, 6F7AF78921187EC500F730B2 /* WKWebViewController.h */, 6F7AF78A21187EC500F730B2 /* WKWebViewController.m */, - 6F7AF76A21187D1C00F730B2 /* AdjustTestLibrary */, - 6F7AF75321187D0500F730B2 /* AdjustBridge */, + 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 = ""; @@ -465,7 +460,6 @@ 6F7AF73621187CFF00F730B2 /* ADJSdkClickHandler.m in Sources */, 6F7AF74C21187CFF00F730B2 /* ADJAdjustFactory.m in Sources */, 6F7AF74721187CFF00F730B2 /* UIDevice+ADJAdditions.m in Sources */, - 6F7AF62E211878BA00F730B2 /* ViewController.m in Sources */, 6F7AF790211888B500F730B2 /* TestLibraryBridge.m in Sources */, 6F7AF74D21187CFF00F730B2 /* ADJResponseData.m in Sources */, 6F7AF77D21187D1C00F730B2 /* ATLBlockingQueue.m in Sources */, diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h index 4232b241c..dd10666d2 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.h @@ -2,8 +2,8 @@ // AppDelegate.h // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. // #import @@ -12,6 +12,4 @@ @property (strong, nonatomic) UIWindow *window; - @end - diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m index 5af538198..58723e8fe 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m @@ -2,71 +2,60 @@ // AppDelegate.m // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// 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" -@interface AppDelegate () - -@end - @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1. Create the UIWebView example UIWebViewController* UIWebViewExampleController = [[UIWebViewController alloc] init]; - UIWebViewExampleController.tabBarItem.title = @"UIWebView"; + 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]) { + if ([WKWebView class]) { WKWebViewController* WKWebViewExampleController = [[WKWebViewController alloc] init]; - WKWebViewExampleController.tabBarItem.title = @"WKWebView"; + WKWebViewExampleController.tabBarItem.title = @"WKWebView"; [tabBarController addChildViewController:WKWebViewExampleController]; } self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = tabBarController; [self.window makeKeyAndVisible]; - return YES; 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/TestLibraryBridge.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h index 9d7c31b42..b3cc5bd0e 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h @@ -2,8 +2,8 @@ // TestLibraryBridge.h // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. // #import diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index 4954da23e..9be43d3b6 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -21,7 +21,6 @@ var TestLibraryBridge = { 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); @@ -71,7 +70,6 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { this.basePath = basePath; this.gdprPath = basePath; } - if ('timerInterval' in params) { testOptions.timerIntervalInMilliseconds = getFirstValue(params, 'timerInterval'); } @@ -111,8 +109,8 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { testOptions.deleteState = true; break; case 'resetTest': - //TODOD reset configs - //TODOD reset events + // TODO: reset configs + // TODO: reset events testOptions.timerIntervalInMilliseconds = -1; testOptions.timerStartInMilliseconds = -1; testOptions.sessionIntervalInMilliseconds = -1; @@ -124,9 +122,9 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { testOptions.gdprPath = null; break; case 'test': - //TODO null configs - //TODO null events - //TODO null delegate + // TODO: null configs + // TODO: null events + // TODO: null delegate this.basePath = null; this.gdprPath = null; testOptions.timerIntervalInMilliseconds = -1; @@ -207,7 +205,6 @@ AdjustCommandExecutor.prototype.config = function(params) { var info2 = appSecretArray[2].toString(); var info3 = appSecretArray[3].toString(); var info4 = appSecretArray[4].toString(); - adjustConfig.setAppSecret(secretId, info1, info2, info3, info4); } @@ -254,7 +251,6 @@ AdjustCommandExecutor.prototype.config = function(params) { addInfoToSend('creative', attribution.creative); addInfoToSend('clickLabel', attribution.click_label); addInfoToSend('adid', attribution.adid); - WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); } ); @@ -270,7 +266,6 @@ AdjustCommandExecutor.prototype.config = function(params) { addInfoToSend('timestamp', sessionSuccessResponseData.timestamp); addInfoToSend('adid', sessionSuccessResponseData.adid); addInfoToSend('jsonResponse', sessionSuccessResponseData.jsonResponse); - WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); } ); @@ -287,7 +282,6 @@ AdjustCommandExecutor.prototype.config = function(params) { addInfoToSend('adid', sessionFailureResponseData.adid); addInfoToSend('willRetry', sessionFailureResponseData.willRetry ? 'true' : 'false'); addInfoToSend('jsonResponse', sessionFailureResponseData.jsonResponse); - WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); } ); @@ -305,7 +299,6 @@ AdjustCommandExecutor.prototype.config = function(params) { addInfoToSend('eventToken', eventSuccessResponseData.eventToken); addInfoToSend('callbackId', eventSuccessResponseData.callbackId); addInfoToSend('jsonResponse', eventSuccessResponseData.jsonResponse); - WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); } ); @@ -324,7 +317,6 @@ AdjustCommandExecutor.prototype.config = function(params) { addInfoToSend('callbackId', eventFailureResponseData.callbackId); addInfoToSend('willRetry', eventFailureResponseData.willRetry ? 'true' : 'false'); addInfoToSend('jsonResponse', eventFailureResponseData.jsonResponse); - WebViewJavascriptBridge.callHandler('adjustTLB_sendInfoToServer', basePath, null); } ); @@ -466,7 +458,6 @@ AdjustCommandExecutor.prototype.addSessionCallbackParameter = function(params) { for (var i = 0; i < list.length; i = i+2){ var key = list[i]; var value = list[i+1]; - Adjust.addSessionCallbackParameter(key, value); } }; @@ -477,7 +468,6 @@ AdjustCommandExecutor.prototype.addSessionPartnerParameter = function(params) { for (var i = 0; i < list.length; i = i+2){ var key = list[i]; var value = list[i+1]; - Adjust.addSessionPartnerParameter(key, value); } }; @@ -518,8 +508,7 @@ AdjustCommandExecutor.prototype.openDeeplink = function(params) { Adjust.appWillOpenUrl(deeplink); }; -//Util -//====================== +// Util function getValues(params, key) { if (key in params) { return params[key]; diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m index e5e172913..67f609093 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m @@ -2,8 +2,8 @@ // TestLibraryBridge.m // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. // #import "TestLibraryBridge.h" @@ -12,7 +12,7 @@ @interface TestLibraryBridge () @property WVJBResponseCallback commandExecutorCallback; @property (nonatomic, strong) ATLTestLibrary *testLibrary; -@property (nonatomic, weak) AdjustBridgeRegister * adjustBridgeRegister; +@property (nonatomic, weak) AdjustBridgeRegister *adjustBridgeRegister; @end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h index ca7cb6ecf..6897c6da4 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.h @@ -2,8 +2,8 @@ // UIWebViewController.h // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. // #import diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m index 655908291..60088002d 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/UIWebViewController.m @@ -2,43 +2,47 @@ // UIWebViewController.m // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. // -#import -#import "UIWebViewController.h" -#import "WebViewJavascriptBridge.h" + #import "AdjustBridge.h" #import "TestLibraryBridge.h" +#import "UIWebViewController.h" +#import "WebViewJavascriptBridge.h" +#import @interface UIWebViewController () -@property WebViewJavascriptBridge* bridge; -@property AdjustBridge *adjustBridge; + @property JSContext *jsContext; -@property TestLibraryBridge * testLibraryBridge; +@property AdjustBridge *adjustBridge; +@property WebViewJavascriptBridge *bridge; +@property TestLibraryBridge *testLibraryBridge; @end @implementation UIWebViewController - (void)viewWillAppear:(BOOL)animated { - if (_bridge) { return; } + if (_bridge) { + return; + } - UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; + 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) { + _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]; + 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]; } diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.h deleted file mode 100644 index 76caab67d..000000000 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ViewController.h -// AdjustWebBridgeTestApp -// -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. -// - -#import - -@interface ViewController : UIViewController - - -@end - diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m deleted file mode 100644 index 61349e732..000000000 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/ViewController.m +++ /dev/null @@ -1,23 +0,0 @@ -// -// ViewController.m -// AdjustWebBridgeTestApp -// -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. -// - -#import "ViewController.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. -} - - -@end diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h index b50a3ea24..8b0dc3d09 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.h @@ -2,8 +2,8 @@ // WKWebViewController.h // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. // #import diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m index 5bf301d2f..40f6c4dbf 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/WKWebViewController.m @@ -2,8 +2,8 @@ // WKWebViewController.m // AdjustWebBridgeTestApp // -// Created by Pedro on 06.08.18. -// Copyright © 2018 adjust. All rights reserved. +// Created by Pedro Silva (@nonelse) on 6th August 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. // #import "WKWebViewController.h" @@ -11,17 +11,18 @@ @interface WKWebViewController () -@property WebViewJavascriptBridge* bridge; +@property WebViewJavascriptBridge *bridge; @end - @implementation WKWebViewController - (void)viewWillAppear:(BOOL)animated { - if (_bridge) { return; } + if (_bridge) { + return; + } - WKWebView* webView = [[NSClassFromString(@"WKWebView") alloc] initWithFrame:self.view.bounds]; + WKWebView *webView = [[NSClassFromString(@"WKWebView") alloc] initWithFrame:self.view.bounds]; webView.navigationDelegate = self; [self.view addSubview:webView]; [WebViewJavascriptBridge enableLogging]; @@ -32,7 +33,6 @@ - (void)viewWillAppear:(BOOL)animated { NSLog(@"testObjcCallback called: %@", data); responseCallback(@"Response from testObjcCallback"); }]; - [_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }]; [self renderButtons:webView]; @@ -47,8 +47,8 @@ - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigat NSLog(@"webViewDidFinishLoad"); } -- (void)renderButtons:(WKWebView*)webView { - UIFont* font = [UIFont fontWithName:@"HelveticaNeue" size:12.0]; +- (void)renderButtons:(WKWebView *)webView { + UIFont *font = [UIFont fontWithName:@"HelveticaNeue" size:12.0]; UIButton *callbackButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [callbackButton setTitle:@"Call handler" forState:UIControlStateNormal]; @@ -57,7 +57,7 @@ - (void)renderButtons:(WKWebView*)webView { callbackButton.frame = CGRectMake(10, 400, 100, 35); callbackButton.titleLabel.font = font; - UIButton* reloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; + 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]; @@ -72,9 +72,9 @@ - (void)callHandler:(id)sender { }]; } -- (void)loadExamplePage:(WKWebView*)webView { - NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"ExampleApp" ofType:@"html"]; - NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil]; +- (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]; } From c4e8029a2b2396a4deb850063114a5534f5fed0c Mon Sep 17 00:00:00 2001 From: uerceg Date: Thu, 20 Sep 2018 15:29:49 +0200 Subject: [PATCH 23/36] Various cleanups --- Adjust.xcodeproj/project.pbxproj | 2 +- AdjustBridge/AdjustBridge.m | 36 +++++++++---------- AdjustBridge/AdjustBridgeRegister.h | 4 +-- AdjustBridge/AdjustBridgeRegister.m | 2 +- .../AdjustWebBridgeTestApp/AppDelegate.m | 13 ++++--- 5 files changed, 28 insertions(+), 29 deletions(-) diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index b15b2cb51..6255a8596 100644 --- a/Adjust.xcodeproj/project.pbxproj +++ b/Adjust.xcodeproj/project.pbxproj @@ -1312,9 +1312,9 @@ 96E5E39A18BBB49E008E7B30 /* AdjustTests */ = { isa = PBXGroup; children = ( + 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */, 6F084240200776A000568A31 /* AdjustTestApp.xcodeproj */, 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */, - 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */, 6F0841FB2007749C00568A31 /* AdjustUnitTests */, ); path = AdjustTests; diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index 604e6fe65..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 @@ -75,7 +75,7 @@ - (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData [eventSuccessResponseDataDictionary setValue:eventSuccessResponseData.eventToken forKey:@"eventToken"]; [eventSuccessResponseDataDictionary setValue:eventSuccessResponseData.callbackId forKey:@"callbackId"]; - NSString * jsonResponse = [self convertJsonDictionaryToNSString:eventSuccessResponseData.jsonResponse]; + NSString *jsonResponse = [self convertJsonDictionaryToNSString:eventSuccessResponseData.jsonResponse]; if (jsonResponse == nil) { jsonResponse = @"{}"; } @@ -97,7 +97,7 @@ - (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData { [eventFailureResponseDataDictionary setValue:eventFailureResponseData.callbackId forKey:@"callbackId"]; [eventFailureResponseDataDictionary setValue:[NSNumber numberWithBool:eventFailureResponseData.willRetry] forKey:@"willRetry"]; - NSString * jsonResponse = [self convertJsonDictionaryToNSString:eventFailureResponseData.jsonResponse]; + NSString *jsonResponse = [self convertJsonDictionaryToNSString:eventFailureResponseData.jsonResponse]; if (jsonResponse == nil) { jsonResponse = @"{}"; } @@ -116,7 +116,7 @@ - (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessRespon [sessionSuccessResponseDataDictionary setValue:sessionSuccessResponseData.timeStamp forKey:@"timestamp"]; [sessionSuccessResponseDataDictionary setValue:sessionSuccessResponseData.adid forKey:@"adid"]; - NSString * jsonResponse = [self convertJsonDictionaryToNSString:sessionSuccessResponseData.jsonResponse]; + NSString *jsonResponse = [self convertJsonDictionaryToNSString:sessionSuccessResponseData.jsonResponse]; if (jsonResponse == nil) { jsonResponse = @"{}"; } @@ -136,7 +136,7 @@ - (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseD [sessionFailureResponseDataDictionary setValue:sessionFailureResponseData.adid forKey:@"adid"]; [sessionFailureResponseDataDictionary setValue:[NSNumber numberWithBool:sessionFailureResponseData.willRetry] forKey:@"willRetry"]; - NSString * jsonResponse = [self convertJsonDictionaryToNSString:sessionFailureResponseData.jsonResponse]; + NSString *jsonResponse = [self convertJsonDictionaryToNSString:sessionFailureResponseData.jsonResponse]; if (jsonResponse == nil) { jsonResponse = @"{}"; } @@ -217,12 +217,12 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { 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]) { @@ -306,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]; } @@ -418,6 +417,7 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { if (responseCallback == nil) { return; } + ADJAttribution *attribution = [Adjust attribution]; NSDictionary *attributionDictionary = nil; if (attribution != nil) { @@ -483,7 +483,7 @@ - (void)loadWebViewBridge:(id)webView webViewDelegate:(id)webViewDelegate { NSNumber *noBackoffWait = [data objectForKey:@"noBackoffWait"]; NSNumber *iAdFrameworkEnabled = [data objectForKey:@"iAdFrameworkEnabled"]; - AdjustTestOptions * testOptions = [[AdjustTestOptions alloc] init]; + AdjustTestOptions *testOptions = [[AdjustTestOptions alloc] init]; if ([self isFieldValid:baseUrl]) { testOptions.baseUrl = baseUrl; @@ -554,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]]) { @@ -589,10 +588,10 @@ - (BOOL)isFieldValid:(NSObject *)field { - (NSString *)getFbAppId { NSString *facebookLoggingOverrideAppID = [self getValueFromBundleByKey:@"FacebookLoggingOverrideAppID"]; - if (facebookLoggingOverrideAppID != nil) { return facebookLoggingOverrideAppID; } + return [self getValueFromBundleByKey:@"FacebookAppID"]; } @@ -604,6 +603,7 @@ - (NSString *)getEventTokenFromFbPixelEventName:(NSString *)fbPixelEventName { if (self.fbPixelMapping == nil) { return nil; } + return [self.fbPixelMapping objectForKey:fbPixelEventName]; } @@ -611,11 +611,11 @@ - (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; diff --git a/AdjustBridge/AdjustBridgeRegister.h b/AdjustBridge/AdjustBridgeRegister.h index 571c7cca1..24074cade 100644 --- a/AdjustBridge/AdjustBridgeRegister.h +++ b/AdjustBridge/AdjustBridgeRegister.h @@ -11,12 +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 diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index f90f079c7..42a2eee6d 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -75,7 +75,7 @@ + (NSString *)augmented_js { } + (NSString *)adjust_js { - static NSString * preprocessorJSCode = @__adj_js_func__(;(function() { + static NSString *preprocessorJSCode = @__adj_js_func__(;(function() { if (window.Adjust) { return; } diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m index 58723e8fe..5178c6100 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/AppDelegate.m @@ -12,21 +12,20 @@ @implementation AppDelegate - - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1. Create the UIWebView example - UIWebViewController* UIWebViewExampleController = [[UIWebViewController alloc] init]; - UIWebViewExampleController.tabBarItem.title = @"UIWebView"; + 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]; + [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]; + WKWebViewController *wkWebViewExampleController = [[WKWebViewController alloc] init]; + wkWebViewExampleController.tabBarItem.title = @"WKWebView"; + [tabBarController addChildViewController:wkWebViewExampleController]; } self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; From 7ab0f3d1269d148265db60d5524040992ddf1b12 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 6 Nov 2018 10:00:06 -0800 Subject: [PATCH 24/36] Add deep link exclusion regex --- Adjust/ADJActivityHandler.m | 27 +++++++++++---------------- Adjust/ADJUtil.h | 2 ++ Adjust/ADJUtil.m | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index 74928403b..c4659ab07 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -1258,40 +1258,35 @@ - (void)checkStatusI:(ADJActivityHandler *)selfI - (void)appWillOpenUrlI:(ADJActivityHandler *)selfI url:(NSURL *)url clickTime:(NSDate *)clickTime { - if ([ADJUtil isNull:url]) { + if (![selfI isEnabledI:selfI]) { return; } - - if (![selfI isEnabledI:selfI]) { + if ([ADJUtil isNull:url]) { return; } - - if ([[url absoluteString] length] == 0) { + if (![ADJUtil isDeeplinkValid:url]) { return; } - NSArray* queryArray = [url.query componentsSeparatedByString:@"&"]; + NSArray *queryArray = [url.query componentsSeparatedByString:@"&"]; if (queryArray == nil) { queryArray = @[]; } - NSMutableDictionary* adjustDeepLinks = [NSMutableDictionary dictionary]; + NSMutableDictionary *adjustDeepLinks = [NSMutableDictionary dictionary]; ADJAttribution *deeplinkAttribution = [[ADJAttribution alloc] init]; - - for (NSString* fieldValuePair in queryArray) { + for (NSString *fieldValuePair in queryArray) { [selfI readDeeplinkQueryStringI:selfI queryString:fieldValuePair adjustDeepLinks:adjustDeepLinks attribution:deeplinkAttribution]; } double now = [NSDate.date timeIntervalSince1970]; double lastInterval = now - selfI.activityState.lastActivity; selfI.activityState.lastInterval = lastInterval; - - ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc] - initWithDeviceInfo:selfI.deviceInfo - activityState:selfI.activityState - config:selfI.adjustConfig - sessionParameters:selfI.sessionParameters - createdAt:now]; + ADJPackageBuilder *clickBuilder = [[ADJPackageBuilder alloc] initWithDeviceInfo:selfI.deviceInfo + activityState:selfI.activityState + config:selfI.adjustConfig + sessionParameters:selfI.sessionParameters + createdAt:now]; clickBuilder.deeplinkParameters = adjustDeepLinks; clickBuilder.attribution = deeplinkAttribution; clickBuilder.clickTime = clickTime; 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..771066064 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 @@ -46,6 +47,7 @@ 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,26 @@ + (NSNumber *)readReachabilityFlags { return [reachability currentReachabilityFlags]; } ++ (BOOL)isDeeplinkValid:(NSURL *)url { + if (url == nil) { + return NO; + } + if ([[url absoluteString] length] == 0) { + 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) { From 1e4834e77b7e02020711b6875b1b2bcb44f6abad Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 6 Nov 2018 10:00:15 -0800 Subject: [PATCH 25/36] Project settings update --- Adjust.xcodeproj/project.pbxproj | 2 +- Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme | 2 +- Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkIm.xcscheme | 2 +- Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkTv.xcscheme | 2 +- .../xcshareddata/xcschemes/AdjustSdkWebBridge.xcscheme | 2 +- .../AdjustTestLibrary.xcodeproj/project.pbxproj | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index 6255a8596..f7427b0a2 100644 --- a/Adjust.xcodeproj/project.pbxproj +++ b/Adjust.xcodeproj/project.pbxproj @@ -2172,7 +2172,7 @@ 9679920518BBAE2800394606 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0940; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = "adjust GmbH"; TargetAttributes = { 9615158E1CD2CB2C0022D336 = { 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 @@ Date: Tue, 6 Nov 2018 12:17:40 -0800 Subject: [PATCH 26/36] Package builder cleanup --- Adjust/ADJPackageBuilder.h | 31 ++- Adjust/ADJPackageBuilder.m | 516 ++++++++++++++++++++++--------------- 2 files changed, 329 insertions(+), 218 deletions(-) diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index a8a82194d..05d7dca05 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; + +- (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..e2b2be719 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,386 @@ - (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 { + NSMutableDictionary *parameters = [self getAttributionParameters]; 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 { + 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"]; + + 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 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"]; + + 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 +470,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 +482,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 +490,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 +498,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 +506,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 +527,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 +535,6 @@ + (void)parameters:(NSMutableDictionary *)parameters setNumberInt:(NSNumber *)va if (value == nil) { return; } - [ADJPackageBuilder parameters:parameters setInt:[value intValue] forKey:key]; } From 24e8de27f65f708ce4ab66693e239e53642d3d57 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 6 Nov 2018 12:32:23 -0800 Subject: [PATCH 27/36] Build attribuiton package per request --- Adjust/ADJActivityHandler.h | 9 ++++++- Adjust/ADJActivityHandler.m | 11 -------- Adjust/ADJAdjustFactory.h | 1 - Adjust/ADJAdjustFactory.m | 3 --- Adjust/ADJAttributionHandler.h | 2 -- Adjust/ADJAttributionHandler.m | 49 ++++++++++++++++++++-------------- Adjust/ADJConfig.h | 1 + Adjust/ADJPackageBuilder.h | 2 +- Adjust/ADJPackageBuilder.m | 7 ++--- 9 files changed, 43 insertions(+), 42 deletions(-) diff --git a/Adjust/ADJActivityHandler.h b/Adjust/ADJActivityHandler.h index 31541ef28..08b1fe62c 100644 --- a/Adjust/ADJActivityHandler.h +++ b/Adjust/ADJActivityHandler.h @@ -8,6 +8,9 @@ #import "Adjust.h" #import "ADJResponseData.h" +#import "ADJActivityState.h" +#import "ADJDeviceInfo.h" +#import "ADJSessionParameters.h" @interface ADJInternalState : NSObject @@ -83,7 +86,6 @@ retriesLeft:(int)retriesLeft; - (void)setOfflineMode:(BOOL)offline; -- (ADJInternalState*) internalState; - (void)sendFirstPackages; - (void)addSessionCallbackParameter:(NSString *)key @@ -97,6 +99,11 @@ - (NSString *)getBasePath; - (NSString *)getGdprPath; +- (ADJDeviceInfo *)deviceInfo; +- (ADJActivityState *)activityState; +- (ADJConfig *)adjustConfig; +- (ADJSessionParameters *)sessionParameters; + - (void)teardown; + (void)deleteState; @end diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index c4659ab07..35d587c61 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -8,7 +8,6 @@ #import "ADJActivityPackage.h" #import "ADJActivityHandler.h" -#import "ADJActivityState.h" #import "ADJPackageBuilder.h" #import "ADJPackageHandler.h" #import "ADJLogger.h" @@ -20,7 +19,6 @@ #import "ADJAttributionHandler.h" #import "NSString+ADJAdditions.h" #import "ADJSdkClickHandler.h" -#import "ADJSessionParameters.h" #import "ADJUserDefaults.h" typedef void (^activityHandlerBlockI)(ADJActivityHandler * activityHandler); @@ -727,16 +725,7 @@ - (void)initI:(ADJActivityHandler *)selfI [selfI updatePackagesI:selfI]; } - double now = [NSDate.date timeIntervalSince1970]; - ADJPackageBuilder *attributionBuilder = [[ADJPackageBuilder alloc] - initWithDeviceInfo:selfI.deviceInfo - activityState:selfI.activityState - config:selfI.adjustConfig - sessionParameters:selfI.sessionParameters - createdAt:now]; - ADJActivityPackage *attributionPackage = [attributionBuilder buildAttributionPackage]; selfI.attributionHandler = [ADJAdjustFactory attributionHandlerForActivityHandler:selfI - withAttributionPackage:attributionPackage startsSending:[selfI toSendI:selfI sdkClickHandlerOnly:NO]]; diff --git a/Adjust/ADJAdjustFactory.h b/Adjust/ADJAdjustFactory.h index 9628018b3..fac9982aa 100644 --- a/Adjust/ADJAdjustFactory.h +++ b/Adjust/ADJAdjustFactory.h @@ -36,7 +36,6 @@ + (ADJBackoffStrategy *)sdkClickHandlerBackoffStrategy; + (id)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 05d7dca05..c4be13364 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -43,7 +43,7 @@ - (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource; -- (ADJActivityPackage *)buildAttributionPackage; +- (ADJActivityPackage *)buildAttributionPackage:(NSString *)initiatedBy; - (ADJActivityPackage *)buildGdprPackage; diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index e2b2be719..c0d7675de 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -100,8 +100,8 @@ - (ADJActivityPackage *)buildClickPackage:(NSString *)clickSource { return clickPackage; } -- (ADJActivityPackage *)buildAttributionPackage { - NSMutableDictionary *parameters = [self getAttributionParameters]; +- (ADJActivityPackage *)buildAttributionPackage:(NSString *)initiatedBy { + NSMutableDictionary *parameters = [self getAttributionParameters:initiatedBy]; ADJActivityPackage *attributionPackage = [self defaultActivityPackage]; attributionPackage.path = @"/attribution"; attributionPackage.activityKind = ADJActivityKindAttribution; @@ -398,7 +398,7 @@ - (NSMutableDictionary *)getClickParameters:(NSString *)source { return parameters; } -- (NSMutableDictionary *)getAttributionParameters { +- (NSMutableDictionary *)getAttributionParameters:(NSString *)initiatedBy { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; @@ -409,6 +409,7 @@ - (NSMutableDictionary *)getAttributionParameters { [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.adjustConfig.secretId forKey:@"secret_id"]; From d3c5c98f518f40409a65804414c6119cf490cfc5 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 6 Nov 2018 12:33:03 -0800 Subject: [PATCH 28/36] Fix swift example callbacks --- .../AdjustExample-Swift/AppDelegate.swift | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 { From a7bab99d1a5cf5a00e898ceb2989f22e8cea1b70 Mon Sep 17 00:00:00 2001 From: nonelse Date: Tue, 6 Nov 2018 12:33:29 -0800 Subject: [PATCH 29/36] Update example ios project --- .../AdjustExample-iOS.xcodeproj/project.pbxproj | 4 ++++ .../Assets.xcassets/AppIcon.appiconset/Contents.json | 5 +++++ 2 files changed, 9 insertions(+) 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" : { From ca3f096db8964059555693453260a27c0c078ea4 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 6 Nov 2018 14:10:55 -0800 Subject: [PATCH 30/36] Add iOS frameworks to test app --- .../AdjustTestApp.xcodeproj/project.pbxproj | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 */ From 06c1c859c0696ee1f9e38ee2b86ae311ad8610ed Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 6 Nov 2018 16:20:51 -0800 Subject: [PATCH 31/36] Check regex for nil value --- Adjust/ADJUtil.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 771066064..da38f8c88 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -1286,6 +1286,10 @@ + (BOOL)isDeeplinkValid:(NSURL *)url { 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 From e2aa7b71b4d18e5c459bd40eee6ee7501ab53f88 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 6 Nov 2018 16:25:35 -0800 Subject: [PATCH 32/36] New version 4.16.0 --- Adjust.podspec | 4 ++-- Adjust/ADJUtil.m | 2 +- Adjust/Adjust.h | 2 +- AdjustBridge/AdjustBridgeRegister.m | 2 +- AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m | 2 +- AdjustTests/AdjustUnitTests/ADJPackageFields.m | 2 +- .../AdjustWebBridgeTestApp/TestLibraryBridge.m | 2 +- README.md | 4 ++-- VERSION | 2 +- doc/english/migrate.md | 2 +- doc/english/web_view_migration.md | 2 +- doc/english/web_views.md | 2 +- doc/japanese/migrate_ja.md | 2 +- doc/migrate.md | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) 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/ADJUtil.m b/Adjust/ADJUtil.m index da38f8c88..d2a339b01 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -40,7 +40,7 @@ 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"; 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/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 42a2eee6d..17f4be2da 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -264,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/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/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/TestLibraryBridge.m b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m index 67f609093..6cba8b8f2 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.m @@ -31,7 +31,7 @@ - (id)initWithAdjustBridgeRegister:(AdjustBridgeRegister *)adjustBridgeRegister NSLog(@"TestLibraryBridge adjustTLB_startTestSession"); // self.commandExecutorCallback = responseCallback; [self.adjustBridgeRegister callHandler:@"adjustjs_commandExecutor" data:@"test"]; - [self.testLibrary startTestSession:@"web-bridge4.15.0@ios4.15.0"]; + [self.testLibrary startTestSession:@"web-bridge4.16.0@ios4.16.0"]; }]; [adjustBridgeRegister registerHandler:@"adjustTLB_addInfoToSend" handler:^(id data, WVJBResponseCallback responseCallback) { 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 From da02e663c68466392268113dfa5f75c69a6c6897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uglje=C5=A1a=20Erceg?= Date: Tue, 6 Nov 2018 16:27:50 -0800 Subject: [PATCH 33/36] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index acd387ce3..2b8447c03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 4.16.0 (6th 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. From 1c3abb3e6c896d82086ddfabe67c449f69dfaf1a Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 6 Nov 2018 17:33:20 -0800 Subject: [PATCH 34/36] Add additional params to attribution and GDPR request --- Adjust/ADJPackageBuilder.m | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index c0d7675de..6256eb51e 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -403,14 +403,22 @@ - (NSMutableDictionary *)getAttributionParameters:(NSString *)initiatedBy { [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) { @@ -433,13 +441,21 @@ - (NSMutableDictionary *)getGdprParameters { [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) { From 0eca9de5742b6a39758d492575ef4898e9151b2a Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 7 Nov 2018 17:08:55 -0800 Subject: [PATCH 35/36] Changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b8447c03..846b80ecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### Version 4.16.0 (6th November 2018) +### Version 4.16.0 (7th November 2018) #### Added - Added sending of UUID string with each attribution request. From a7b8ef2518ceaaa8a5705f44873d3654c2cb9a98 Mon Sep 17 00:00:00 2001 From: uerceg Date: Wed, 7 Nov 2018 17:19:54 -0800 Subject: [PATCH 36/36] A bit of web view cleanups --- Adjust.xcodeproj/project.pbxproj | 4 ---- .../WebViewJavascriptBridge/WKWebViewJavascriptBridge.m | 2 +- AdjustSdkWebBridge/AdjustSdkWebBridge.h | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index f7427b0a2..e60441c40 100644 --- a/Adjust.xcodeproj/project.pbxproj +++ b/Adjust.xcodeproj/project.pbxproj @@ -775,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 = ""; }; @@ -1436,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 */, 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