diff --git a/Adjust.podspec b/Adjust.podspec index aeed80e9a..a7b526a5a 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,15 +1,15 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.14.1" + s.version = "4.14.2" 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.14.1" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.14.2" } s.ios.deployment_target = '6.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' - s.ios.weak_framework = 'AdSupport', 'iAd' + s.ios.weak_framework = 'AdSupport', 'iAd', 'CoreTelephony' s.tvos.weak_framework = 'AdSupport' s.requires_arc = true s.default_subspec = 'Core' @@ -32,4 +32,10 @@ Pod::Spec.new do |s| tm.source_files = 'plugin/Trademob/*.{h,m}' tm.dependency 'Adjust/Core' end + + s.subspec 'WebBridge' do |wb| + wb.source_files = 'AdjustBridge/*.{h,m}', 'AdjustBridge/WebViewJavascriptBridge/*.{h,m}' + wb.dependency 'Adjust/Core' + wb.ios.deployment_target = '6.0' + end end diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index 2e653c740..59583bae1 100644 --- a/Adjust.xcodeproj/project.pbxproj +++ b/Adjust.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ /* Begin PBXBuildFile section */ 2067002A1F18BDC700B4FDE1 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9601C19C1A31DD7F00A9AE21 /* CoreTelephony.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 6FA69FD72101E00100FCD3B5 /* AdjustBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FA69FD62101E00100FCD3B5 /* AdjustBridge_JS.m */; }; 6FCC85001F278CF300D6A0ED /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FCC84F71F278CF300D6A0ED /* ADJReachability.m */; }; 6FCC85011F278CF300D6A0ED /* ADJReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FCC84F81F278CF300D6A0ED /* ADJReachability.h */; }; 6FCC85041F27945E00D6A0ED /* ADJReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FCC85021F27944600D6A0ED /* ADJReachability.h */; }; @@ -140,6 +141,87 @@ 96FCC53B1C186426007BBFE1 /* ADJResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 96FCC5371C186426007BBFE1 /* ADJResponseData.m */; }; 96FDD75E1C566C38009C402E /* NSURLSession+NSURLDataWithRequestMocking.m in Sources */ = {isa = PBXBuildFile; fileRef = 96FDD75D1C566C38009C402E /* NSURLSession+NSURLDataWithRequestMocking.m */; }; 9D0C7D3F1D79B3FE009DDF4E /* ADJInitState.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0C7D3E1D79B3FE009DDF4E /* ADJInitState.m */; }; + 9D0E2E06210B570600133B4F /* AdjustSdkWebBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E04210B570600133B4F /* AdjustSdkWebBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2E6B210B575600133B4F /* ADJConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E17210B575600133B4F /* ADJConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2E6C210B575600133B4F /* ADJDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E18210B575600133B4F /* ADJDeviceInfo.m */; }; + 9D0E2E6D210B575600133B4F /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E19210B575600133B4F /* ADJTimerOnce.m */; }; + 9D0E2E6E210B575600133B4F /* ADJAttributionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E1A210B575600133B4F /* ADJAttributionHandler.m */; }; + 9D0E2E6F210B575600133B4F /* Adjust.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E1B210B575600133B4F /* Adjust.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2E70210B575600133B4F /* ADJActivityPackage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E1C210B575600133B4F /* ADJActivityPackage.h */; }; + 9D0E2E71210B575600133B4F /* ADJRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E1D210B575600133B4F /* ADJRequestHandler.m */; }; + 9D0E2E72210B575600133B4F /* ADJSystemProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E1E210B575600133B4F /* ADJSystemProfile.h */; }; + 9D0E2E73210B575600133B4F /* ADJAttribution.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E1F210B575600133B4F /* ADJAttribution.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2E74210B575600133B4F /* ADJKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E20210B575600133B4F /* ADJKeychain.m */; }; + 9D0E2E75210B575600133B4F /* ADJSdkClickHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E21210B575600133B4F /* ADJSdkClickHandler.m */; }; + 9D0E2E76210B575600133B4F /* ADJActivityKind.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E22210B575600133B4F /* ADJActivityKind.h */; }; + 9D0E2E77210B575600133B4F /* ADJEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E23210B575600133B4F /* ADJEvent.m */; }; + 9D0E2E78210B575600133B4F /* ADJPackageHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E24210B575600133B4F /* ADJPackageHandler.h */; }; + 9D0E2E79210B575600133B4F /* ADJPackageBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E25210B575600133B4F /* ADJPackageBuilder.h */; }; + 9D0E2E7A210B575600133B4F /* ADJResponseData.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E26210B575600133B4F /* ADJResponseData.h */; }; + 9D0E2E7B210B575600133B4F /* ADJSessionSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E27210B575600133B4F /* ADJSessionSuccess.m */; }; + 9D0E2E7C210B575600133B4F /* ADJEventFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E28210B575600133B4F /* ADJEventFailure.m */; }; + 9D0E2E7D210B575600133B4F /* ADJAdjustFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E29210B575600133B4F /* ADJAdjustFactory.h */; }; + 9D0E2E7E210B575600133B4F /* ADJEventSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E2A210B575600133B4F /* ADJEventSuccess.m */; }; + 9D0E2E7F210B575600133B4F /* ADJActivityState.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E2B210B575600133B4F /* ADJActivityState.m */; }; + 9D0E2E80210B575600133B4F /* ADJSessionFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E2C210B575600133B4F /* ADJSessionFailure.m */; }; + 9D0E2E81210B575600133B4F /* ADJUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E2D210B575600133B4F /* ADJUtil.h */; }; + 9D0E2E82210B575600133B4F /* ADJReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E2E210B575600133B4F /* ADJReachability.h */; }; + 9D0E2E83210B575600133B4F /* ADJActivityHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E2F210B575600133B4F /* ADJActivityHandler.h */; }; + 9D0E2E84210B575600133B4F /* ADJTimerCycle.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E30210B575600133B4F /* ADJTimerCycle.m */; }; + 9D0E2E85210B575600133B4F /* ADJSessionParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E31210B575600133B4F /* ADJSessionParameters.m */; }; + 9D0E2E86210B575600133B4F /* ADJLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E32210B575600133B4F /* ADJLogger.m */; }; + 9D0E2E87210B575600133B4F /* ADJBackoffStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E33210B575600133B4F /* ADJBackoffStrategy.m */; }; + 9D0E2E88210B575600133B4F /* ADJUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E34210B575600133B4F /* ADJUserDefaults.h */; }; + 9D0E2E89210B575600133B4F /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E35210B575600133B4F /* Adjust.m */; }; + 9D0E2E8A210B575600133B4F /* ADJAttributionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E36210B575600133B4F /* ADJAttributionHandler.h */; }; + 9D0E2E8B210B575600133B4F /* ADJTimerOnce.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E37210B575600133B4F /* ADJTimerOnce.h */; }; + 9D0E2E8C210B575600133B4F /* ADJDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E38210B575600133B4F /* ADJDeviceInfo.h */; }; + 9D0E2E8D210B575600133B4F /* ADJConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E39210B575600133B4F /* ADJConfig.m */; }; + 9D0E2E8E210B575600133B4F /* ADJPackageHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E3A210B575600133B4F /* ADJPackageHandler.m */; }; + 9D0E2E8F210B575600133B4F /* ADJEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E3B210B575600133B4F /* ADJEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2E90210B575600133B4F /* ADJSdkClickHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E3C210B575600133B4F /* ADJSdkClickHandler.h */; }; + 9D0E2E91210B575600133B4F /* ADJActivityKind.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E3D210B575600133B4F /* ADJActivityKind.m */; }; + 9D0E2E92210B575600133B4F /* ADJKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E3E210B575600133B4F /* ADJKeychain.h */; }; + 9D0E2E93210B575600133B4F /* NSString+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E40210B575600133B4F /* NSString+ADJAdditions.m */; }; + 9D0E2E94210B575600133B4F /* UIDevice+ADJAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E41210B575600133B4F /* UIDevice+ADJAdditions.h */; }; + 9D0E2E95210B575600133B4F /* NSData+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E42210B575600133B4F /* NSData+ADJAdditions.m */; }; + 9D0E2E96210B575600133B4F /* NSData+ADJAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E43210B575600133B4F /* NSData+ADJAdditions.h */; }; + 9D0E2E97210B575600133B4F /* UIDevice+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E44210B575600133B4F /* UIDevice+ADJAdditions.m */; }; + 9D0E2E98210B575600133B4F /* NSString+ADJAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E45210B575600133B4F /* NSString+ADJAdditions.h */; }; + 9D0E2E99210B575600133B4F /* ADJAttribution.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E46210B575600133B4F /* ADJAttribution.m */; }; + 9D0E2E9A210B575600133B4F /* ADJSystemProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E47210B575600133B4F /* ADJSystemProfile.m */; }; + 9D0E2E9B210B575600133B4F /* ADJRequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E48210B575600133B4F /* ADJRequestHandler.h */; }; + 9D0E2E9C210B575600133B4F /* ADJActivityPackage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E49210B575600133B4F /* ADJActivityPackage.m */; }; + 9D0E2E9D210B575600133B4F /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E4A210B575600133B4F /* ADJUtil.m */; }; + 9D0E2E9E210B575600133B4F /* ADJSessionFailure.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E4B210B575600133B4F /* ADJSessionFailure.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2E9F210B575600133B4F /* ADJActivityState.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E4C210B575600133B4F /* ADJActivityState.h */; }; + 9D0E2EA0210B575600133B4F /* ADJAdjustFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E4D210B575600133B4F /* ADJAdjustFactory.m */; }; + 9D0E2EA1210B575600133B4F /* ADJEventSuccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E4E210B575600133B4F /* ADJEventSuccess.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EA2210B575600133B4F /* ADJEventFailure.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E4F210B575600133B4F /* ADJEventFailure.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EA3210B575600133B4F /* ADJResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E50210B575600133B4F /* ADJResponseData.m */; }; + 9D0E2EA4210B575600133B4F /* ADJSessionSuccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E51210B575600133B4F /* ADJSessionSuccess.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EA5210B575600133B4F /* ADJPackageBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E52210B575600133B4F /* ADJPackageBuilder.m */; }; + 9D0E2EA6210B575600133B4F /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E53210B575600133B4F /* ADJUserDefaults.m */; }; + 9D0E2EA7210B575600133B4F /* ADJBackoffStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E54210B575600133B4F /* ADJBackoffStrategy.h */; }; + 9D0E2EA8210B575600133B4F /* ADJLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E55210B575600133B4F /* ADJLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EA9210B575600133B4F /* ADJSessionParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E56210B575600133B4F /* ADJSessionParameters.h */; }; + 9D0E2EAB210B575600133B4F /* ADJTimerCycle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E58210B575600133B4F /* ADJTimerCycle.h */; }; + 9D0E2EAC210B575600133B4F /* ADJActivityHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E59210B575600133B4F /* ADJActivityHandler.m */; }; + 9D0E2EAD210B575600133B4F /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E5A210B575600133B4F /* ADJReachability.m */; }; + 9D0E2EAE210B575600133B4F /* AdjustBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E5C210B575600133B4F /* AdjustBridge.m */; }; + 9D0E2EAF210B575600133B4F /* AdjustBridgeRegister.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E5D210B575600133B4F /* AdjustBridgeRegister.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EB0210B575600133B4F /* WebViewJavascriptBridgeBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E5F210B575600133B4F /* WebViewJavascriptBridgeBase.m */; }; + 9D0E2EB1210B575600133B4F /* AdjustBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E60210B575600133B4F /* AdjustBridge_JS.m */; }; + 9D0E2EB2210B575600133B4F /* WKWebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E61210B575600133B4F /* WKWebViewJavascriptBridge.m */; }; + 9D0E2EB3210B575600133B4F /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E62210B575600133B4F /* WebViewJavascriptBridge.m */; }; + 9D0E2EB4210B575600133B4F /* WebViewJavascriptBridge_JS.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E63210B575600133B4F /* WebViewJavascriptBridge_JS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EB5210B575600133B4F /* WebViewJavascriptBridgeBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E64210B575600133B4F /* WebViewJavascriptBridgeBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EB6210B575600133B4F /* AdjustBridge_JS.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E65210B575600133B4F /* AdjustBridge_JS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EB7210B575600133B4F /* WebViewJavascriptBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E66210B575600133B4F /* WebViewJavascriptBridge_JS.m */; }; + 9D0E2EB8210B575600133B4F /* WebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E67210B575600133B4F /* WebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EB9210B575600133B4F /* WKWebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E68210B575600133B4F /* WKWebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EBA210B575600133B4F /* AdjustBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D0E2E69210B575600133B4F /* AdjustBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D0E2EBB210B575600133B4F /* AdjustBridgeRegister.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E2E6A210B575600133B4F /* AdjustBridgeRegister.m */; }; 9D363AC31BDA50FA00B47FE9 /* ADJLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 96E5E37318BBB48A008E7B30 /* ADJLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9D7431EA1EB9F9B700969F14 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D7431E91EB9F9B700969F14 /* main.m */; }; 9D7431ED1EB9F9B700969F14 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D7431EC1EB9F9B700969F14 /* AppDelegate.m */; }; @@ -155,7 +237,74 @@ 9DDF24431F7BE4BA001C1A70 /* ADJUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DD0E9AC1F44690B00B2A759 /* ADJUserDefaults.h */; }; 9DDF24441F7BE4DF001C1A70 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD0E9AD1F44690B00B2A759 /* ADJUserDefaults.m */; }; 9DDF24451F7BE4E7001C1A70 /* ADJUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DD0E9AC1F44690B00B2A759 /* ADJUserDefaults.h */; }; + 9DE354D62100726300D211C9 /* AdjustSdkIm.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DE354D42100726300D211C9 /* AdjustSdkIm.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9DE7C8FD1AE688DA001556E5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DE7C8FC1AE688DA001556E5 /* UIKit.framework */; }; + 9DEAF0F5210072BC005CAEDB /* ADJConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0B1210072BC005CAEDB /* ADJConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF0F6210072BC005CAEDB /* ADJDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0B2210072BC005CAEDB /* ADJDeviceInfo.m */; }; + 9DEAF0F7210072BC005CAEDB /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0B3210072BC005CAEDB /* ADJTimerOnce.m */; }; + 9DEAF0F8210072BC005CAEDB /* ADJAttributionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0B4210072BC005CAEDB /* ADJAttributionHandler.m */; }; + 9DEAF0F9210072BC005CAEDB /* Adjust.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0B5210072BC005CAEDB /* Adjust.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF0FA210072BC005CAEDB /* ADJActivityPackage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0B6210072BC005CAEDB /* ADJActivityPackage.h */; }; + 9DEAF0FB210072BC005CAEDB /* ADJRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0B7210072BC005CAEDB /* ADJRequestHandler.m */; }; + 9DEAF0FC210072BC005CAEDB /* ADJSystemProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0B8210072BC005CAEDB /* ADJSystemProfile.h */; }; + 9DEAF0FD210072BC005CAEDB /* ADJAttribution.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0B9210072BC005CAEDB /* ADJAttribution.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF0FE210072BC005CAEDB /* ADJKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0BA210072BC005CAEDB /* ADJKeychain.m */; }; + 9DEAF0FF210072BC005CAEDB /* ADJSdkClickHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0BB210072BC005CAEDB /* ADJSdkClickHandler.m */; }; + 9DEAF100210072BC005CAEDB /* ADJActivityKind.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0BC210072BC005CAEDB /* ADJActivityKind.h */; }; + 9DEAF101210072BC005CAEDB /* ADJEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0BD210072BC005CAEDB /* ADJEvent.m */; }; + 9DEAF102210072BC005CAEDB /* ADJPackageHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0BE210072BC005CAEDB /* ADJPackageHandler.h */; }; + 9DEAF103210072BC005CAEDB /* ADJPackageBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0BF210072BC005CAEDB /* ADJPackageBuilder.h */; }; + 9DEAF104210072BC005CAEDB /* ADJResponseData.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0C0210072BC005CAEDB /* ADJResponseData.h */; }; + 9DEAF105210072BC005CAEDB /* ADJSessionSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0C1210072BC005CAEDB /* ADJSessionSuccess.m */; }; + 9DEAF106210072BC005CAEDB /* ADJEventFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0C2210072BC005CAEDB /* ADJEventFailure.m */; }; + 9DEAF107210072BC005CAEDB /* ADJAdjustFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0C3210072BC005CAEDB /* ADJAdjustFactory.h */; }; + 9DEAF108210072BC005CAEDB /* ADJEventSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0C4210072BC005CAEDB /* ADJEventSuccess.m */; }; + 9DEAF109210072BC005CAEDB /* ADJActivityState.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0C5210072BC005CAEDB /* ADJActivityState.m */; }; + 9DEAF10A210072BC005CAEDB /* ADJSessionFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0C6210072BC005CAEDB /* ADJSessionFailure.m */; }; + 9DEAF10B210072BC005CAEDB /* ADJUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0C7210072BC005CAEDB /* ADJUtil.h */; }; + 9DEAF10C210072BC005CAEDB /* ADJReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0C8210072BC005CAEDB /* ADJReachability.h */; }; + 9DEAF10D210072BC005CAEDB /* ADJActivityHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0C9210072BC005CAEDB /* ADJActivityHandler.h */; }; + 9DEAF10E210072BC005CAEDB /* ADJTimerCycle.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0CA210072BC005CAEDB /* ADJTimerCycle.m */; }; + 9DEAF10F210072BC005CAEDB /* ADJSessionParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0CB210072BC005CAEDB /* ADJSessionParameters.m */; }; + 9DEAF110210072BC005CAEDB /* ADJLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0CC210072BC005CAEDB /* ADJLogger.m */; }; + 9DEAF111210072BC005CAEDB /* ADJBackoffStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0CD210072BC005CAEDB /* ADJBackoffStrategy.m */; }; + 9DEAF112210072BC005CAEDB /* ADJUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0CE210072BC005CAEDB /* ADJUserDefaults.h */; }; + 9DEAF113210072BC005CAEDB /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0CF210072BC005CAEDB /* Adjust.m */; }; + 9DEAF114210072BC005CAEDB /* ADJAttributionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0D0210072BC005CAEDB /* ADJAttributionHandler.h */; }; + 9DEAF115210072BC005CAEDB /* ADJTimerOnce.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0D1210072BC005CAEDB /* ADJTimerOnce.h */; }; + 9DEAF116210072BC005CAEDB /* ADJDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0D2210072BC005CAEDB /* ADJDeviceInfo.h */; }; + 9DEAF117210072BC005CAEDB /* ADJConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0D3210072BC005CAEDB /* ADJConfig.m */; }; + 9DEAF118210072BC005CAEDB /* ADJPackageHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0D4210072BC005CAEDB /* ADJPackageHandler.m */; }; + 9DEAF119210072BC005CAEDB /* ADJEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0D5210072BC005CAEDB /* ADJEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF11A210072BC005CAEDB /* ADJSdkClickHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0D6210072BC005CAEDB /* ADJSdkClickHandler.h */; }; + 9DEAF11B210072BC005CAEDB /* ADJActivityKind.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0D7210072BC005CAEDB /* ADJActivityKind.m */; }; + 9DEAF11C210072BC005CAEDB /* ADJKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0D8210072BC005CAEDB /* ADJKeychain.h */; }; + 9DEAF11D210072BC005CAEDB /* NSString+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0DA210072BC005CAEDB /* NSString+ADJAdditions.m */; }; + 9DEAF11E210072BC005CAEDB /* UIDevice+ADJAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0DB210072BC005CAEDB /* UIDevice+ADJAdditions.h */; }; + 9DEAF11F210072BC005CAEDB /* NSData+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0DC210072BC005CAEDB /* NSData+ADJAdditions.m */; }; + 9DEAF120210072BC005CAEDB /* NSData+ADJAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0DD210072BC005CAEDB /* NSData+ADJAdditions.h */; }; + 9DEAF121210072BC005CAEDB /* UIDevice+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0DE210072BC005CAEDB /* UIDevice+ADJAdditions.m */; }; + 9DEAF122210072BC005CAEDB /* NSString+ADJAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0DF210072BC005CAEDB /* NSString+ADJAdditions.h */; }; + 9DEAF123210072BC005CAEDB /* ADJAttribution.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0E0210072BC005CAEDB /* ADJAttribution.m */; }; + 9DEAF124210072BC005CAEDB /* ADJSystemProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0E1210072BC005CAEDB /* ADJSystemProfile.m */; }; + 9DEAF125210072BC005CAEDB /* ADJRequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0E2210072BC005CAEDB /* ADJRequestHandler.h */; }; + 9DEAF126210072BC005CAEDB /* ADJActivityPackage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0E3210072BC005CAEDB /* ADJActivityPackage.m */; }; + 9DEAF127210072BC005CAEDB /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0E4210072BC005CAEDB /* ADJUtil.m */; }; + 9DEAF128210072BC005CAEDB /* ADJSessionFailure.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0E5210072BC005CAEDB /* ADJSessionFailure.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF129210072BC005CAEDB /* ADJActivityState.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0E6210072BC005CAEDB /* ADJActivityState.h */; }; + 9DEAF12A210072BC005CAEDB /* ADJAdjustFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0E7210072BC005CAEDB /* ADJAdjustFactory.m */; }; + 9DEAF12B210072BC005CAEDB /* ADJEventSuccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0E8210072BC005CAEDB /* ADJEventSuccess.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF12C210072BC005CAEDB /* ADJEventFailure.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0E9210072BC005CAEDB /* ADJEventFailure.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF12D210072BC005CAEDB /* ADJResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0EA210072BC005CAEDB /* ADJResponseData.m */; }; + 9DEAF12E210072BC005CAEDB /* ADJSessionSuccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0EB210072BC005CAEDB /* ADJSessionSuccess.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF12F210072BC005CAEDB /* ADJPackageBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0EC210072BC005CAEDB /* ADJPackageBuilder.m */; }; + 9DEAF130210072BC005CAEDB /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0ED210072BC005CAEDB /* ADJUserDefaults.m */; }; + 9DEAF131210072BC005CAEDB /* ADJBackoffStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0EE210072BC005CAEDB /* ADJBackoffStrategy.h */; }; + 9DEAF132210072BC005CAEDB /* ADJLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0EF210072BC005CAEDB /* ADJLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DEAF133210072BC005CAEDB /* ADJSessionParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0F0210072BC005CAEDB /* ADJSessionParameters.h */; }; + 9DEAF135210072BC005CAEDB /* ADJTimerCycle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DEAF0F2210072BC005CAEDB /* ADJTimerCycle.h */; }; + 9DEAF136210072BC005CAEDB /* ADJActivityHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0F3210072BC005CAEDB /* ADJActivityHandler.m */; }; + 9DEAF137210072BC005CAEDB /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DEAF0F4210072BC005CAEDB /* ADJReachability.m */; }; 9DF9C8B31D6ED228008E362F /* ADJKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DF9C8B11D6ED228008E362F /* ADJKeychain.h */; }; 9DF9C8B41D6ED228008E362F /* ADJKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DF9C8B21D6ED228008E362F /* ADJKeychain.m */; }; 9DF9C9091D6F3CA5008E362F /* ADJActivityHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DF9C8C91D6F3CA5008E362F /* ADJActivityHandler.h */; }; @@ -214,7 +363,6 @@ 9DF9C9441D6F3CA5008E362F /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DF9C9051D6F3CA5008E362F /* Adjust.m */; }; 9DF9C9451D6F3CA5008E362F /* ADJUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DF9C9061D6F3CA5008E362F /* ADJUtil.h */; }; 9DF9C9461D6F3CA5008E362F /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DF9C9071D6F3CA5008E362F /* ADJUtil.m */; }; - 9DF9C9471D6F3CA5008E362F /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9DF9C9081D6F3CA5008E362F /* Info.plist */; }; 9DFA37B71C0F21D600782607 /* AdjustSdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DFA37B51C0F21D600782607 /* AdjustSdk.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9DFB06131D747070006D48FC /* AdjustSdkTv.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DFB06121D747070006D48FC /* AdjustSdkTv.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9DFB065A1D7470C0006D48FC /* ADJActivityHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DFB061A1D7470C0006D48FC /* ADJActivityHandler.h */; }; @@ -277,7 +425,6 @@ 9DFB06951D7470C0006D48FC /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DFB06561D7470C0006D48FC /* Adjust.m */; }; 9DFB06961D7470C0006D48FC /* ADJUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DFB06571D7470C0006D48FC /* ADJUtil.h */; }; 9DFB06971D7470C0006D48FC /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DFB06581D7470C0006D48FC /* ADJUtil.m */; }; - 9DFB06981D7470C0006D48FC /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9DFB06591D7470C0006D48FC /* Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -302,6 +449,20 @@ remoteGlobalIDString = 9679920C18BBAE2800394606; remoteInfo = Adjust; }; + 9D01680320FF88DE0029CFFF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9D0167FE20FF88DE0029CFFF /* AdjustExample-iMessage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9D01676520FF81280029CFFF; + remoteInfo = "AdjustExample-iMessage"; + }; + 9D01680520FF88DE0029CFFF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9D0167FE20FF88DE0029CFFF /* AdjustExample-iMessage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9D01676F20FF812B0029CFFF; + remoteInfo = "AdjustExample-iMessage MessagesExtension"; + }; 9D449DB11E6ED22900E7E80B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 9D449DAD1E6ED22900E7E80B /* AdjustExample-iOS.xcodeproj */; @@ -392,6 +553,8 @@ /* 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 = ""; }; + 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 = ""; }; @@ -527,8 +690,92 @@ 96FCC5371C186426007BBFE1 /* ADJResponseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJResponseData.m; sourceTree = ""; }; 96FDD75C1C566C38009C402E /* NSURLSession+NSURLDataWithRequestMocking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURLSession+NSURLDataWithRequestMocking.h"; sourceTree = ""; }; 96FDD75D1C566C38009C402E /* NSURLSession+NSURLDataWithRequestMocking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURLSession+NSURLDataWithRequestMocking.m"; sourceTree = ""; }; + 9D0167FE20FF88DE0029CFFF /* AdjustExample-iMessage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "AdjustExample-iMessage.xcodeproj"; path = "examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj"; sourceTree = ""; }; 9D0C7D3D1D79B3FE009DDF4E /* ADJInitState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJInitState.h; sourceTree = ""; }; 9D0C7D3E1D79B3FE009DDF4E /* ADJInitState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJInitState.m; sourceTree = ""; }; + 9D0E2E02210B570600133B4F /* AdjustSdkWebBridge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AdjustSdkWebBridge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D0E2E04210B570600133B4F /* AdjustSdkWebBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdjustSdkWebBridge.h; sourceTree = ""; }; + 9D0E2E05210B570600133B4F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9D0E2E17210B575600133B4F /* ADJConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJConfig.h; sourceTree = ""; }; + 9D0E2E18210B575600133B4F /* ADJDeviceInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJDeviceInfo.m; sourceTree = ""; }; + 9D0E2E19210B575600133B4F /* ADJTimerOnce.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerOnce.m; sourceTree = ""; }; + 9D0E2E1A210B575600133B4F /* ADJAttributionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttributionHandler.m; sourceTree = ""; }; + 9D0E2E1B210B575600133B4F /* Adjust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Adjust.h; sourceTree = ""; }; + 9D0E2E1C210B575600133B4F /* ADJActivityPackage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityPackage.h; sourceTree = ""; }; + 9D0E2E1D210B575600133B4F /* ADJRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJRequestHandler.m; sourceTree = ""; }; + 9D0E2E1E210B575600133B4F /* ADJSystemProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSystemProfile.h; sourceTree = ""; }; + 9D0E2E1F210B575600133B4F /* ADJAttribution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttribution.h; sourceTree = ""; }; + 9D0E2E20210B575600133B4F /* ADJKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJKeychain.m; sourceTree = ""; }; + 9D0E2E21210B575600133B4F /* ADJSdkClickHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSdkClickHandler.m; sourceTree = ""; }; + 9D0E2E22210B575600133B4F /* ADJActivityKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityKind.h; sourceTree = ""; }; + 9D0E2E23210B575600133B4F /* ADJEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEvent.m; sourceTree = ""; }; + 9D0E2E24210B575600133B4F /* ADJPackageHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageHandler.h; sourceTree = ""; }; + 9D0E2E25210B575600133B4F /* ADJPackageBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageBuilder.h; sourceTree = ""; }; + 9D0E2E26210B575600133B4F /* ADJResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJResponseData.h; sourceTree = ""; }; + 9D0E2E27210B575600133B4F /* ADJSessionSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionSuccess.m; sourceTree = ""; }; + 9D0E2E28210B575600133B4F /* ADJEventFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventFailure.m; sourceTree = ""; }; + 9D0E2E29210B575600133B4F /* ADJAdjustFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAdjustFactory.h; sourceTree = ""; }; + 9D0E2E2A210B575600133B4F /* ADJEventSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventSuccess.m; sourceTree = ""; }; + 9D0E2E2B210B575600133B4F /* ADJActivityState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityState.m; sourceTree = ""; }; + 9D0E2E2C210B575600133B4F /* ADJSessionFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionFailure.m; sourceTree = ""; }; + 9D0E2E2D210B575600133B4F /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; + 9D0E2E2E210B575600133B4F /* ADJReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; + 9D0E2E2F210B575600133B4F /* ADJActivityHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityHandler.h; sourceTree = ""; }; + 9D0E2E30210B575600133B4F /* ADJTimerCycle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerCycle.m; sourceTree = ""; }; + 9D0E2E31210B575600133B4F /* ADJSessionParameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionParameters.m; sourceTree = ""; }; + 9D0E2E32210B575600133B4F /* ADJLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJLogger.m; sourceTree = ""; }; + 9D0E2E33210B575600133B4F /* ADJBackoffStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJBackoffStrategy.m; sourceTree = ""; }; + 9D0E2E34210B575600133B4F /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; + 9D0E2E35210B575600133B4F /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; + 9D0E2E36210B575600133B4F /* ADJAttributionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttributionHandler.h; sourceTree = ""; }; + 9D0E2E37210B575600133B4F /* ADJTimerOnce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerOnce.h; sourceTree = ""; }; + 9D0E2E38210B575600133B4F /* ADJDeviceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJDeviceInfo.h; sourceTree = ""; }; + 9D0E2E39210B575600133B4F /* ADJConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJConfig.m; sourceTree = ""; }; + 9D0E2E3A210B575600133B4F /* ADJPackageHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageHandler.m; sourceTree = ""; }; + 9D0E2E3B210B575600133B4F /* ADJEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEvent.h; sourceTree = ""; }; + 9D0E2E3C210B575600133B4F /* ADJSdkClickHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSdkClickHandler.h; sourceTree = ""; }; + 9D0E2E3D210B575600133B4F /* ADJActivityKind.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityKind.m; sourceTree = ""; }; + 9D0E2E3E210B575600133B4F /* ADJKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJKeychain.h; sourceTree = ""; }; + 9D0E2E40210B575600133B4F /* NSString+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+ADJAdditions.m"; sourceTree = ""; }; + 9D0E2E41210B575600133B4F /* UIDevice+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+ADJAdditions.h"; sourceTree = ""; }; + 9D0E2E42210B575600133B4F /* NSData+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ADJAdditions.m"; sourceTree = ""; }; + 9D0E2E43210B575600133B4F /* NSData+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ADJAdditions.h"; sourceTree = ""; }; + 9D0E2E44210B575600133B4F /* UIDevice+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+ADJAdditions.m"; sourceTree = ""; }; + 9D0E2E45210B575600133B4F /* NSString+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+ADJAdditions.h"; sourceTree = ""; }; + 9D0E2E46210B575600133B4F /* ADJAttribution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttribution.m; sourceTree = ""; }; + 9D0E2E47210B575600133B4F /* ADJSystemProfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSystemProfile.m; sourceTree = ""; }; + 9D0E2E48210B575600133B4F /* ADJRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJRequestHandler.h; sourceTree = ""; }; + 9D0E2E49210B575600133B4F /* ADJActivityPackage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityPackage.m; sourceTree = ""; }; + 9D0E2E4A210B575600133B4F /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; + 9D0E2E4B210B575600133B4F /* ADJSessionFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionFailure.h; sourceTree = ""; }; + 9D0E2E4C210B575600133B4F /* ADJActivityState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityState.h; sourceTree = ""; }; + 9D0E2E4D210B575600133B4F /* ADJAdjustFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAdjustFactory.m; sourceTree = ""; }; + 9D0E2E4E210B575600133B4F /* ADJEventSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventSuccess.h; sourceTree = ""; }; + 9D0E2E4F210B575600133B4F /* ADJEventFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventFailure.h; sourceTree = ""; }; + 9D0E2E50210B575600133B4F /* ADJResponseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJResponseData.m; sourceTree = ""; }; + 9D0E2E51210B575600133B4F /* ADJSessionSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionSuccess.h; sourceTree = ""; }; + 9D0E2E52210B575600133B4F /* ADJPackageBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageBuilder.m; sourceTree = ""; }; + 9D0E2E53210B575600133B4F /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; + 9D0E2E54210B575600133B4F /* ADJBackoffStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJBackoffStrategy.h; sourceTree = ""; }; + 9D0E2E55210B575600133B4F /* ADJLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJLogger.h; sourceTree = ""; }; + 9D0E2E56210B575600133B4F /* ADJSessionParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionParameters.h; sourceTree = ""; }; + 9D0E2E58210B575600133B4F /* ADJTimerCycle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerCycle.h; sourceTree = ""; }; + 9D0E2E59210B575600133B4F /* ADJActivityHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityHandler.m; sourceTree = ""; }; + 9D0E2E5A210B575600133B4F /* ADJReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; + 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 = ""; }; + 9D0E2E69210B575600133B4F /* AdjustBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridge.h; sourceTree = ""; }; + 9D0E2E6A210B575600133B4F /* AdjustBridgeRegister.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridgeRegister.m; sourceTree = ""; }; 9D449DAD1E6ED22900E7E80B /* AdjustExample-iOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "AdjustExample-iOS.xcodeproj"; path = "examples/AdjustExample-iOS/AdjustExample-iOS.xcodeproj"; sourceTree = ""; }; 9D449DB31E6ED23400E7E80B /* AdjustExample-iWatch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "AdjustExample-iWatch.xcodeproj"; path = "examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj"; sourceTree = ""; }; 9D449DBF1E6ED23900E7E80B /* AdjustExample-Swift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "AdjustExample-Swift.xcodeproj"; path = "examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj"; sourceTree = ""; }; @@ -544,12 +791,78 @@ 9D7431F41EB9F9B700969F14 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9D7431F71EB9F9B700969F14 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 9D7431F91EB9F9B700969F14 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D75F1841D07460600E5D222 /* adjust_config.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = adjust_config.js; sourceTree = ""; }; - 9D75F1851D07460600E5D222 /* adjust_event.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = adjust_event.js; sourceTree = ""; }; - 9D75F1861D07460600E5D222 /* adjust.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = adjust.js; sourceTree = ""; }; 9DD0E9AC1F44690B00B2A759 /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; 9DD0E9AD1F44690B00B2A759 /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; + 9DE354D22100726300D211C9 /* AdjustSdkIm.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AdjustSdkIm.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9DE354D42100726300D211C9 /* AdjustSdkIm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdjustSdkIm.h; sourceTree = ""; }; + 9DE354D52100726300D211C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9DE7C8FC1AE688DA001556E5 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 9DEAF0B1210072BC005CAEDB /* ADJConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJConfig.h; sourceTree = ""; }; + 9DEAF0B2210072BC005CAEDB /* ADJDeviceInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJDeviceInfo.m; sourceTree = ""; }; + 9DEAF0B3210072BC005CAEDB /* ADJTimerOnce.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerOnce.m; sourceTree = ""; }; + 9DEAF0B4210072BC005CAEDB /* ADJAttributionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttributionHandler.m; sourceTree = ""; }; + 9DEAF0B5210072BC005CAEDB /* Adjust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Adjust.h; sourceTree = ""; }; + 9DEAF0B6210072BC005CAEDB /* ADJActivityPackage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityPackage.h; sourceTree = ""; }; + 9DEAF0B7210072BC005CAEDB /* ADJRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJRequestHandler.m; sourceTree = ""; }; + 9DEAF0B8210072BC005CAEDB /* ADJSystemProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSystemProfile.h; sourceTree = ""; }; + 9DEAF0B9210072BC005CAEDB /* ADJAttribution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttribution.h; sourceTree = ""; }; + 9DEAF0BA210072BC005CAEDB /* ADJKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJKeychain.m; sourceTree = ""; }; + 9DEAF0BB210072BC005CAEDB /* ADJSdkClickHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSdkClickHandler.m; sourceTree = ""; }; + 9DEAF0BC210072BC005CAEDB /* ADJActivityKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityKind.h; sourceTree = ""; }; + 9DEAF0BD210072BC005CAEDB /* ADJEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEvent.m; sourceTree = ""; }; + 9DEAF0BE210072BC005CAEDB /* ADJPackageHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageHandler.h; sourceTree = ""; }; + 9DEAF0BF210072BC005CAEDB /* ADJPackageBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageBuilder.h; sourceTree = ""; }; + 9DEAF0C0210072BC005CAEDB /* ADJResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJResponseData.h; sourceTree = ""; }; + 9DEAF0C1210072BC005CAEDB /* ADJSessionSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionSuccess.m; sourceTree = ""; }; + 9DEAF0C2210072BC005CAEDB /* ADJEventFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventFailure.m; sourceTree = ""; }; + 9DEAF0C3210072BC005CAEDB /* ADJAdjustFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAdjustFactory.h; sourceTree = ""; }; + 9DEAF0C4210072BC005CAEDB /* ADJEventSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventSuccess.m; sourceTree = ""; }; + 9DEAF0C5210072BC005CAEDB /* ADJActivityState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityState.m; sourceTree = ""; }; + 9DEAF0C6210072BC005CAEDB /* ADJSessionFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionFailure.m; sourceTree = ""; }; + 9DEAF0C7210072BC005CAEDB /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; + 9DEAF0C8210072BC005CAEDB /* ADJReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; + 9DEAF0C9210072BC005CAEDB /* ADJActivityHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityHandler.h; sourceTree = ""; }; + 9DEAF0CA210072BC005CAEDB /* ADJTimerCycle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerCycle.m; sourceTree = ""; }; + 9DEAF0CB210072BC005CAEDB /* ADJSessionParameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionParameters.m; sourceTree = ""; }; + 9DEAF0CC210072BC005CAEDB /* ADJLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJLogger.m; sourceTree = ""; }; + 9DEAF0CD210072BC005CAEDB /* ADJBackoffStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJBackoffStrategy.m; sourceTree = ""; }; + 9DEAF0CE210072BC005CAEDB /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; + 9DEAF0CF210072BC005CAEDB /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; + 9DEAF0D0210072BC005CAEDB /* ADJAttributionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttributionHandler.h; sourceTree = ""; }; + 9DEAF0D1210072BC005CAEDB /* ADJTimerOnce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerOnce.h; sourceTree = ""; }; + 9DEAF0D2210072BC005CAEDB /* ADJDeviceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJDeviceInfo.h; sourceTree = ""; }; + 9DEAF0D3210072BC005CAEDB /* ADJConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJConfig.m; sourceTree = ""; }; + 9DEAF0D4210072BC005CAEDB /* ADJPackageHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageHandler.m; sourceTree = ""; }; + 9DEAF0D5210072BC005CAEDB /* ADJEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEvent.h; sourceTree = ""; }; + 9DEAF0D6210072BC005CAEDB /* ADJSdkClickHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSdkClickHandler.h; sourceTree = ""; }; + 9DEAF0D7210072BC005CAEDB /* ADJActivityKind.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityKind.m; sourceTree = ""; }; + 9DEAF0D8210072BC005CAEDB /* ADJKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJKeychain.h; sourceTree = ""; }; + 9DEAF0DA210072BC005CAEDB /* NSString+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+ADJAdditions.m"; sourceTree = ""; }; + 9DEAF0DB210072BC005CAEDB /* UIDevice+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+ADJAdditions.h"; sourceTree = ""; }; + 9DEAF0DC210072BC005CAEDB /* NSData+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ADJAdditions.m"; sourceTree = ""; }; + 9DEAF0DD210072BC005CAEDB /* NSData+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ADJAdditions.h"; sourceTree = ""; }; + 9DEAF0DE210072BC005CAEDB /* UIDevice+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+ADJAdditions.m"; sourceTree = ""; }; + 9DEAF0DF210072BC005CAEDB /* NSString+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+ADJAdditions.h"; sourceTree = ""; }; + 9DEAF0E0210072BC005CAEDB /* ADJAttribution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttribution.m; sourceTree = ""; }; + 9DEAF0E1210072BC005CAEDB /* ADJSystemProfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSystemProfile.m; sourceTree = ""; }; + 9DEAF0E2210072BC005CAEDB /* ADJRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJRequestHandler.h; sourceTree = ""; }; + 9DEAF0E3210072BC005CAEDB /* ADJActivityPackage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityPackage.m; sourceTree = ""; }; + 9DEAF0E4210072BC005CAEDB /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; + 9DEAF0E5210072BC005CAEDB /* ADJSessionFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionFailure.h; sourceTree = ""; }; + 9DEAF0E6210072BC005CAEDB /* ADJActivityState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityState.h; sourceTree = ""; }; + 9DEAF0E7210072BC005CAEDB /* ADJAdjustFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAdjustFactory.m; sourceTree = ""; }; + 9DEAF0E8210072BC005CAEDB /* ADJEventSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventSuccess.h; sourceTree = ""; }; + 9DEAF0E9210072BC005CAEDB /* ADJEventFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventFailure.h; sourceTree = ""; }; + 9DEAF0EA210072BC005CAEDB /* ADJResponseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJResponseData.m; sourceTree = ""; }; + 9DEAF0EB210072BC005CAEDB /* ADJSessionSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionSuccess.h; sourceTree = ""; }; + 9DEAF0EC210072BC005CAEDB /* ADJPackageBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageBuilder.m; sourceTree = ""; }; + 9DEAF0ED210072BC005CAEDB /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; + 9DEAF0EE210072BC005CAEDB /* ADJBackoffStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJBackoffStrategy.h; sourceTree = ""; }; + 9DEAF0EF210072BC005CAEDB /* ADJLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJLogger.h; sourceTree = ""; }; + 9DEAF0F0210072BC005CAEDB /* ADJSessionParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionParameters.h; sourceTree = ""; }; + 9DEAF0F2210072BC005CAEDB /* ADJTimerCycle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerCycle.h; sourceTree = ""; }; + 9DEAF0F3210072BC005CAEDB /* ADJActivityHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityHandler.m; sourceTree = ""; }; + 9DEAF0F4210072BC005CAEDB /* ADJReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; 9DF9C8B11D6ED228008E362F /* ADJKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJKeychain.h; sourceTree = ""; }; 9DF9C8B21D6ED228008E362F /* ADJKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJKeychain.m; sourceTree = ""; }; 9DF9C8C91D6F3CA5008E362F /* ADJActivityHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityHandler.h; sourceTree = ""; }; @@ -612,7 +925,6 @@ 9DF9C9051D6F3CA5008E362F /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; 9DF9C9061D6F3CA5008E362F /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; 9DF9C9071D6F3CA5008E362F /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; - 9DF9C9081D6F3CA5008E362F /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9DFA37AD1C0F219400782607 /* AdjustSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AdjustSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9DFA37B51C0F21D600782607 /* AdjustSdk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustSdk.h; sourceTree = ""; }; 9DFA37B61C0F21D600782607 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -679,7 +991,6 @@ 9DFB06561D7470C0006D48FC /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; 9DFB06571D7470C0006D48FC /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; 9DFB06581D7470C0006D48FC /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; - 9DFB06591D7470C0006D48FC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -718,6 +1029,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9D0E2DFE210B570600133B4F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9D7431E31EB9F9B700969F14 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -725,6 +1043,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9DE354CE2100726300D211C9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9DFA37A91C0F219400782607 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -819,9 +1144,6 @@ 9648C5F61CD1770300A3B049 /* AdjustBridge.m */, 968595EC1D0B25970011CA2B /* AdjustBridgeRegister.h */, 968595ED1D0B25970011CA2B /* AdjustBridgeRegister.m */, - 9D75F1861D07460600E5D222 /* adjust.js */, - 9D75F1851D07460600E5D222 /* adjust_event.js */, - 9D75F1841D07460600E5D222 /* adjust_config.js */, 9648C5E51CD1765E00A3B049 /* WebViewJavascriptBridge */, ); path = AdjustBridge; @@ -830,6 +1152,8 @@ 9648C5E51CD1765E00A3B049 /* WebViewJavascriptBridge */ = { isa = PBXGroup; children = ( + 6FA69FD52101E00100FCD3B5 /* AdjustBridge_JS.h */, + 6FA69FD62101E00100FCD3B5 /* AdjustBridge_JS.m */, 9648C5E61CD1765E00A3B049 /* WebViewJavascriptBridge.h */, 9648C5E71CD1765E00A3B049 /* WebViewJavascriptBridge.m */, 9648C5E81CD1765E00A3B049 /* WebViewJavascriptBridge_JS.h */, @@ -847,8 +1171,10 @@ children = ( 96E5E34B18BBB48A008E7B30 /* Adjust */, 9DFA37AE1C0F219400782607 /* AdjustSdk */, - 9648C5E41CD1765E00A3B049 /* AdjustBridge */, + 9DE354D32100726300D211C9 /* AdjustSdkIm */, 9DFB06111D747070006D48FC /* AdjustSdkTv */, + 9648C5E41CD1765E00A3B049 /* AdjustBridge */, + 9D0E2E03210B570600133B4F /* AdjustSdkWebBridge */, 96E5E39A18BBB49E008E7B30 /* AdjustTests */, 9D449DAC1E6ED20400E7E80B /* Example Apps */, 9679920F18BBAE2800394606 /* Frameworks */, @@ -865,6 +1191,8 @@ 9615158F1CD2CB2C0022D336 /* libAdjustBridge.a */, 9DFB06101D747070006D48FC /* AdjustSdkTv.framework */, 9D7431E61EB9F9B700969F14 /* AdjustExampleTests.app */, + 9DE354D22100726300D211C9 /* AdjustSdkIm.framework */, + 9D0E2E02210B570600133B4F /* AdjustSdkWebBridge.framework */, ); name = Products; sourceTree = ""; @@ -974,6 +1302,136 @@ path = AdjustTests; sourceTree = ""; }; + 9D0167FF20FF88DE0029CFFF /* Products */ = { + isa = PBXGroup; + children = ( + 9D01680420FF88DE0029CFFF /* AdjustExample-iMessage.app */, + 9D01680620FF88DE0029CFFF /* AdjustExample-iMessage MessagesExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 9D0E2E03210B570600133B4F /* AdjustSdkWebBridge */ = { + isa = PBXGroup; + children = ( + 9D0E2E04210B570600133B4F /* AdjustSdkWebBridge.h */, + 9D0E2E16210B575600133B4F /* Adjust */, + 9D0E2E5B210B575600133B4F /* AdjustBridge */, + 9D0E2E05210B570600133B4F /* Info.plist */, + ); + path = AdjustSdkWebBridge; + sourceTree = ""; + }; + 9D0E2E16210B575600133B4F /* Adjust */ = { + isa = PBXGroup; + children = ( + 9D0E2E17210B575600133B4F /* ADJConfig.h */, + 9D0E2E18210B575600133B4F /* ADJDeviceInfo.m */, + 9D0E2E19210B575600133B4F /* ADJTimerOnce.m */, + 9D0E2E1A210B575600133B4F /* ADJAttributionHandler.m */, + 9D0E2E1B210B575600133B4F /* Adjust.h */, + 9D0E2E1C210B575600133B4F /* ADJActivityPackage.h */, + 9D0E2E1D210B575600133B4F /* ADJRequestHandler.m */, + 9D0E2E1E210B575600133B4F /* ADJSystemProfile.h */, + 9D0E2E1F210B575600133B4F /* ADJAttribution.h */, + 9D0E2E20210B575600133B4F /* ADJKeychain.m */, + 9D0E2E21210B575600133B4F /* ADJSdkClickHandler.m */, + 9D0E2E22210B575600133B4F /* ADJActivityKind.h */, + 9D0E2E23210B575600133B4F /* ADJEvent.m */, + 9D0E2E24210B575600133B4F /* ADJPackageHandler.h */, + 9D0E2E25210B575600133B4F /* ADJPackageBuilder.h */, + 9D0E2E26210B575600133B4F /* ADJResponseData.h */, + 9D0E2E27210B575600133B4F /* ADJSessionSuccess.m */, + 9D0E2E28210B575600133B4F /* ADJEventFailure.m */, + 9D0E2E29210B575600133B4F /* ADJAdjustFactory.h */, + 9D0E2E2A210B575600133B4F /* ADJEventSuccess.m */, + 9D0E2E2B210B575600133B4F /* ADJActivityState.m */, + 9D0E2E2C210B575600133B4F /* ADJSessionFailure.m */, + 9D0E2E2D210B575600133B4F /* ADJUtil.h */, + 9D0E2E2E210B575600133B4F /* ADJReachability.h */, + 9D0E2E2F210B575600133B4F /* ADJActivityHandler.h */, + 9D0E2E30210B575600133B4F /* ADJTimerCycle.m */, + 9D0E2E31210B575600133B4F /* ADJSessionParameters.m */, + 9D0E2E32210B575600133B4F /* ADJLogger.m */, + 9D0E2E33210B575600133B4F /* ADJBackoffStrategy.m */, + 9D0E2E34210B575600133B4F /* ADJUserDefaults.h */, + 9D0E2E35210B575600133B4F /* Adjust.m */, + 9D0E2E36210B575600133B4F /* ADJAttributionHandler.h */, + 9D0E2E37210B575600133B4F /* ADJTimerOnce.h */, + 9D0E2E38210B575600133B4F /* ADJDeviceInfo.h */, + 9D0E2E39210B575600133B4F /* ADJConfig.m */, + 9D0E2E3A210B575600133B4F /* ADJPackageHandler.m */, + 9D0E2E3B210B575600133B4F /* ADJEvent.h */, + 9D0E2E3C210B575600133B4F /* ADJSdkClickHandler.h */, + 9D0E2E3D210B575600133B4F /* ADJActivityKind.m */, + 9D0E2E3E210B575600133B4F /* ADJKeychain.h */, + 9D0E2E3F210B575600133B4F /* ADJAdditions */, + 9D0E2E46210B575600133B4F /* ADJAttribution.m */, + 9D0E2E47210B575600133B4F /* ADJSystemProfile.m */, + 9D0E2E48210B575600133B4F /* ADJRequestHandler.h */, + 9D0E2E49210B575600133B4F /* ADJActivityPackage.m */, + 9D0E2E4A210B575600133B4F /* ADJUtil.m */, + 9D0E2E4B210B575600133B4F /* ADJSessionFailure.h */, + 9D0E2E4C210B575600133B4F /* ADJActivityState.h */, + 9D0E2E4D210B575600133B4F /* ADJAdjustFactory.m */, + 9D0E2E4E210B575600133B4F /* ADJEventSuccess.h */, + 9D0E2E4F210B575600133B4F /* ADJEventFailure.h */, + 9D0E2E50210B575600133B4F /* ADJResponseData.m */, + 9D0E2E51210B575600133B4F /* ADJSessionSuccess.h */, + 9D0E2E52210B575600133B4F /* ADJPackageBuilder.m */, + 9D0E2E53210B575600133B4F /* ADJUserDefaults.m */, + 9D0E2E54210B575600133B4F /* ADJBackoffStrategy.h */, + 9D0E2E55210B575600133B4F /* ADJLogger.h */, + 9D0E2E56210B575600133B4F /* ADJSessionParameters.h */, + 9D0E2E58210B575600133B4F /* ADJTimerCycle.h */, + 9D0E2E59210B575600133B4F /* ADJActivityHandler.m */, + 9D0E2E5A210B575600133B4F /* ADJReachability.m */, + ); + path = Adjust; + sourceTree = SOURCE_ROOT; + }; + 9D0E2E3F210B575600133B4F /* ADJAdditions */ = { + isa = PBXGroup; + children = ( + 9D0E2E40210B575600133B4F /* NSString+ADJAdditions.m */, + 9D0E2E41210B575600133B4F /* UIDevice+ADJAdditions.h */, + 9D0E2E42210B575600133B4F /* NSData+ADJAdditions.m */, + 9D0E2E43210B575600133B4F /* NSData+ADJAdditions.h */, + 9D0E2E44210B575600133B4F /* UIDevice+ADJAdditions.m */, + 9D0E2E45210B575600133B4F /* NSString+ADJAdditions.h */, + ); + path = ADJAdditions; + sourceTree = ""; + }; + 9D0E2E5B210B575600133B4F /* AdjustBridge */ = { + isa = PBXGroup; + children = ( + 9D0E2E69210B575600133B4F /* AdjustBridge.h */, + 9D0E2E5C210B575600133B4F /* AdjustBridge.m */, + 9D0E2E5D210B575600133B4F /* AdjustBridgeRegister.h */, + 9D0E2E6A210B575600133B4F /* AdjustBridgeRegister.m */, + 9D0E2E5E210B575600133B4F /* WebViewJavascriptBridge */, + ); + path = AdjustBridge; + sourceTree = SOURCE_ROOT; + }; + 9D0E2E5E210B575600133B4F /* WebViewJavascriptBridge */ = { + isa = PBXGroup; + children = ( + 9D0E2E65210B575600133B4F /* AdjustBridge_JS.h */, + 9D0E2E60210B575600133B4F /* AdjustBridge_JS.m */, + 9D0E2E63210B575600133B4F /* WebViewJavascriptBridge_JS.h */, + 9D0E2E66210B575600133B4F /* WebViewJavascriptBridge_JS.m */, + 9D0E2E67210B575600133B4F /* WebViewJavascriptBridge.h */, + 9D0E2E62210B575600133B4F /* WebViewJavascriptBridge.m */, + 9D0E2E68210B575600133B4F /* WKWebViewJavascriptBridge.h */, + 9D0E2E61210B575600133B4F /* WKWebViewJavascriptBridge.m */, + 9D0E2E64210B575600133B4F /* WebViewJavascriptBridgeBase.h */, + 9D0E2E5F210B575600133B4F /* WebViewJavascriptBridgeBase.m */, + ); + path = WebViewJavascriptBridge; + sourceTree = ""; + }; 9D449DAC1E6ED20400E7E80B /* Example Apps */ = { isa = PBXGroup; children = ( @@ -982,6 +1440,7 @@ 9D449DCB1E6ED24400E7E80B /* AdjustExample-WebView.xcodeproj */, 9D449DC51E6ED24000E7E80B /* AdjustExample-tvOS.xcodeproj */, 9D449DB31E6ED23400E7E80B /* AdjustExample-iWatch.xcodeproj */, + 9D0167FE20FF88DE0029CFFF /* AdjustExample-iMessage.xcodeproj */, ); name = "Example Apps"; sourceTree = ""; @@ -1052,6 +1511,97 @@ name = "Supporting Files"; sourceTree = ""; }; + 9DE354D32100726300D211C9 /* AdjustSdkIm */ = { + isa = PBXGroup; + children = ( + 9DE354D42100726300D211C9 /* AdjustSdkIm.h */, + 9DEAF0B0210072BC005CAEDB /* Adjust */, + 9DE354D52100726300D211C9 /* Info.plist */, + ); + path = AdjustSdkIm; + sourceTree = ""; + }; + 9DEAF0B0210072BC005CAEDB /* Adjust */ = { + isa = PBXGroup; + children = ( + 9DEAF0B1210072BC005CAEDB /* ADJConfig.h */, + 9DEAF0B2210072BC005CAEDB /* ADJDeviceInfo.m */, + 9DEAF0B3210072BC005CAEDB /* ADJTimerOnce.m */, + 9DEAF0B4210072BC005CAEDB /* ADJAttributionHandler.m */, + 9DEAF0B5210072BC005CAEDB /* Adjust.h */, + 9DEAF0B6210072BC005CAEDB /* ADJActivityPackage.h */, + 9DEAF0B7210072BC005CAEDB /* ADJRequestHandler.m */, + 9DEAF0B8210072BC005CAEDB /* ADJSystemProfile.h */, + 9DEAF0B9210072BC005CAEDB /* ADJAttribution.h */, + 9DEAF0BA210072BC005CAEDB /* ADJKeychain.m */, + 9DEAF0BB210072BC005CAEDB /* ADJSdkClickHandler.m */, + 9DEAF0BC210072BC005CAEDB /* ADJActivityKind.h */, + 9DEAF0BD210072BC005CAEDB /* ADJEvent.m */, + 9DEAF0BE210072BC005CAEDB /* ADJPackageHandler.h */, + 9DEAF0BF210072BC005CAEDB /* ADJPackageBuilder.h */, + 9DEAF0C0210072BC005CAEDB /* ADJResponseData.h */, + 9DEAF0C1210072BC005CAEDB /* ADJSessionSuccess.m */, + 9DEAF0C2210072BC005CAEDB /* ADJEventFailure.m */, + 9DEAF0C3210072BC005CAEDB /* ADJAdjustFactory.h */, + 9DEAF0C4210072BC005CAEDB /* ADJEventSuccess.m */, + 9DEAF0C5210072BC005CAEDB /* ADJActivityState.m */, + 9DEAF0C6210072BC005CAEDB /* ADJSessionFailure.m */, + 9DEAF0C7210072BC005CAEDB /* ADJUtil.h */, + 9DEAF0C8210072BC005CAEDB /* ADJReachability.h */, + 9DEAF0C9210072BC005CAEDB /* ADJActivityHandler.h */, + 9DEAF0CA210072BC005CAEDB /* ADJTimerCycle.m */, + 9DEAF0CB210072BC005CAEDB /* ADJSessionParameters.m */, + 9DEAF0CC210072BC005CAEDB /* ADJLogger.m */, + 9DEAF0CD210072BC005CAEDB /* ADJBackoffStrategy.m */, + 9DEAF0CE210072BC005CAEDB /* ADJUserDefaults.h */, + 9DEAF0CF210072BC005CAEDB /* Adjust.m */, + 9DEAF0D0210072BC005CAEDB /* ADJAttributionHandler.h */, + 9DEAF0D1210072BC005CAEDB /* ADJTimerOnce.h */, + 9DEAF0D2210072BC005CAEDB /* ADJDeviceInfo.h */, + 9DEAF0D3210072BC005CAEDB /* ADJConfig.m */, + 9DEAF0D4210072BC005CAEDB /* ADJPackageHandler.m */, + 9DEAF0D5210072BC005CAEDB /* ADJEvent.h */, + 9DEAF0D6210072BC005CAEDB /* ADJSdkClickHandler.h */, + 9DEAF0D7210072BC005CAEDB /* ADJActivityKind.m */, + 9DEAF0D8210072BC005CAEDB /* ADJKeychain.h */, + 9DEAF0D9210072BC005CAEDB /* ADJAdditions */, + 9DEAF0E0210072BC005CAEDB /* ADJAttribution.m */, + 9DEAF0E1210072BC005CAEDB /* ADJSystemProfile.m */, + 9DEAF0E2210072BC005CAEDB /* ADJRequestHandler.h */, + 9DEAF0E3210072BC005CAEDB /* ADJActivityPackage.m */, + 9DEAF0E4210072BC005CAEDB /* ADJUtil.m */, + 9DEAF0E5210072BC005CAEDB /* ADJSessionFailure.h */, + 9DEAF0E6210072BC005CAEDB /* ADJActivityState.h */, + 9DEAF0E7210072BC005CAEDB /* ADJAdjustFactory.m */, + 9DEAF0E8210072BC005CAEDB /* ADJEventSuccess.h */, + 9DEAF0E9210072BC005CAEDB /* ADJEventFailure.h */, + 9DEAF0EA210072BC005CAEDB /* ADJResponseData.m */, + 9DEAF0EB210072BC005CAEDB /* ADJSessionSuccess.h */, + 9DEAF0EC210072BC005CAEDB /* ADJPackageBuilder.m */, + 9DEAF0ED210072BC005CAEDB /* ADJUserDefaults.m */, + 9DEAF0EE210072BC005CAEDB /* ADJBackoffStrategy.h */, + 9DEAF0EF210072BC005CAEDB /* ADJLogger.h */, + 9DEAF0F0210072BC005CAEDB /* ADJSessionParameters.h */, + 9DEAF0F2210072BC005CAEDB /* ADJTimerCycle.h */, + 9DEAF0F3210072BC005CAEDB /* ADJActivityHandler.m */, + 9DEAF0F4210072BC005CAEDB /* ADJReachability.m */, + ); + path = Adjust; + sourceTree = SOURCE_ROOT; + }; + 9DEAF0D9210072BC005CAEDB /* ADJAdditions */ = { + isa = PBXGroup; + children = ( + 9DEAF0DA210072BC005CAEDB /* NSString+ADJAdditions.m */, + 9DEAF0DB210072BC005CAEDB /* UIDevice+ADJAdditions.h */, + 9DEAF0DC210072BC005CAEDB /* NSData+ADJAdditions.m */, + 9DEAF0DD210072BC005CAEDB /* NSData+ADJAdditions.h */, + 9DEAF0DE210072BC005CAEDB /* UIDevice+ADJAdditions.m */, + 9DEAF0DF210072BC005CAEDB /* NSString+ADJAdditions.h */, + ); + path = ADJAdditions; + sourceTree = ""; + }; 9DF9C8C81D6F3CA5008E362F /* Adjust */ = { isa = PBXGroup; children = ( @@ -1114,7 +1664,6 @@ 96B671131D788F4A0090A023 /* ADJSessionParameters.m */, 6FCC85021F27944600D6A0ED /* ADJReachability.h */, 6FCC85031F27944600D6A0ED /* ADJReachability.m */, - 9DF9C9081D6F3CA5008E362F /* Info.plist */, ); path = Adjust; sourceTree = SOURCE_ROOT; @@ -1214,7 +1763,6 @@ 96B671171D788F7A0090A023 /* ADJSessionParameters.m */, 6FCC85071F27948700D6A0ED /* ADJReachability.h */, 6FCC85061F27948700D6A0ED /* ADJReachability.m */, - 9DFB06591D7470C0006D48FC /* Info.plist */, ); path = Adjust; sourceTree = SOURCE_ROOT; @@ -1275,6 +1823,95 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9D0E2DFF210B570600133B4F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D0E2E06210B570600133B4F /* AdjustSdkWebBridge.h in Headers */, + 9D0E2EBA210B575600133B4F /* AdjustBridge.h in Headers */, + 9D0E2EAF210B575600133B4F /* AdjustBridgeRegister.h in Headers */, + 9D0E2EB6210B575600133B4F /* AdjustBridge_JS.h in Headers */, + 9D0E2EB8210B575600133B4F /* WebViewJavascriptBridge.h in Headers */, + 9D0E2EB9210B575600133B4F /* WKWebViewJavascriptBridge.h in Headers */, + 9D0E2EB4210B575600133B4F /* WebViewJavascriptBridge_JS.h in Headers */, + 9D0E2EB5210B575600133B4F /* WebViewJavascriptBridgeBase.h in Headers */, + 9D0E2E6F210B575600133B4F /* Adjust.h in Headers */, + 9D0E2E6B210B575600133B4F /* ADJConfig.h in Headers */, + 9D0E2E8F210B575600133B4F /* ADJEvent.h in Headers */, + 9D0E2E73210B575600133B4F /* ADJAttribution.h in Headers */, + 9D0E2EA2210B575600133B4F /* ADJEventFailure.h in Headers */, + 9D0E2EA1210B575600133B4F /* ADJEventSuccess.h in Headers */, + 9D0E2E9E210B575600133B4F /* ADJSessionFailure.h in Headers */, + 9D0E2EA4210B575600133B4F /* ADJSessionSuccess.h in Headers */, + 9D0E2EA8210B575600133B4F /* ADJLogger.h in Headers */, + 9D0E2E92210B575600133B4F /* ADJKeychain.h in Headers */, + 9D0E2E7D210B575600133B4F /* ADJAdjustFactory.h in Headers */, + 9D0E2E76210B575600133B4F /* ADJActivityKind.h in Headers */, + 9D0E2E88210B575600133B4F /* ADJUserDefaults.h in Headers */, + 9D0E2E8B210B575600133B4F /* ADJTimerOnce.h in Headers */, + 9D0E2EAB210B575600133B4F /* ADJTimerCycle.h in Headers */, + 9D0E2E7A210B575600133B4F /* ADJResponseData.h in Headers */, + 9D0E2E98210B575600133B4F /* NSString+ADJAdditions.h in Headers */, + 9D0E2EA7210B575600133B4F /* ADJBackoffStrategy.h in Headers */, + 9D0E2E8C210B575600133B4F /* ADJDeviceInfo.h in Headers */, + 9D0E2E90210B575600133B4F /* ADJSdkClickHandler.h in Headers */, + 9D0E2E81210B575600133B4F /* ADJUtil.h in Headers */, + 9D0E2E78210B575600133B4F /* ADJPackageHandler.h in Headers */, + 9D0E2EA9210B575600133B4F /* ADJSessionParameters.h in Headers */, + 9D0E2E9B210B575600133B4F /* ADJRequestHandler.h in Headers */, + 9D0E2E94210B575600133B4F /* UIDevice+ADJAdditions.h in Headers */, + 9D0E2E72210B575600133B4F /* ADJSystemProfile.h in Headers */, + 9D0E2E83210B575600133B4F /* ADJActivityHandler.h in Headers */, + 9D0E2E79210B575600133B4F /* ADJPackageBuilder.h in Headers */, + 9D0E2E70210B575600133B4F /* ADJActivityPackage.h in Headers */, + 9D0E2E82210B575600133B4F /* ADJReachability.h in Headers */, + 9D0E2E8A210B575600133B4F /* ADJAttributionHandler.h in Headers */, + 9D0E2E96210B575600133B4F /* NSData+ADJAdditions.h in Headers */, + 9D0E2E9F210B575600133B4F /* ADJActivityState.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9DE354CF2100726300D211C9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9DE354D62100726300D211C9 /* AdjustSdkIm.h in Headers */, + 9DEAF11C210072BC005CAEDB /* ADJKeychain.h in Headers */, + 9DEAF0F9210072BC005CAEDB /* Adjust.h in Headers */, + 9DEAF0F5210072BC005CAEDB /* ADJConfig.h in Headers */, + 9DEAF119210072BC005CAEDB /* ADJEvent.h in Headers */, + 9DEAF0FD210072BC005CAEDB /* ADJAttribution.h in Headers */, + 9DEAF12E210072BC005CAEDB /* ADJSessionSuccess.h in Headers */, + 9DEAF128210072BC005CAEDB /* ADJSessionFailure.h in Headers */, + 9DEAF12B210072BC005CAEDB /* ADJEventSuccess.h in Headers */, + 9DEAF12C210072BC005CAEDB /* ADJEventFailure.h in Headers */, + 9DEAF132210072BC005CAEDB /* ADJLogger.h in Headers */, + 9DEAF107210072BC005CAEDB /* ADJAdjustFactory.h in Headers */, + 9DEAF100210072BC005CAEDB /* ADJActivityKind.h in Headers */, + 9DEAF112210072BC005CAEDB /* ADJUserDefaults.h in Headers */, + 9DEAF115210072BC005CAEDB /* ADJTimerOnce.h in Headers */, + 9DEAF135210072BC005CAEDB /* ADJTimerCycle.h in Headers */, + 9DEAF104210072BC005CAEDB /* ADJResponseData.h in Headers */, + 9DEAF122210072BC005CAEDB /* NSString+ADJAdditions.h in Headers */, + 9DEAF131210072BC005CAEDB /* ADJBackoffStrategy.h in Headers */, + 9DEAF116210072BC005CAEDB /* ADJDeviceInfo.h in Headers */, + 9DEAF11A210072BC005CAEDB /* ADJSdkClickHandler.h in Headers */, + 9DEAF10B210072BC005CAEDB /* ADJUtil.h in Headers */, + 9DEAF102210072BC005CAEDB /* ADJPackageHandler.h in Headers */, + 9DEAF133210072BC005CAEDB /* ADJSessionParameters.h in Headers */, + 9DEAF125210072BC005CAEDB /* ADJRequestHandler.h in Headers */, + 9DEAF11E210072BC005CAEDB /* UIDevice+ADJAdditions.h in Headers */, + 9DEAF0FC210072BC005CAEDB /* ADJSystemProfile.h in Headers */, + 9DEAF10D210072BC005CAEDB /* ADJActivityHandler.h in Headers */, + 9DEAF103210072BC005CAEDB /* ADJPackageBuilder.h in Headers */, + 9DEAF0FA210072BC005CAEDB /* ADJActivityPackage.h in Headers */, + 9DEAF10C210072BC005CAEDB /* ADJReachability.h in Headers */, + 9DEAF114210072BC005CAEDB /* ADJAttributionHandler.h in Headers */, + 9DEAF120210072BC005CAEDB /* NSData+ADJAdditions.h in Headers */, + 9DEAF129210072BC005CAEDB /* ADJActivityState.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9DFA37AA1C0F219400782607 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1415,6 +2052,24 @@ productReference = 9679921D18BBAE2800394606 /* AdjustTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 9D0E2E01210B570600133B4F /* AdjustSdkWebBridge */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D0E2E15210B570600133B4F /* Build configuration list for PBXNativeTarget "AdjustSdkWebBridge" */; + buildPhases = ( + 9D0E2DFD210B570600133B4F /* Sources */, + 9D0E2DFE210B570600133B4F /* Frameworks */, + 9D0E2DFF210B570600133B4F /* Headers */, + 9D0E2E00210B570600133B4F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AdjustSdkWebBridge; + productName = AdjustSdkWebBridge; + productReference = 9D0E2E02210B570600133B4F /* AdjustSdkWebBridge.framework */; + productType = "com.apple.product-type.framework"; + }; 9D7431E51EB9F9B700969F14 /* AdjustExampleTests */ = { isa = PBXNativeTarget; buildConfigurationList = 9D7432031EB9F9B700969F14 /* Build configuration list for PBXNativeTarget "AdjustExampleTests" */; @@ -1432,6 +2087,24 @@ productReference = 9D7431E61EB9F9B700969F14 /* AdjustExampleTests.app */; productType = "com.apple.product-type.application"; }; + 9DE354D12100726300D211C9 /* AdjustSdkIm */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9DE354E52100726300D211C9 /* Build configuration list for PBXNativeTarget "AdjustSdkIm" */; + buildPhases = ( + 9DE354CD2100726300D211C9 /* Sources */, + 9DE354CE2100726300D211C9 /* Frameworks */, + 9DE354CF2100726300D211C9 /* Headers */, + 9DE354D02100726300D211C9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AdjustSdkIm; + productName = AdjustSdkIm; + productReference = 9DE354D22100726300D211C9 /* AdjustSdkIm.framework */; + productType = "com.apple.product-type.framework"; + }; 9DFA37AC1C0F219400782607 /* AdjustSdk */ = { isa = PBXNativeTarget; buildConfigurationList = 9DFA37B21C0F219400782607 /* Build configuration list for PBXNativeTarget "AdjustSdk" */; @@ -1440,7 +2113,6 @@ 9DFA37A91C0F219400782607 /* Frameworks */, 9DFA37AA1C0F219400782607 /* Headers */, 9DFA37AB1C0F219400782607 /* Resources */, - 9DB1EE2C1C635DC0007FCFFC /* Copy Dynamic Framework */, ); buildRules = ( ); @@ -1458,8 +2130,6 @@ 9DFB060B1D747070006D48FC /* Sources */, 9DFB060C1D747070006D48FC /* Frameworks */, 9DFB060D1D747070006D48FC /* Headers */, - 9DFB060E1D747070006D48FC /* Resources */, - 9DFB06991D747BBE006D48FC /* Copy tvOS Framework */, ); buildRules = ( ); @@ -1488,11 +2158,21 @@ 96BCFBE71AC99FBD005A65C5 = { CreatedOnToolsVersion = 6.2; }; + 9D0E2E01210B570600133B4F = { + CreatedOnToolsVersion = 9.4.1; + DevelopmentTeam = QGUGW9AUMK; + ProvisioningStyle = Automatic; + }; 9D7431E51EB9F9B700969F14 = { CreatedOnToolsVersion = 8.3.2; DevelopmentTeam = QGUGW9AUMK; ProvisioningStyle = Automatic; }; + 9DE354D12100726300D211C9 = { + CreatedOnToolsVersion = 9.4.1; + DevelopmentTeam = QGUGW9AUMK; + ProvisioningStyle = Automatic; + }; 9DFA37AC1C0F219400782607 = { CreatedOnToolsVersion = 7.1.1; }; @@ -1513,6 +2193,10 @@ productRefGroup = 9679920E18BBAE2800394606 /* Products */; projectDirPath = ""; projectReferences = ( + { + ProductGroup = 9D0167FF20FF88DE0029CFFF /* Products */; + ProjectRef = 9D0167FE20FF88DE0029CFFF /* AdjustExample-iMessage.xcodeproj */; + }, { ProductGroup = 9D449DAE1E6ED22900E7E80B /* Products */; ProjectRef = 9D449DAD1E6ED22900E7E80B /* AdjustExample-iOS.xcodeproj */; @@ -1545,10 +2229,12 @@ projectRoot = ""; targets = ( 9679920C18BBAE2800394606 /* Adjust */, + 9615158E1CD2CB2C0022D336 /* AdjustBridge */, + 96BCFBE71AC99FBD005A65C5 /* AdjustStatic */, 9DFA37AC1C0F219400782607 /* AdjustSdk */, + 9DE354D12100726300D211C9 /* AdjustSdkIm */, 9DFB060F1D747070006D48FC /* AdjustSdkTv */, - 96BCFBE71AC99FBD005A65C5 /* AdjustStatic */, - 9615158E1CD2CB2C0022D336 /* AdjustBridge */, + 9D0E2E01210B570600133B4F /* AdjustSdkWebBridge */, 9679921C18BBAE2800394606 /* AdjustTests */, 9D7431E51EB9F9B700969F14 /* AdjustExampleTests */, ); @@ -1570,6 +2256,20 @@ remoteRef = 6F084244200776A100568A31 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D01680420FF88DE0029CFFF /* AdjustExample-iMessage.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "AdjustExample-iMessage.app"; + remoteRef = 9D01680320FF88DE0029CFFF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9D01680620FF88DE0029CFFF /* AdjustExample-iMessage MessagesExtension.appex */ = { + isa = PBXReferenceProxy; + fileType = "wrapper.app-extension"; + path = "AdjustExample-iMessage MessagesExtension.appex"; + remoteRef = 9D01680520FF88DE0029CFFF /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 9D449DB21E6ED22900E7E80B /* AdjustExample-iOS.app */ = { isa = PBXReferenceProxy; fileType = wrapper.application; @@ -1630,6 +2330,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9D0E2E00210B570600133B4F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9D7431E41EB9F9B700969F14 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1640,39 +2347,23 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9DFA37AB1C0F219400782607 /* Resources */ = { + 9DE354D02100726300D211C9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9DF9C9471D6F3CA5008E362F /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9DFB060E1D747070006D48FC /* Resources */ = { + 9DFA37AB1C0F219400782607 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9DFB06981D7470C0006D48FC /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 9DB1EE2C1C635DC0007FCFFC /* Copy Dynamic Framework */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Dynamic Framework"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\n\n# If we're already inside this script then die\nif [ -n \"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS\" ]; then\nexit 0\nfi\nexport RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1\n\nRW_FRAMEWORK_NAME=${PROJECT_NAME}\nRW_FRAMEWORK_LOCATION=\"${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}Sdk.framework\"\n\n# Copy the framework to the project directory\n# ditto \"${RW_FRAMEWORK_LOCATION}\" \"${SRCROOT}/Frameworks/Dynamic/${RW_FRAMEWORK_NAME}Sdk.framework\""; - }; 9DE7C9011AE68F68001556E5 /* Build Framework */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1699,21 +2390,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\n# If we're already inside this script then die\nif [ -n \"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS\" ]; then\nexit 0\nfi\nexport RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1\n\nRW_FRAMEWORK_NAME=${PROJECT_NAME}\nRW_INPUT_STATIC_LIB=\"lib${PROJECT_NAME}.a\"\nRW_FRAMEWORK_LOCATION=\"${BUILT_PRODUCTS_DIR}/Static/${RW_FRAMEWORK_NAME}Sdk.framework\"\n\nfunction build_static_library {\n echo \"1\"\n echo \"${BUILD_DIR}\"\n # Will rebuild the static library as specified\n # build_static_library sdk\n xcrun xcodebuild -project \"${PROJECT_FILE_PATH}\" \\\n -target \"${TARGET_NAME}\" \\\n -configuration \"${CONFIGURATION}\" \\\n -sdk \"${1}\" \\\n ONLY_ACTIVE_ARCH=NO \\\n BUILD_DIR=\"${BUILD_DIR}\" \\\n OBJROOT=\"${OBJROOT}\" \\\n BUILD_ROOT=\"${BUILD_ROOT}\" \\\n SYMROOT=\"${SYMROOT}\" $ACTION\n}\n\nfunction make_fat_library {\n # Will smash 2 static libs together\n # make_fat_library in1 in2 out\n xcrun lipo -create \"${1}\" \"${2}\" -output \"${3}\"\n}\n\n# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name\nif [[ \"$SDK_NAME\" =~ ([A-Za-z]+) ]]; then\nRW_SDK_PLATFORM=${BASH_REMATCH[1]}\nelse\necho \"Could not find platform name from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 2 - Extract the version from the SDK\nif [[ \"$SDK_NAME\" =~ ([0-9]+.*$) ]]; then\nRW_SDK_VERSION=${BASH_REMATCH[1]}\nelse\necho \"Could not find sdk version from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 3 - Determine the other platform\nif [ \"$RW_SDK_PLATFORM\" == \"iphoneos\" ]; then\nRW_OTHER_PLATFORM=iphonesimulator\nelse\nRW_OTHER_PLATFORM=iphoneos\nfi\n\n# 4 - Find the build directory\nif [[ \"$BUILT_PRODUCTS_DIR\" =~ (.*)$RW_SDK_PLATFORM$ ]]; then\nRW_OTHER_BUILT_PRODUCTS_DIR=\"${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}\"\nelse\necho \"Could not find other platform build directory.\"\nexit 1\nfi\n\n# Build the other platform.\nbuild_static_library \"${RW_OTHER_PLATFORM}${RW_SDK_VERSION}\"\n\n# If we're currently building for iphonesimulator, then need to rebuild\n# to ensure that we get both i386 and x86_64\nif [ \"$RW_SDK_PLATFORM\" == \"iphonesimulator\" ]; then\nbuild_static_library \"${SDK_NAME}\"\nfi\n\n# Join the 2 static libs into 1 and push into the .framework\nmake_fat_library \"${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk\"\n\n# Ensure that the framework is present in both platform's build directories\ncp -a \"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/Static/${RW_FRAMEWORK_NAME}Sdk.framework/Versions/A/${RW_FRAMEWORK_NAME}Sdk\"\n\n# Copy the framework to the project directory\nditto \"${RW_FRAMEWORK_LOCATION}\" \"${SRCROOT}/Frameworks/Static/${RW_FRAMEWORK_NAME}Sdk.framework\""; - }; - 9DFB06991D747BBE006D48FC /* Copy tvOS Framework */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy tvOS Framework"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\n\n# If we're already inside this script then die\nif [ -n \"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS\" ]; then\nexit 0\nfi\nexport RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1\n\nRW_FRAMEWORK_NAME=${PROJECT_NAME}\nRW_FRAMEWORK_LOCATION=\"${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}SdkTv.framework\"\n\n# Copy the framework to the tvOS framework directory\n# ditto \"${RW_FRAMEWORK_LOCATION}\" \"${SRCROOT}/Frameworks/tvOS/${RW_FRAMEWORK_NAME}SdkTv.framework\""; + shellScript = "set -e\n\n# If we're already inside this script then die\nif [ -n \"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS\" ]; then\nexit 0\nfi\nexport RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1\n\nRW_FRAMEWORK_NAME=${PROJECT_NAME}\nRW_INPUT_STATIC_LIB=\"lib${PROJECT_NAME}.a\"\nRW_FRAMEWORK_LOCATION=\"${BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework\"\n\nfunction build_static_library {\n echo \"1\"\n echo \"${BUILD_DIR}\"\n # Will rebuild the static library as specified\n # build_static_library sdk\n xcrun xcodebuild -project \"${PROJECT_FILE_PATH}\" \\\n -target \"${TARGET_NAME}\" \\\n -configuration \"${CONFIGURATION}\" \\\n -sdk \"${1}\" \\\n ONLY_ACTIVE_ARCH=NO \\\n BUILD_DIR=\"${BUILD_DIR}\" \\\n OBJROOT=\"${OBJROOT}\" \\\n BUILD_ROOT=\"${BUILD_ROOT}\" \\\n SYMROOT=\"${SYMROOT}\" $ACTION\n}\n\nfunction make_fat_library {\n # Will smash 2 static libs together\n # make_fat_library in1 in2 out\n xcrun lipo -create \"${1}\" \"${2}\" -output \"${3}\"\n}\n\n# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name\nif [[ \"$SDK_NAME\" =~ ([A-Za-z]+) ]]; then\nRW_SDK_PLATFORM=${BASH_REMATCH[1]}\nelse\necho \"Could not find platform name from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 2 - Extract the version from the SDK\nif [[ \"$SDK_NAME\" =~ ([0-9]+.*$) ]]; then\nRW_SDK_VERSION=${BASH_REMATCH[1]}\nelse\necho \"Could not find sdk version from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 3 - Determine the other platform\nif [ \"$RW_SDK_PLATFORM\" == \"iphoneos\" ]; then\nRW_OTHER_PLATFORM=iphonesimulator\nelse\nRW_OTHER_PLATFORM=iphoneos\nfi\n\n# 4 - Find the build directory\nif [[ \"$BUILT_PRODUCTS_DIR\" =~ (.*)$RW_SDK_PLATFORM$ ]]; then\nRW_OTHER_BUILT_PRODUCTS_DIR=\"${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}\"\nelse\necho \"Could not find other platform build directory.\"\nexit 1\nfi\n\n# Build the other platform.\nbuild_static_library \"${RW_OTHER_PLATFORM}${RW_SDK_VERSION}\"\n\n# If we're currently building for iphonesimulator, then need to rebuild\n# to ensure that we get both i386 and x86_64\nif [ \"$RW_SDK_PLATFORM\" == \"iphonesimulator\" ]; then\nbuild_static_library \"${SDK_NAME}\"\nfi\n\n# Join the 2 static libs into 1 and push into the .framework\nmake_fat_library \"${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk\"\n\n# Ensure that the framework is present in both platform's build directories\ncp -a \"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework/Versions/A/${RW_FRAMEWORK_NAME}Sdk\"\n\n# Copy the framework to the project directory\nditto \"${RW_FRAMEWORK_LOCATION}\" \"${SRCROOT}/Frameworks/static/${RW_FRAMEWORK_NAME}Sdk.framework\""; }; /* End PBXShellScriptBuildPhase section */ @@ -1727,6 +2404,7 @@ 961515A31CD2CB9D0022D336 /* WebViewJavascriptBridge.m in Sources */, 961515A41CD2CBA20022D336 /* WebViewJavascriptBridge_JS.m in Sources */, 961515A61CD2CBAC0022D336 /* WKWebViewJavascriptBridge.m in Sources */, + 6FA69FD72101E00100FCD3B5 /* AdjustBridge_JS.m in Sources */, 961515A51CD2CBA80022D336 /* WebViewJavascriptBridgeBase.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1805,6 +2483,53 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9D0E2DFD210B570600133B4F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D0E2E93210B575600133B4F /* NSString+ADJAdditions.m in Sources */, + 9D0E2EB3210B575600133B4F /* WebViewJavascriptBridge.m in Sources */, + 9D0E2E7E210B575600133B4F /* ADJEventSuccess.m in Sources */, + 9D0E2E7C210B575600133B4F /* ADJEventFailure.m in Sources */, + 9D0E2E7F210B575600133B4F /* ADJActivityState.m in Sources */, + 9D0E2EB0210B575600133B4F /* WebViewJavascriptBridgeBase.m in Sources */, + 9D0E2E95210B575600133B4F /* NSData+ADJAdditions.m in Sources */, + 9D0E2E75210B575600133B4F /* ADJSdkClickHandler.m in Sources */, + 9D0E2E85210B575600133B4F /* ADJSessionParameters.m in Sources */, + 9D0E2E9D210B575600133B4F /* ADJUtil.m in Sources */, + 9D0E2E89210B575600133B4F /* Adjust.m in Sources */, + 9D0E2EAC210B575600133B4F /* ADJActivityHandler.m in Sources */, + 9D0E2E74210B575600133B4F /* ADJKeychain.m in Sources */, + 9D0E2E80210B575600133B4F /* ADJSessionFailure.m in Sources */, + 9D0E2EB2210B575600133B4F /* WKWebViewJavascriptBridge.m in Sources */, + 9D0E2E97210B575600133B4F /* UIDevice+ADJAdditions.m in Sources */, + 9D0E2E7B210B575600133B4F /* ADJSessionSuccess.m in Sources */, + 9D0E2EB7210B575600133B4F /* WebViewJavascriptBridge_JS.m in Sources */, + 9D0E2E9A210B575600133B4F /* ADJSystemProfile.m in Sources */, + 9D0E2E71210B575600133B4F /* ADJRequestHandler.m in Sources */, + 9D0E2E91210B575600133B4F /* ADJActivityKind.m in Sources */, + 9D0E2E9C210B575600133B4F /* ADJActivityPackage.m in Sources */, + 9D0E2E8E210B575600133B4F /* ADJPackageHandler.m in Sources */, + 9D0E2E86210B575600133B4F /* ADJLogger.m in Sources */, + 9D0E2E6D210B575600133B4F /* ADJTimerOnce.m in Sources */, + 9D0E2E77210B575600133B4F /* ADJEvent.m in Sources */, + 9D0E2E8D210B575600133B4F /* ADJConfig.m in Sources */, + 9D0E2EB1210B575600133B4F /* AdjustBridge_JS.m in Sources */, + 9D0E2E6E210B575600133B4F /* ADJAttributionHandler.m in Sources */, + 9D0E2E87210B575600133B4F /* ADJBackoffStrategy.m in Sources */, + 9D0E2EBB210B575600133B4F /* AdjustBridgeRegister.m in Sources */, + 9D0E2E84210B575600133B4F /* ADJTimerCycle.m in Sources */, + 9D0E2E6C210B575600133B4F /* ADJDeviceInfo.m in Sources */, + 9D0E2EA5210B575600133B4F /* ADJPackageBuilder.m in Sources */, + 9D0E2EAD210B575600133B4F /* ADJReachability.m in Sources */, + 9D0E2E99210B575600133B4F /* ADJAttribution.m in Sources */, + 9D0E2EA3210B575600133B4F /* ADJResponseData.m in Sources */, + 9D0E2EA0210B575600133B4F /* ADJAdjustFactory.m in Sources */, + 9D0E2EA6210B575600133B4F /* ADJUserDefaults.m in Sources */, + 9D0E2EAE210B575600133B4F /* AdjustBridge.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9D7431E21EB9F9B700969F14 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1815,6 +2540,46 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9DE354CD2100726300D211C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9DEAF11D210072BC005CAEDB /* NSString+ADJAdditions.m in Sources */, + 9DEAF108210072BC005CAEDB /* ADJEventSuccess.m in Sources */, + 9DEAF106210072BC005CAEDB /* ADJEventFailure.m in Sources */, + 9DEAF109210072BC005CAEDB /* ADJActivityState.m in Sources */, + 9DEAF11F210072BC005CAEDB /* NSData+ADJAdditions.m in Sources */, + 9DEAF0FF210072BC005CAEDB /* ADJSdkClickHandler.m in Sources */, + 9DEAF10F210072BC005CAEDB /* ADJSessionParameters.m in Sources */, + 9DEAF127210072BC005CAEDB /* ADJUtil.m in Sources */, + 9DEAF113210072BC005CAEDB /* Adjust.m in Sources */, + 9DEAF136210072BC005CAEDB /* ADJActivityHandler.m in Sources */, + 9DEAF0FE210072BC005CAEDB /* ADJKeychain.m in Sources */, + 9DEAF10A210072BC005CAEDB /* ADJSessionFailure.m in Sources */, + 9DEAF121210072BC005CAEDB /* UIDevice+ADJAdditions.m in Sources */, + 9DEAF105210072BC005CAEDB /* ADJSessionSuccess.m in Sources */, + 9DEAF124210072BC005CAEDB /* ADJSystemProfile.m in Sources */, + 9DEAF0FB210072BC005CAEDB /* ADJRequestHandler.m in Sources */, + 9DEAF11B210072BC005CAEDB /* ADJActivityKind.m in Sources */, + 9DEAF126210072BC005CAEDB /* ADJActivityPackage.m in Sources */, + 9DEAF118210072BC005CAEDB /* ADJPackageHandler.m in Sources */, + 9DEAF110210072BC005CAEDB /* ADJLogger.m in Sources */, + 9DEAF0F7210072BC005CAEDB /* ADJTimerOnce.m in Sources */, + 9DEAF101210072BC005CAEDB /* ADJEvent.m in Sources */, + 9DEAF117210072BC005CAEDB /* ADJConfig.m in Sources */, + 9DEAF0F8210072BC005CAEDB /* ADJAttributionHandler.m in Sources */, + 9DEAF111210072BC005CAEDB /* ADJBackoffStrategy.m in Sources */, + 9DEAF10E210072BC005CAEDB /* ADJTimerCycle.m in Sources */, + 9DEAF0F6210072BC005CAEDB /* ADJDeviceInfo.m in Sources */, + 9DEAF12F210072BC005CAEDB /* ADJPackageBuilder.m in Sources */, + 9DEAF137210072BC005CAEDB /* ADJReachability.m in Sources */, + 9DEAF123210072BC005CAEDB /* ADJAttribution.m in Sources */, + 9DEAF12D210072BC005CAEDB /* ADJResponseData.m in Sources */, + 9DEAF12A210072BC005CAEDB /* ADJAdjustFactory.m in Sources */, + 9DEAF130210072BC005CAEDB /* ADJUserDefaults.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9DFA37A81C0F219400782607 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2186,6 +2951,74 @@ }; name = Release; }; + 9D0E2E07210B570600133B4F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = QGUGW9AUMK; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = AdjustSdkWebBridge/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.AdjustSdkWebBridge; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9D0E2E08210B570600133B4F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = QGUGW9AUMK; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = AdjustSdkWebBridge/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.AdjustSdkWebBridge; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 9D7431FA1EB9F9B700969F14 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2226,6 +3059,80 @@ }; name = Release; }; + 9DE354D72100726300D211C9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = QGUGW9AUMK; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "ADJUST_IM=1", + "$(inherited)", + ); + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = AdjustSdkIm/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.AdjustSdkIm; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9DE354D82100726300D211C9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = QGUGW9AUMK; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_PREPROCESSOR_DEFINITIONS = "ADJUST_IM=1"; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = AdjustSdkIm/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.AdjustSdkIm; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 9DFA37B31C0F219400782607 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2396,6 +3303,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 9D0E2E15210B570600133B4F /* Build configuration list for PBXNativeTarget "AdjustSdkWebBridge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D0E2E07210B570600133B4F /* Debug */, + 9D0E2E08210B570600133B4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 9D7432031EB9F9B700969F14 /* Build configuration list for PBXNativeTarget "AdjustExampleTests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2405,6 +3321,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 9DE354E52100726300D211C9 /* Build configuration list for PBXNativeTarget "AdjustSdkIm" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9DE354D72100726300D211C9 /* Debug */, + 9DE354D82100726300D211C9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 9DFA37B21C0F219400782607 /* Build configuration list for PBXNativeTarget "AdjustSdk" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkIm.xcscheme b/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkIm.xcscheme new file mode 100644 index 000000000..847e3002e --- /dev/null +++ b/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkIm.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkWebBridge.xcscheme b/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkWebBridge.xcscheme new file mode 100644 index 000000000..c0c8e5378 --- /dev/null +++ b/Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkWebBridge.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index a43974dd1..c54f58dcc 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -452,6 +452,11 @@ - (void)sendIad3ClickPackage:(ADJActivityHandler *)selfI if (![selfI isEnabledI:selfI]) { return; } + + if (ADJAdjustFactory.iAdFrameworkEnabled == NO) { + [self.logger verbose:@"Sending iAd details to server suppressed."]; + return; + } double now = [NSDate.date timeIntervalSince1970]; if (selfI.activityState != nil) { diff --git a/Adjust/ADJAdjustFactory.h b/Adjust/ADJAdjustFactory.h index e8d73160d..9628018b3 100644 --- a/Adjust/ADJAdjustFactory.h +++ b/Adjust/ADJAdjustFactory.h @@ -42,6 +42,7 @@ + (NSTimeInterval)maxDelayStart; + (NSString *)baseUrl; + (NSString *)gdprUrl; ++ (BOOL)iAdFrameworkEnabled; + (void)setPackageHandler:(id)packageHandler; + (void)setRequestHandler:(id)requestHandler; @@ -56,6 +57,7 @@ + (void)setPackageHandlerBackoffStrategy:(ADJBackoffStrategy *)backoffStrategy; + (void)setSdkClickHandlerBackoffStrategy:(ADJBackoffStrategy *)backoffStrategy; + (void)setTesting:(BOOL)testing; ++ (void)setiAdFrameworkEnabled:(BOOL)iAdFrameworkEnabled; + (void)setMaxDelayStart:(NSTimeInterval)maxDelayStart; + (void)setBaseUrl:(NSString *)baseUrl; + (void)setGdprUrl:(NSString *)gdprUrl; diff --git a/Adjust/ADJAdjustFactory.m b/Adjust/ADJAdjustFactory.m index 5f515eecf..d85a2ae70 100644 --- a/Adjust/ADJAdjustFactory.m +++ b/Adjust/ADJAdjustFactory.m @@ -23,6 +23,7 @@ static ADJBackoffStrategy * sdkClickHandlerBackoffStrategy = nil; static BOOL internalTesting = NO; static NSTimeInterval internalMaxDelayStart = -1; +static BOOL internaliAdFrameworkEnabled = YES; static NSString * const kBaseUrl = @"https://app.adjust.com"; static NSString * internalBaseUrl = @"https://app.adjust.com"; @@ -141,6 +142,10 @@ + (BOOL)testing { return internalTesting; } ++ (BOOL)iAdFrameworkEnabled { + return internaliAdFrameworkEnabled; +} + + (NSTimeInterval)maxDelayStart { if (internalMaxDelayStart < 0) { return 10.0; // 10 seconds @@ -208,6 +213,10 @@ + (void)setTesting:(BOOL)testing { internalTesting = testing; } ++ (void)setiAdFrameworkEnabled:(BOOL)iAdFrameworkEnabled { + internaliAdFrameworkEnabled = iAdFrameworkEnabled; +} + + (void)setMaxDelayStart:(NSTimeInterval)maxDelayStart { internalMaxDelayStart = maxDelayStart; } @@ -242,5 +251,6 @@ + (void)teardown:(BOOL)deleteState { internalMaxDelayStart = -1; internalBaseUrl = kBaseUrl; internalGdprUrl = kGdprUrl; + internaliAdFrameworkEnabled = YES; } @end diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 215d16604..c9bec4d62 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -41,7 +41,7 @@ static NSString *userAgent = nil; -static NSString * const kClientSdk = @"ios4.14.1"; +static NSString * const kClientSdk = @"ios4.14.2"; static NSString * const kDeeplinkParam = @"deep_link="; static NSString * const kSchemeDelimiter = @"://"; static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; @@ -1181,7 +1181,12 @@ + (BOOL)isMainThread { } + (BOOL)isInactive { +#if ADJUST_IM + // Assume iMessage extension app can't be started from background. + return NO; +#else return [[UIApplication sharedApplication] applicationState] != UIApplicationStateActive; +#endif } + (void)launchInMainThreadWithInactive:(isInactiveInjected)isInactiveblock { @@ -1298,6 +1303,10 @@ + (BOOL)deleteFileInPath:(NSString *)filePath { } + (void)launchDeepLinkMain:(NSURL *)deepLinkUrl { +#if ADJUST_IM + // No deep linking in iMessage extension apps. + return; +#else UIApplication *sharedUIApplication = [UIApplication sharedApplication]; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundeclared-selector" @@ -1340,6 +1349,7 @@ + (void)launchDeepLinkMain:(NSURL *)deepLinkUrl { [ADJAdjustFactory.logger error:@"Unable to open deep link (%@)", deepLinkUrl]; } } +#endif } + (NSString *)convertDeviceToken:(NSData *)deviceToken { diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index a6fc0c5eb..e87a18ac8 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust // -// V4.14.1 +// V4.14.2 // Created by Christian Wellenbrock (wellle) on 23rd July 2013. // Copyright © 2012-2017 Adjust GmbH. All rights reserved. // @@ -24,6 +24,7 @@ @property (nonatomic, assign) BOOL teardown; @property (nonatomic, assign) BOOL deleteState; @property (nonatomic, assign) BOOL noBackoffWait; +@property (nonatomic, assign) BOOL iAdFrameworkEnabled; @end diff --git a/Adjust/Adjust.m b/Adjust/Adjust.m index 860a775ae..a1869bfa9 100644 --- a/Adjust/Adjust.m +++ b/Adjust/Adjust.m @@ -441,6 +441,8 @@ - (void)setTestOptions:(AdjustTestOptions *)testOptions { [ADJAdjustFactory setSdkClickHandlerBackoffStrategy:[ADJBackoffStrategy backoffStrategyWithType:ADJNoWait]]; [ADJAdjustFactory setPackageHandlerBackoffStrategy:[ADJBackoffStrategy backoffStrategyWithType:ADJNoWait]]; } + + [ADJAdjustFactory setiAdFrameworkEnabled:testOptions.iAdFrameworkEnabled]; } #pragma mark - Private & helper methods diff --git a/AdjustBridge/AdjustBridge.h b/AdjustBridge/AdjustBridge.h index e10420273..6e52a84bc 100644 --- a/AdjustBridge/AdjustBridge.h +++ b/AdjustBridge/AdjustBridge.h @@ -1,25 +1,24 @@ // // AdjustBridge.h -// Adjust +// Adjust SDK // -// Created by Pedro Filipe on 27/04/16. -// Copyright © 2016 adjust GmbH. All rights reserved. +// Created by Pedro Filipe (@nonelse) on 27th April 2016. +// Copyright © 2016-2018 Adjust GmbH. All rights reserved. // #import #import #import -#import "WKWebViewJavascriptBridge.h" -#import "WebViewJavascriptBridge.h" +#import "AdjustBridgeRegister.h" @interface AdjustBridge : NSObject +@property (nonatomic, strong, readonly) id bridgeRegister; + - (void)loadUIWebViewBridge:(WVJB_WEBVIEW_TYPE *)webView; - (void)loadWKWebViewBridge:(WKWebView *)wkWebView; - (void)loadUIWebViewBridge:(WVJB_WEBVIEW_TYPE *)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE *)webViewDelegate; - (void)loadWKWebViewBridge:(WKWebView *)wkWebView wkWebViewDelegate:(id)wkWebViewDelegate; -- (void)sendDeeplinkToWebView:(NSURL *)deeplink; - @end diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index 35d1fff0e..c5ebe3333 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -1,42 +1,24 @@ // // AdjustBridge.m -// Adjust +// Adjust SDK // -// Created by Pedro Filipe on 27/04/16. -// Copyright © 2016 adjust GmbH. All rights reserved. +// Created by Pedro Filipe (@nonelse) on 27th April 2016. +// Copyright © 2016-2018 Adjust GmbH. All rights reserved. // #import "Adjust.h" -// #import // In case of erroneous import statement try with: // #import -// (depends how you import the adjust SDK to your app) +// (depends how you import the Adjust SDK to your app) #import "AdjustBridge.h" -#import "AdjustBridgeRegister.h" +#import "ADJAdjustFactory.h" #import "WebViewJavascriptBridge.h" #import "WKWebViewJavascriptBridge.h" -#define KEY_APP_TOKEN @"appToken" -#define KEY_ENVIRONMENT @"environment" -#define KEY_LOG_LEVEL @"logLevel" -#define KEY_SDK_PREFIX @"sdkPrefix" -#define KEY_DEFAULT_TRACKER @"defaultTracker" -#define KEY_SEND_IN_BACKGROUND @"sendInBackground" -#define KEY_OPEN_DEFERRED_DEEPLINK @"openDeferredDeeplink" -#define KEY_EVENT_BUFFERING_ENABLED @"eventBufferingEnabled" -#define KEY_WEB_VIEW_LOGGING_ENABLED @"webViewLoggingEnabled" -#define KEY_EVENT_TOKEN @"eventToken" -#define KEY_REVENUE @"revenue" -#define KEY_CURRENCY @"currency" -#define KEY_TRANSACTION_ID @"transactionId" -#define KEY_CALLBACK_PARAMETERS @"callbackParameters" -#define KEY_PARTNER_PARAMETERS @"partnerParameters" - @interface AdjustBridge() @property BOOL openDeferredDeeplink; - @property WVJBResponseCallback deeplinkCallback; @property WVJBResponseCallback attributionCallback; @property WVJBResponseCallback eventSuccessCallback; @@ -45,8 +27,6 @@ @interface AdjustBridge() @property WVJBResponseCallback sessionFailureCallback; @property WVJBResponseCallback deferredDeeplinkCallback; -@property (nonatomic, strong) id bridgeRegister; - @end @implementation AdjustBridge @@ -55,15 +35,12 @@ @implementation AdjustBridge - (id)init { self = [super init]; - if (self == nil) { return nil; } - self.bridgeRegister = nil; - + _bridgeRegister = nil; self.openDeferredDeeplink = YES; - self.attributionCallback = nil; self.eventSuccessCallback = nil; self.eventFailureCallback = nil; @@ -79,7 +56,6 @@ - (void)adjustAttributionChanged:(ADJAttribution *)attribution { if (self.attributionCallback == nil) { return; } - self.attributionCallback([attribution dictionary]); } @@ -89,13 +65,11 @@ - (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData } NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; - - [dictionary setValue:eventSuccessResponseData.eventToken forKey:@"eventToken"]; + [dictionary setValue:eventSuccessResponseData.message forKey:@"message"]; [dictionary setValue:eventSuccessResponseData.timeStamp forKey:@"timestamp"]; [dictionary setValue:eventSuccessResponseData.adid forKey:@"adid"]; - [dictionary setValue:eventSuccessResponseData.message forKey:@"message"]; + [dictionary setValue:eventSuccessResponseData.eventToken forKey:@"eventToken"]; [dictionary setValue:eventSuccessResponseData.jsonResponse forKey:@"jsonResponse"]; - self.eventSuccessCallback(dictionary); } @@ -105,14 +79,12 @@ - (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData { } NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; - - [dictionary setValue:eventFailureResponseData.eventToken forKey:@"eventToken"]; + [dictionary setValue:eventFailureResponseData.message forKey:@"message"]; [dictionary setValue:eventFailureResponseData.timeStamp forKey:@"timestamp"]; [dictionary setValue:eventFailureResponseData.adid forKey:@"adid"]; - [dictionary setValue:eventFailureResponseData.message forKey:@"message"]; - [dictionary setValue:eventFailureResponseData.jsonResponse forKey:@"jsonResponse"]; + [dictionary setValue:eventFailureResponseData.eventToken forKey:@"eventToken"]; [dictionary setValue:[NSNumber numberWithBool:eventFailureResponseData.willRetry] forKey:@"willRetry"]; - + [dictionary setValue:eventFailureResponseData.jsonResponse forKey:@"jsonResponse"]; self.eventFailureCallback(dictionary); } @@ -122,12 +94,10 @@ - (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessRespon } NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; - + [dictionary setValue:sessionSuccessResponseData.message forKey:@"message"]; [dictionary setValue:sessionSuccessResponseData.timeStamp forKey:@"timestamp"]; [dictionary setValue:sessionSuccessResponseData.adid forKey:@"adid"]; - [dictionary setValue:sessionSuccessResponseData.message forKey:@"message"]; [dictionary setValue:sessionSuccessResponseData.jsonResponse forKey:@"jsonResponse"]; - self.sessionSuccessCallback(dictionary); } @@ -137,13 +107,11 @@ - (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseD } NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; - + [dictionary setValue:sessionFailureResponseData.message forKey:@"message"]; [dictionary setValue:sessionFailureResponseData.timeStamp forKey:@"timestamp"]; [dictionary setValue:sessionFailureResponseData.adid forKey:@"adid"]; - [dictionary setValue:sessionFailureResponseData.message forKey:@"message"]; - [dictionary setValue:sessionFailureResponseData.jsonResponse forKey:@"jsonResponse"]; [dictionary setValue:[NSNumber numberWithBool:sessionFailureResponseData.willRetry] forKey:@"willRetry"]; - + [dictionary setValue:sessionFailureResponseData.jsonResponse forKey:@"jsonResponse"]; self.sessionFailureCallback(dictionary); } @@ -151,7 +119,6 @@ - (BOOL)adjustDeeplinkResponse:(NSURL *)deeplink { if (self.deferredDeeplinkCallback) { self.deferredDeeplinkCallback([deeplink absoluteString]); } - return self.openDeferredDeeplink; } @@ -174,8 +141,7 @@ - (void)loadUIWebViewBridge:(WVJB_WEBVIEW_TYPE *)webView AdjustUIBridgeRegister *uiBridgeRegister = [AdjustUIBridgeRegister bridgeRegisterWithUIWebView:webView]; [uiBridgeRegister setWebViewDelegate:webViewDelegate]; - - self.bridgeRegister = uiBridgeRegister; + _bridgeRegister = uiBridgeRegister; [self loadWebViewBridge]; } @@ -188,209 +154,266 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView AdjustWKBridgeRegister *wkBridgeRegister = [AdjustWKBridgeRegister bridgeRegisterWithWKWebView:wkWebView]; [wkBridgeRegister setWebViewDelegate:wkWebViewDelegate]; - - self.bridgeRegister = wkBridgeRegister; + _bridgeRegister = wkBridgeRegister; [self loadWebViewBridge]; } - (void)loadWebViewBridge { - // Register for setting attribution callback method. - [self.bridgeRegister registerHandler:@"adjust_setAttributionCallback" handler:^(id data, WVJBResponseCallback responseCallback) { + // Register setCallback method to save callbacks before appDidLaunch + [self.bridgeRegister registerHandler:@"adjust_setCallback" handler:^(id data, WVJBResponseCallback responseCallback) { if (responseCallback == nil) { return; } - self.attributionCallback = responseCallback; + if ([data isEqualToString:@"attributionCallback"]) { + self.attributionCallback = responseCallback; + } else if ([data isEqualToString:@"eventSuccessCallback"]) { + self.eventSuccessCallback = responseCallback; + } else if ([data isEqualToString:@"eventFailureCallback"]) { + self.eventFailureCallback = responseCallback; + } else if ([data isEqualToString:@"sessionSuccessCallback"]) { + self.sessionSuccessCallback = responseCallback; + } else if ([data isEqualToString:@"sessionFailureCallback"]) { + self.sessionFailureCallback = responseCallback; + } else if ([data isEqualToString:@"deferredDeeplinkCallback"]) { + self.deferredDeeplinkCallback = responseCallback; + } }]; - // Register for setting event tracking success callback method. - [self.bridgeRegister registerHandler:@"adjust_setEventSuccessCallback" handler:^(id data, WVJBResponseCallback responseCallback) { - if (responseCallback == nil) { + [self.bridgeRegister registerHandler:@"adjust_appDidLaunch" handler:^(id data, WVJBResponseCallback responseCallback) { + NSString *appToken = [data objectForKey:@"appToken"]; + NSString *environment = [data objectForKey:@"environment"]; + NSString *allowSuppressLogLevel = [data objectForKey:@"allowSuppressLogLevel"]; + NSString *sdkPrefix = [data objectForKey:@"sdkPrefix"]; + NSString *defaultTracker = [data objectForKey:@"defaultTracker"]; + NSString *logLevel = [data objectForKey:@"logLevel"]; + NSNumber *eventBufferingEnabled = [data objectForKey:@"eventBufferingEnabled"]; + NSNumber *sendInBackground = [data objectForKey:@"sendInBackground"]; + NSNumber *delayStart = [data objectForKey:@"delayStart"]; + 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"]; + NSNumber *openDeferredDeeplink = [data objectForKey:@"openDeferredDeeplink"]; + + ADJConfig *adjustConfig; + if ([self isFieldValid:allowSuppressLogLevel]) { + adjustConfig = [ADJConfig configWithAppToken:appToken environment:environment allowSuppressLogLevel:[allowSuppressLogLevel boolValue]]; + } else { + adjustConfig = [ADJConfig configWithAppToken:appToken environment:environment]; + } + + // No need to continue if adjust config is not valid. + if (![adjustConfig isValid]) { return; } - self.eventSuccessCallback = responseCallback; + if ([self isFieldValid:sdkPrefix]) { + [adjustConfig setSdkPrefix:sdkPrefix]; + } + if ([self isFieldValid:defaultTracker]) { + [adjustConfig setDefaultTracker:defaultTracker]; + } + if ([self isFieldValid:logLevel]) { + [adjustConfig setLogLevel:[ADJLogger logLevelFromString:[logLevel lowercaseString]]]; + } + if ([self isFieldValid:eventBufferingEnabled]) { + [adjustConfig setEventBufferingEnabled:[eventBufferingEnabled boolValue]]; + } + if ([self isFieldValid:sendInBackground]) { + [adjustConfig setSendInBackground:[sendInBackground boolValue]]; + } + if ([self isFieldValid:delayStart]) { + [adjustConfig setDelayStart:[delayStart doubleValue]]; + } + if ([self isFieldValid:userAgent]) { + [adjustConfig setUserAgent:userAgent]; + } + if ([self isFieldValid:isDeviceKnown]) { + [adjustConfig setIsDeviceKnown:[isDeviceKnown boolValue]]; + } + BOOL isAppSecretDefined = [self isFieldValid:secretId] + && [self isFieldValid:info1] + && [self isFieldValid:info2] + && [self isFieldValid:info3] + && [self isFieldValid:info4]; + if (isAppSecretDefined) { + [adjustConfig setAppSecret:[secretId unsignedIntegerValue] + info1:[info1 unsignedIntegerValue] + info2:[info2 unsignedIntegerValue] + info3:[info3 unsignedIntegerValue] + info4:[info4 unsignedIntegerValue]]; + } + if ([self isFieldValid:openDeferredDeeplink]) { + self.openDeferredDeeplink = [openDeferredDeeplink boolValue]; + } + // Set self as delegate if any callback is configured. + // Change to swifle the methods in the future. + if (self.attributionCallback != nil + || self.eventSuccessCallback != nil + || self.eventFailureCallback != nil + || self.sessionSuccessCallback != nil + || self.sessionFailureCallback != nil + || self.deferredDeeplinkCallback != nil) { + [adjustConfig setDelegate:self]; + } + + [Adjust appDidLaunch:adjustConfig]; + [Adjust trackSubsessionStart]; }]; - // Register for setting event tracking failure method. - [self.bridgeRegister registerHandler:@"adjust_setEventFailureCallback" handler:^(id data, WVJBResponseCallback responseCallback) { - if (responseCallback == nil) { + [self.bridgeRegister registerHandler:@"adjust_trackEvent" handler:^(id data, WVJBResponseCallback responseCallback) { + NSString *eventToken = [data objectForKey:@"eventToken"]; + NSString *revenue = [data objectForKey:@"revenue"]; + NSString *currency = [data objectForKey:@"currency"]; + NSString *transactionId = [data objectForKey:@"transactionId"]; + id callbackParameters = [data objectForKey:@"callbackParameters"]; + id partnerParameters = [data objectForKey:@"partnerParameters"]; + + ADJEvent *adjustEvent = [ADJEvent eventWithEventToken:eventToken]; + // No need to continue if adjust event is not valid + if (![adjustEvent isValid]) { return; } - self.eventFailureCallback = responseCallback; + if ([self isFieldValid:revenue] && [self isFieldValid:currency]) { + double revenueValue = [revenue doubleValue]; + [adjustEvent setRevenue:revenueValue currency:currency]; + } + if ([self isFieldValid:transactionId]) { + [adjustEvent setTransactionId:transactionId]; + } + for (int i = 0; i < [callbackParameters count]; i += 2) { + NSString *key = [[callbackParameters objectAtIndex:i] description]; + NSString *value = [[callbackParameters objectAtIndex:(i + 1)] description]; + [adjustEvent addCallbackParameter:key value:value]; + } + for (int i = 0; i < [partnerParameters count]; i += 2) { + NSString *key = [[partnerParameters objectAtIndex:i] description]; + NSString *value = [[partnerParameters objectAtIndex:(i + 1)] description]; + [adjustEvent addPartnerParameter:key value:value]; + } + + [Adjust trackEvent:adjustEvent]; }]; - // Register for setting session tracking success method. - [self.bridgeRegister registerHandler:@"adjust_setSessionSuccessCallback" handler:^(id data, WVJBResponseCallback responseCallback) { - if (responseCallback == nil) { - return; - } + [self.bridgeRegister registerHandler:@"adjust_trackSubsessionStart" handler:^(id data, WVJBResponseCallback responseCallback) { + [Adjust trackSubsessionStart]; + }]; - self.sessionSuccessCallback = responseCallback; + [self.bridgeRegister registerHandler:@"adjust_trackSubsessionEnd" handler:^(id data, WVJBResponseCallback responseCallback) { + [Adjust trackSubsessionEnd]; }]; - // Register for setting session tracking failure method. - [self.bridgeRegister registerHandler:@"adjust_setSessionFailureCallback" handler:^(id data, WVJBResponseCallback responseCallback) { - if (responseCallback == nil) { + [self.bridgeRegister registerHandler:@"adjust_setEnabled" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSNumber class]]) { return; } - - self.sessionFailureCallback = responseCallback; + [Adjust setEnabled:[(NSNumber *)data boolValue]]; }]; - // Register for setting direct deeplink handler method. - [self.bridgeRegister registerHandler:@"adjust_setDeferredDeeplinkCallback" handler:^(id data, WVJBResponseCallback responseCallback) { + [self.bridgeRegister registerHandler:@"adjust_isEnabled" handler:^(id data, WVJBResponseCallback responseCallback) { if (responseCallback == nil) { return; } + responseCallback([NSNumber numberWithBool:[Adjust isEnabled]]); + }]; - self.deferredDeeplinkCallback = responseCallback; + [self.bridgeRegister registerHandler:@"adjust_appWillOpenUrl" handler:^(id data, WVJBResponseCallback responseCallback) { + [Adjust appWillOpenUrl:[NSURL URLWithString:data]]; }]; - // Register for appDidLaunch method. - [self.bridgeRegister registerHandler:@"adjust_appDidLaunch" handler:^(id data, WVJBResponseCallback responseCallback) { - NSString *appToken = [data objectForKey:KEY_APP_TOKEN]; - NSString *environment = [data objectForKey:KEY_ENVIRONMENT]; - NSString *logLevel = [data objectForKey:KEY_LOG_LEVEL]; - NSString *sdkPrefix = [data objectForKey:KEY_SDK_PREFIX]; - NSString *defaultTracker = [data objectForKey:KEY_DEFAULT_TRACKER]; - NSNumber *sendInBackground = [data objectForKey:KEY_SEND_IN_BACKGROUND]; - NSNumber *eventBufferingEnabled = [data objectForKey:KEY_EVENT_BUFFERING_ENABLED]; - NSNumber *webViewLoggingEnabled = [data objectForKey:KEY_WEB_VIEW_LOGGING_ENABLED]; - NSNumber *shouldOpenDeferredDeeplink = [data objectForKey:KEY_OPEN_DEFERRED_DEEPLINK]; - - ADJConfig *adjustConfig = [ADJConfig configWithAppToken:appToken environment:environment]; - - if ([adjustConfig isValid]) { - // Log level - if ([self isFieldValid:logLevel]) { - [adjustConfig setLogLevel:[ADJLogger logLevelFromString:[logLevel lowercaseString]]]; - } - - // Sending in background - if ([self isFieldValid:sendInBackground]) { - [adjustConfig setSendInBackground:[sendInBackground boolValue]]; - } - - // Event buffering - if ([self isFieldValid:eventBufferingEnabled]) { - [adjustConfig setEventBufferingEnabled:[eventBufferingEnabled boolValue]]; - } - - // Web bridge logging - if ([self isFieldValid:webViewLoggingEnabled]) { - if ([eventBufferingEnabled boolValue]) { - [WebViewJavascriptBridge enableLogging]; - } - } - - // Deferred deeplink opening - if ([self isFieldValid:shouldOpenDeferredDeeplink]) { - self.openDeferredDeeplink = [shouldOpenDeferredDeeplink boolValue]; - } - - // SDK prefix - if ([self isFieldValid:sdkPrefix]) { - [adjustConfig setSdkPrefix:sdkPrefix]; - } - - // Default tracker - if ([self isFieldValid:defaultTracker]) { - [adjustConfig setDefaultTracker:defaultTracker]; - } - - // Attribution delegate - if (self.attributionCallback != nil || self.eventSuccessCallback != nil || - self.eventFailureCallback != nil || self.sessionSuccessCallback != nil || - self.sessionFailureCallback != nil || self.deferredDeeplinkCallback != nil) { - [adjustConfig setDelegate:self]; - } - - [Adjust appDidLaunch:adjustConfig]; - [Adjust trackSubsessionStart]; + [self.bridgeRegister registerHandler:@"adjust_setDeviceToken" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSString class]]) { + return; } + [Adjust setPushToken:(NSString *)data]; }]; - // Register for trackEvent method. - [self.bridgeRegister registerHandler:@"adjust_trackEvent" handler:^(id data, WVJBResponseCallback responseCallback) { - NSString *eventToken = [data objectForKey:KEY_EVENT_TOKEN]; - NSString *revenue = [data objectForKey:KEY_REVENUE]; - NSString *currency = [data objectForKey:KEY_CURRENCY]; - NSString *transactionId = [data objectForKey:KEY_TRANSACTION_ID]; - - ADJEvent *adjustEvent = [ADJEvent eventWithEventToken:eventToken]; - - if ([adjustEvent isValid]) { - // Revenue and currency - if ([self isFieldValid:revenue] || [self isFieldValid:currency]) { - double revenueValue = [revenue doubleValue]; + [self.bridgeRegister registerHandler:@"adjust_setOfflineMode" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSNumber class]]) { + return; + } + [Adjust setOfflineMode:[(NSNumber *)data boolValue]]; + }]; - [adjustEvent setRevenue:revenueValue currency:currency]; - } + [self.bridgeRegister registerHandler:@"adjust_idfa" handler:^(id data, WVJBResponseCallback responseCallback) { + if (responseCallback == nil) { + return; + } + responseCallback([Adjust idfa]); + }]; - // Callback parameters - for (int i = 0; i < [[data objectForKey:KEY_CALLBACK_PARAMETERS] count]; i += 2) { - [adjustEvent addCallbackParameter:[[data objectForKey:KEY_CALLBACK_PARAMETERS] objectAtIndex:i] - value:[[data objectForKey:KEY_CALLBACK_PARAMETERS] objectAtIndex:(i+1)]]; - } + [self.bridgeRegister registerHandler:@"adjust_adid" handler:^(id data, WVJBResponseCallback responseCallback) { + if (responseCallback == nil) { + return; + } + responseCallback([Adjust adid]); + }]; - // Partner parameters - for (int i = 0; i < [[data objectForKey:KEY_PARTNER_PARAMETERS] count]; i += 2) { - [adjustEvent addPartnerParameter:[[data objectForKey:KEY_PARTNER_PARAMETERS] objectAtIndex:i] - value:[[data objectForKey:KEY_PARTNER_PARAMETERS] objectAtIndex:(i+1)]]; - } + [self.bridgeRegister registerHandler:@"adjust_attribution" handler:^(id data, WVJBResponseCallback responseCallback) { + if (responseCallback == nil) { + return; + } + ADJAttribution *attribution = [Adjust attribution]; + NSDictionary *attributionDictionary = nil; + if (attribution != nil) { + attributionDictionary = [attribution dictionary]; + } - // Transaction ID - if ([self isFieldValid:transactionId]) { - [adjustEvent setTransactionId:transactionId]; - } + responseCallback(attributionDictionary); + }]; - [Adjust trackEvent:adjustEvent]; - } + [self.bridgeRegister registerHandler:@"adjust_sendFirstPackages" handler:^(id data, WVJBResponseCallback responseCallback) { + [Adjust sendFirstPackages]; }]; - // Register for setOfflineMode method. - [self.bridgeRegister registerHandler:@"adjust_setOfflineMode" handler:^(NSNumber *data, WVJBResponseCallback responseCallback) { - [Adjust setOfflineMode:[data boolValue]]; + [self.bridgeRegister registerHandler:@"adjust_addSessionCallbackParameter" handler:^(id data, WVJBResponseCallback responseCallback) { + NSString *key = [data objectForKey:@"key"]; + NSString *value = [data objectForKey:@"value"]; + [Adjust addSessionCallbackParameter:key value:value]; }]; - // Register for setEnabled method. - [self.bridgeRegister registerHandler:@"adjust_setEnabled" handler:^(NSNumber *data, WVJBResponseCallback responseCallback) { - [Adjust setEnabled:[data boolValue]]; + [self.bridgeRegister registerHandler:@"adjust_addSessionPartnerParameter" handler:^(id data, WVJBResponseCallback responseCallback) { + NSString *key = [data objectForKey:@"key"]; + NSString *value = [data objectForKey:@"value"]; + [Adjust addSessionPartnerParameter:key value:value]; }]; - // Register for isEnabled method. - [self.bridgeRegister registerHandler:@"adjust_isEnabled" handler:^(id data, WVJBResponseCallback responseCallback) { - if (responseCallback == nil) { + [self.bridgeRegister registerHandler:@"adjust_removeSessionCallbackParameter" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSString class]]) { return; } - - responseCallback([NSNumber numberWithBool:[Adjust isEnabled]]); + [Adjust removeSessionCallbackParameter:(NSString *)data]; }]; - // Register for IDFA method. - [self.bridgeRegister registerHandler:@"adjust_idfa" handler:^(id data, WVJBResponseCallback responseCallback) { - if (responseCallback == nil) { + [self.bridgeRegister registerHandler:@"adjust_removeSessionPartnerParameter" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSString class]]) { return; } - - responseCallback([Adjust idfa]); + [Adjust removeSessionPartnerParameter:(NSString *)data]; }]; - // Register for appWillOpenUrl method. - [self.bridgeRegister registerHandler:@"adjust_appWillOpenUrl" handler:^(id data, WVJBResponseCallback responseCallback) { - [Adjust appWillOpenUrl:[NSURL URLWithString:data]]; + [self.bridgeRegister registerHandler:@"adjust_resetSessionCallbackParameters" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSString class]]) { + return; + } + [Adjust resetSessionCallbackParameters]; }]; - // Register for setDeviceToken method. - [self.bridgeRegister registerHandler:@"adjust_setDeviceToken" handler:^(id data, WVJBResponseCallback responseCallback) { - [Adjust setDeviceToken:[data dataUsingEncoding:NSUTF8StringEncoding]]; + [self.bridgeRegister registerHandler:@"adjust_resetSessionPartnerParameters" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSString class]]) { + return; + } + [Adjust resetSessionPartnerParameters]; }]; -} -- (void)sendDeeplinkToWebView:(NSURL *)deeplink { - [self.bridgeRegister callHandler:@"adjust_deeplink" data:[deeplink absoluteString]]; + [self.bridgeRegister registerHandler:@"adjust_gdprForgetMe" handler:^(id data, WVJBResponseCallback responseCallback) { + [Adjust gdprForgetMe]; + }]; } #pragma mark - Private & helper methods @@ -399,11 +422,9 @@ - (BOOL)isFieldValid:(NSObject *)field { if (field == nil) { return NO; } - if ([field isKindOfClass:[NSNull class]]) { return NO; } - return YES; } diff --git a/AdjustBridge/AdjustBridgeRegister.h b/AdjustBridge/AdjustBridgeRegister.h index 3e337adcf..032ad003b 100644 --- a/AdjustBridge/AdjustBridgeRegister.h +++ b/AdjustBridge/AdjustBridgeRegister.h @@ -1,9 +1,9 @@ // // AdjustWebViewJSBridge.h -// Adjust +// Adjust SDK // -// Created by Pedro Filipe on 10/06/16. -// Copyright © 2016 adjust GmbH. All rights reserved. +// Created by Pedro Filipe (@nonelse) on 10th June 2016. +// Copyright © 2016-2018 Adjust GmbH. All rights reserved. // #import diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index b1abfc3b8..a5f125300 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -1,9 +1,9 @@ // // AdjustBridgeRegister.m -// Adjust +// Adjust SDK // -// Created by Pedro Filipe on 10/06/16. -// Copyright © 2016 adjust GmbH. All rights reserved. +// Created by Pedro Filipe (@nonelse) on 10th June 2016. +// Copyright © 2016-2018 Adjust GmbH. All rights reserved. // #import "AdjustBridgeRegister.h" @@ -24,13 +24,11 @@ @implementation AdjustUIBridgeRegister - (id)initWithUIWebView:(WVJB_WEBVIEW_TYPE *)uiWebView { self = [super init]; - if (self == nil) { return nil; } self.uiBridge = [WebViewJavascriptBridge bridgeForWebView:uiWebView]; - return self; } @@ -42,7 +40,6 @@ - (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler { if ([handlerName hasPrefix:kHandlerPrefix] == NO) { return; } - [self.uiBridge registerHandler:handlerName handler:handler]; } @@ -50,7 +47,6 @@ - (void)callHandler:(NSString *)handlerName data:(id)data { if ([handlerName hasPrefix:kHandlerPrefix] == NO) { return; } - [self.uiBridge callHandler:handlerName data:data]; } @@ -70,13 +66,11 @@ @implementation AdjustWKBridgeRegister - (id)initWithWKWebView:(WKWebView *)wkWebView { self = [super init]; - if (self == nil) { return nil; } self.wkBridge = [WebViewJavascriptBridge bridgeForWebView:wkWebView]; - return self; } @@ -88,7 +82,6 @@ - (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler { if ([handlerName hasPrefix:kHandlerPrefix] == NO) { return; } - [self.wkBridge registerHandler:handlerName handler:handler]; } @@ -96,7 +89,6 @@ - (void)callHandler:(NSString *)handlerName data:(id)data { if ([handlerName hasPrefix:kHandlerPrefix] == NO) { return; } - [self.wkBridge callHandler:handlerName data:data]; } diff --git a/AdjustBridge/WebViewJavascriptBridge/AdjustBridge_JS.h b/AdjustBridge/WebViewJavascriptBridge/AdjustBridge_JS.h new file mode 100644 index 000000000..6fac087a9 --- /dev/null +++ b/AdjustBridge/WebViewJavascriptBridge/AdjustBridge_JS.h @@ -0,0 +1,11 @@ +// +// AdjustBridge_JS.h +// Adjust SDK +// +// Created by Pedro Filipe (@nonelse) on 20th July 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import + +NSString * AdjustBridge_js(void); diff --git a/AdjustBridge/WebViewJavascriptBridge/AdjustBridge_JS.m b/AdjustBridge/WebViewJavascriptBridge/AdjustBridge_JS.m new file mode 100644 index 000000000..89088ee18 --- /dev/null +++ b/AdjustBridge/WebViewJavascriptBridge/AdjustBridge_JS.m @@ -0,0 +1,303 @@ +// +// AdjustBridge_JS.m +// Adjust SDK +// +// Created by Pedro Filipe (@nonelse) on 20th July 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +// This file including the header and format is copied with adaptions from +// WebViewJavascriptBridge_JS.m + +// This file contains the source for the Javascript side of the +// Adjust Webview bridge. It is plaintext, but converted to an NSString +// via some preprocessor tricks. + +// Previous implementations of Adjust Webview bridge loaded the javascript source +// from a resource. This worked fine for app developers, but library developers who +// included the bridge into their library, awkwardly had to ask consumers of their +// library to include the resource, violating their encapsulation. By including the +// Javascript as a string resource, the encapsulation of the library is maintained. + +#import "AdjustBridge_JS.h" + +NSString * AdjustBridge_js() { + #define __adj_wvjb_js_func__(x) #x + // BEGIN preprocessorJSCode + static NSString * preprocessorJSCode = @__adj_wvjb_js_func__( +;(function() { + if (window.Adjust) { + return; + } + + // copied from adjust.js + window.Adjust = { + appDidLaunch: function (adjustConfig) { + if (WebViewJavascriptBridge) { + if (adjustConfig) { + adjustConfig.iterateConfiguredCallbacks( + function(callbackName, callback) { + WebViewJavascriptBridge.callHandler('adjust_setCallback', callbackName, callback); + } + ); + 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); + } + } + }; + + // copied from adjust_event.js + window.AdjustEvent = function (eventToken) { + this.eventToken = eventToken; + + this.revenue = null; + this.currency = null; + this.transactionId = null; + + this.callbackParameters = []; + this.partnerParameters = []; + }; + + AdjustEvent.prototype.addCallbackParameter = function(key, value) { + this.callbackParameters.push(key); + this.callbackParameters.push(value); + }; + + AdjustEvent.prototype.addPartnerParameter = function(key, value) { + this.partnerParameters.push(key); + this.partnerParameters.push(value); + }; + + AdjustEvent.prototype.setRevenue = function(revenue, currency) { + this.revenue = revenue; + this.currency = currency; + }; + + AdjustEvent.prototype.setTransactionId = function(transactionId) { + this.transactionId = transactionId; + }; + + // copied from adjust_config.js + window.AdjustConfig = function (appToken, environment, legacy) { + + if (arguments.length === 2) { + // New format does not require bridge as first parameter. + this.appToken = appToken; + this.environment = environment; + } else if (arguments.length === 3) { + // New format with allowSuppressLogLevel. + if (typeof(legacy) == typeof(true)) { + this.appToken = appToken; + this.environment = environment; + this.allowSuppressLogLevel = legacy; + } else { + // Old format with first argument being the bridge instance. + this.bridge = appToken; + this.appToken = environment; + this.environment = legacy; + } + } + + this.sdkPrefix = 'web-bridge4.14.0'; + this.defaultTracker = null; + this.logLevel = null; + this.eventBufferingEnabled = null; + this.sendInBackground = null; + this.delayStart = null; + this.userAgent = null; + this.isDeviceKnown = null; + this.secretId = null; + this.info1 = null; + this.info2 = null; + this.info3 = null; + this.info4 = null; + this.openDeferredDeeplink = null; + this.callbacksMap = {}; + }; + AdjustConfig.EnvironmentSandbox = 'sandbox'; + AdjustConfig.EnvironmentProduction = 'production'; + + AdjustConfig.LogLevelVerbose = 'VERBOSE'; + AdjustConfig.LogLevelDebug = 'DEBUG'; + AdjustConfig.LogLevelInfo = 'INFO'; + AdjustConfig.LogLevelWarn = 'WARN'; + AdjustConfig.LogLevelError = 'ERROR'; + AdjustConfig.LogLevelAssert = 'ASSERT'; + AdjustConfig.LogLevelSuppress = 'SUPPRESS'; + + AdjustConfig.prototype.iterateConfiguredCallbacks = function(handleCallbackWithName) { + if (!this.callbacksMap) { + return; + } + var keysArray = Object.keys(this.callbacksMap); + for (var idx in keysArray) { + var key = keysArray[idx]; + handleCallbackWithName(key, this.callbacksMap[key]); + } + }; + + AdjustConfig.prototype.setSdkPrefix = function(sdkPrefix) { + this.sdkPrefix = sdkPrefix; + }; + AdjustConfig.prototype.setDefaultTracker = function(defaultTracker) { + this.defaultTracker = defaultTracker; + }; + AdjustConfig.prototype.setLogLevel = function(logLevel) { + this.logLevel = logLevel; + }; + AdjustConfig.prototype.setEventBufferingEnabled = function(isEnabled) { + this.eventBufferingEnabled = isEnabled; + }; + AdjustConfig.prototype.setSendInBackground = function(isEnabled) { + this.sendInBackground = isEnabled; + }; + AdjustConfig.prototype.setDelayStart = function(delayStartInSeconds) { + this.delayStart = delayStartInSeconds; + }; + AdjustConfig.prototype.setUserAgent = function(userAgent) { + this.userAgent = userAgent; + }; + AdjustConfig.prototype.setIsDeviceKnown = function(isDeviceKnown) { + this.isDeviceKnown = isDeviceKnown; + }; + AdjustConfig.prototype.setAppSecret = function(secretId, info1, info2, info3, info4) { + this.secretId = secretId; + this.info1 = info1; + this.info2 = info2; + this.info3 = info3; + this.info4 = info4; + }; + + AdjustConfig.prototype.setOpenDeferredDeeplink = function(shouldOpen) { + this.openDeferredDeeplink = shouldOpen; + }; + + AdjustConfig.prototype.setAttributionCallback = function(callback) { + this.callbacksMap['attributionCallback'] = callback; + }; + + AdjustConfig.prototype.setEventSuccessCallback = function(callback) { + this.callbacksMap['eventSuccessCallback'] = callback; + }; + + AdjustConfig.prototype.setEventFailureCallback = function(callback) { + this.callbacksMap['eventFailureCallback'] = callback; + }; + + AdjustConfig.prototype.setSessionSuccessCallback = function(callback) { + this.callbacksMap['sessionSuccessCallback'] = callback; + }; + + AdjustConfig.prototype.setSessionFailureCallback = function(callback) { + this.callbacksMap['sessionFailureCallback'] = callback; + }; + + AdjustConfig.prototype.setDeferredDeeplinkCallback = function(callback) { + this.callbacksMap['deferredDeeplinkCallback'] = callback; + }; + + })(); + ); // END preprocessorJSCode + +#undef __adj_wvjb_js_func__ + return preprocessorJSCode; +}; diff --git a/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m b/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m index 3c6caba1e..73c923db6 100644 --- a/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m +++ b/AdjustBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m @@ -147,7 +147,10 @@ - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigati [_base logUnkownMessage:url]; } decisionHandler(WKNavigationActionPolicyCancel); - } else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) { + return; + } + + if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) { [_webViewDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler]; } else { decisionHandler(WKNavigationActionPolicyAllow); diff --git a/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m b/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m index 3ec26ed41..b6f4ec141 100755 --- a/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m +++ b/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m @@ -8,6 +8,7 @@ #import #import "WebViewJavascriptBridgeBase.h" #import "WebViewJavascriptBridge_JS.h" +#import "AdjustBridge_JS.h" @implementation WebViewJavascriptBridgeBase { __weak id _webViewDelegate; @@ -113,6 +114,9 @@ - (void)flushMessageQueue:(NSString *)messageQueueString{ - (void)injectJavascriptFile { NSString *js = WebViewJavascriptBridge_js(); [self _evaluateJavascript:js]; + // Added to inject adjust js code + NSString *adjust_js = AdjustBridge_js(); + [self _evaluateJavascript:adjust_js]; if (self.startupMessageQueue) { NSArray* queue = self.startupMessageQueue; self.startupMessageQueue = nil; diff --git a/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h b/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h index 6cb1cb95c..9c857f16e 100644 --- a/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h +++ b/AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h @@ -1,3 +1,3 @@ #import -NSString * WebViewJavascriptBridge_js(); \ No newline at end of file +NSString * WebViewJavascriptBridge_js(void); diff --git a/AdjustBridge/adjust.js b/AdjustBridge/adjust.js deleted file mode 100644 index b5150e72b..000000000 --- a/AdjustBridge/adjust.js +++ /dev/null @@ -1,77 +0,0 @@ -var Adjust = { - appDidLaunch: function (adjustConfig) { - this.bridge = adjustConfig.getBridge(); - - if (this.bridge != null) { - if (adjustConfig != null) { - if (adjustConfig.getAttributionCallback() != null) { - this.bridge.callHandler('adjust_setAttributionCallback', null, adjustConfig.getAttributionCallback()) - } - - if (adjustConfig.getEventSuccessCallback() != null) { - this.bridge.callHandler('adjust_setEventSuccessCallback', null, adjustConfig.getEventSuccessCallback()) - } - - if (adjustConfig.getEventFailureCallback() != null) { - this.bridge.callHandler('adjust_setEventFailureCallback', null, adjustConfig.getEventFailureCallback()) - } - - if (adjustConfig.getSessionSuccessCallback() != null) { - this.bridge.callHandler('adjust_setSessionSuccessCallback', null, adjustConfig.getSessionSuccessCallback()) - } - - if (adjustConfig.getSessionFailureCallback() != null) { - this.bridge.callHandler('adjust_setSessionFailureCallback', null, adjustConfig.getSessionFailureCallback()) - } - - if (adjustConfig.getDeferredDeeplinkCallback() != null) { - this.bridge.callHandler('adjust_setDeferredDeeplinkCallback', null, adjustConfig.getDeferredDeeplinkCallback()) - } - - this.bridge.callHandler('adjust_appDidLaunch', adjustConfig, null) - } - } - }, - - trackEvent: function (adjustEvent) { - if (this.bridge != null) { - this.bridge.callHandler('adjust_trackEvent', adjustEvent, null) - } - }, - - setOfflineMode: function(isOffline) { - if (this.bridge != null) { - this.bridge.callHandler('adjust_setOfflineMode', isOffline, null) - } - }, - - setEnabled: function (enabled) { - if (this.bridge != null) { - this.bridge.callHandler('adjust_setEnabled', enabled, null) - } - }, - - isEnabled: function (callback) { - if (this.bridge != null) { - this.bridge.callHandler('adjust_isEnabled', null, function(response) { - callback(new Boolean(response)) - }) - } - }, - - getIdfa: function (callback) { - if (this.bridge != null) { - this.bridge.callHandler('adjust_idfa', null, function(response) { - callback(response) - }) - } - }, - - appWillOpenUrl: function (url) { - if (this.bridge != null) { - this.bridge.callHandler('adjust_appWillOpenUrl', url, null) - } - } -}; - -module.exports = Adjust; diff --git a/AdjustBridge/adjust_config.js b/AdjustBridge/adjust_config.js deleted file mode 100644 index b6194c19e..000000000 --- a/AdjustBridge/adjust_config.js +++ /dev/null @@ -1,114 +0,0 @@ -function AdjustConfig(bridge, appToken, environment) { - this.bridge = bridge; - this.appToken = appToken; - this.environment = environment; - - this.sdkPrefix = 'web-bridge4.9.1'; - - this.logLevel = null; - this.defaultTracker = null; - - this.sendInBackground = null; - this.openDeferredDeeplink = null; - this.eventBufferingEnabled = null; - this.webBridgeLoggingEnabled = null; - - this.attributionCallback = null; - this.eventSuccessCallback = null; - this.eventFailureCallback = null; - this.sessionSuccessCallback = null; - this.sessionFailureCallback = null; - this.deferredDeeplinkCallback = null; -} - -AdjustConfig.EnvironmentSandbox = 'sandbox'; -AdjustConfig.EnvironmentProduction = 'production'; - -AdjustConfig.LogLevelVerbose = 'VERBOSE', -AdjustConfig.LogLevelDebug = 'DEBUG', -AdjustConfig.LogLevelInfo = 'INFO', -AdjustConfig.LogLevelWarn = 'WARN', -AdjustConfig.LogLevelError = 'ERROR', -AdjustConfig.LogLevelAssert = 'ASSERT', - -AdjustConfig.prototype.getBridge = function() { - return this.bridge; -}; - -AdjustConfig.prototype.getAttributionCallback = function() { - return this.attributionCallback; -}; - -AdjustConfig.prototype.getEventSuccessCallback = function() { - return this.eventSuccessCallback; -}; - -AdjustConfig.prototype.getEventFailureCallback = function() { - return this.eventFailureCallback; -}; - -AdjustConfig.prototype.getSessionSuccessCallback = function() { - return this.sessionSuccessCallback; -}; - -AdjustConfig.prototype.getSessionFailureCallback = function() { - return this.sessionFailureCallback; -}; - -AdjustConfig.prototype.getDeferredDeeplinkCallback = function() { - return this.deferredDeeplinkCallback; -}; - -AdjustConfig.prototype.setEventBufferingEnabled = function(isEnabled) { - this.eventBufferingEnabled = isEnabled; -}; - -AdjustConfig.prototype.setSendInBackground = function(isEnabled) { - this.sendInBackground = isEnabled; -}; - -AdjustConfig.prototype.setOpenDeferredDeeplink = function(shouldOpen) { - this.openDeferredDeeplink = shouldOpen; -}; - -AdjustConfig.prototype.setWebBridgeLoggingEnabled = function(isEnabled) { - this.webBridgeLoggingEnabled = isEnabled; -}; - -AdjustConfig.prototype.setLogLevel = function(logLevel) { - this.logLevel = logLevel; -}; - -AdjustConfig.prototype.setProcessName = function(processName) { - this.processName = processName; -}; - -AdjustConfig.prototype.setDefaultTracker = function(defaultTracker) { - this.defaultTracker = defaultTracker; -}; - -AdjustConfig.prototype.setAttributionCallback = function(callback) { - this.attributionCallback = callback; -}; - -AdjustConfig.prototype.setEventSuccessCallback = function(callback) { - this.eventSuccessCallback = callback; -}; - -AdjustConfig.prototype.setEventFailureCallback = function(callback) { - this.eventFailureCallback = callback; -}; - -AdjustConfig.prototype.setSessionSuccessCallback = function(callback) { - this.sessionSuccessCallback = callback; -}; - -AdjustConfig.prototype.setSessionFailureCallback = function(callback) { - this.sessionFailureCallback = callback; -}; - -AdjustConfig.prototype.setDeferredDeeplinkCallback = function(callback) { - this.deferredDeeplinkCallback = callback; -}; - -module.exports = AdjustConfig; diff --git a/AdjustBridge/adjust_event.js b/AdjustBridge/adjust_event.js deleted file mode 100644 index b769d33b0..000000000 --- a/AdjustBridge/adjust_event.js +++ /dev/null @@ -1,31 +0,0 @@ -function AdjustEvent(eventToken) { - this.eventToken = eventToken; - - this.revenue = null; - this.currency = null; - this.transactionId = null; - - this.callbackParameters = []; - this.partnerParameters = []; -} - -AdjustEvent.prototype.setRevenue = function(revenue, currency) { - this.revenue = revenue; - this.currency = currency; -}; - -AdjustEvent.prototype.addCallbackParameter = function(key, value) { - this.callbackParameters.push(key); - this.callbackParameters.push(value); -}; - -AdjustEvent.prototype.addPartnerParameter = function(key, value) { - this.partnerParameters.push(key); - this.partnerParameters.push(value); -}; - -AdjustEvent.prototype.setTransactionId = function(transactionId) { - this.transactionId = transactionId; -}; - -module.exports = AdjustEvent; \ No newline at end of file diff --git a/AdjustSdkIm/AdjustSdkIm.h b/AdjustSdkIm/AdjustSdkIm.h new file mode 100644 index 000000000..c0d84c2a3 --- /dev/null +++ b/AdjustSdkIm/AdjustSdkIm.h @@ -0,0 +1,27 @@ +// +// AdjustSdkIm.h +// AdjustSdkIm +// +// Created by Uglješa Erceg (@uerceg) on 19th Julu 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import + +//! Project version number for AdjustSdkIm. +FOUNDATION_EXPORT double AdjustSdkImVersionNumber; + +//! Project version string for AdjustSdkIm. +FOUNDATION_EXPORT const unsigned char AdjustSdkImVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/AdjustSdkIm/Info.plist b/AdjustSdkIm/Info.plist new file mode 100644 index 000000000..1007fd9dd --- /dev/null +++ b/AdjustSdkIm/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/AdjustSdkWebBridge/AdjustSdkWebBridge.h b/AdjustSdkWebBridge/AdjustSdkWebBridge.h new file mode 100644 index 000000000..9c057d66d --- /dev/null +++ b/AdjustSdkWebBridge/AdjustSdkWebBridge.h @@ -0,0 +1,35 @@ +// +// AdjustSdkWebBridge.h +// AdjustSdkWebBridge +// +// Created by Uglješa Erceg (@uerceg) on 27th July 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import + +//! Project version number for AdjustSdkWebBridge. +FOUNDATION_EXPORT double AdjustSdkWebBridgeVersionNumber; + +//! Project version string for AdjustSdkWebBridge. +FOUNDATION_EXPORT const unsigned char AdjustSdkWebBridgeVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +// Exposing entire WebViewJavascriptBridge framework +#import +#import +#import +#import +#import diff --git a/AdjustSdkWebBridge/Info.plist b/AdjustSdkWebBridge/Info.plist new file mode 100644 index 000000000..1007fd9dd --- /dev/null +++ b/AdjustSdkWebBridge/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj index 51fd68434..9e6c655b0 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj @@ -44,7 +44,6 @@ 6F3A5E8A2018CE14000AACD0 /* ADJResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E632018CE14000AACD0 /* ADJResponseData.m */; }; 6F3A5E8B2018CE14000AACD0 /* ADJPackageBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E652018CE14000AACD0 /* ADJPackageBuilder.m */; }; 6F3A5E8C2018CE14000AACD0 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E662018CE14000AACD0 /* ADJUserDefaults.m */; }; - 6F3A5E8D2018CE14000AACD0 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6F3A5E6A2018CE14000AACD0 /* Info.plist */; }; 6F3A5E8E2018CE14000AACD0 /* ADJActivityHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E6C2018CE14000AACD0 /* ADJActivityHandler.m */; }; 6F3A5E8F2018CE14000AACD0 /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E6D2018CE14000AACD0 /* ADJReachability.m */; }; 6F3A5E9E2018CE3A000AACD0 /* ATLTestInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E912018CE3A000AACD0 /* ATLTestInfo.m */; }; @@ -60,6 +59,7 @@ 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 */; }; + 9D75AFDB210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75AFDA210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -167,6 +167,8 @@ 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 = ""; }; + 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 */ /* Begin PBXFrameworksBuildPhase section */ @@ -336,6 +338,8 @@ 6FFCFE65200797D000467F01 /* ATAAdjustDelegateSessionFailure.m */, 6FFCFE67200797D000467F01 /* ATAAdjustDelegateSessionSuccess.h */, 6FFCFE6A200797D000467F01 /* ATAAdjustDelegateSessionSuccess.m */, + 9D75AFD9210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.h */, + 9D75AFDA210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m */, ); path = Delegates; sourceTree = ""; @@ -398,7 +402,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6F3A5E8D2018CE14000AACD0 /* Info.plist in Resources */, 6F084237200776A000568A31 /* LaunchScreen.storyboard in Resources */, 6F0842342007769F00568A31 /* Assets.xcassets in Resources */, 6F0842322007769F00568A31 /* Main.storyboard in Resources */, @@ -441,6 +444,7 @@ 6F3A5E6E2018CE14000AACD0 /* ADJDeviceInfo.m in Sources */, 6FFCFE5F2007978300467F01 /* ATAAdjustCommandExecutor.m in Sources */, 6F08422F2007769F00568A31 /* ViewController.m in Sources */, + 9D75AFDB210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m in Sources */, 6F3A5E8A2018CE14000AACD0 /* ADJResponseData.m in Sources */, 6F08423A200776A000568A31 /* main.m in Sources */, 6F3A5E9E2018CE3A000AACD0 /* ATLTestInfo.m in Sources */, diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m index 99456fb25..fed0461a5 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m @@ -14,6 +14,7 @@ #import "ATAAdjustDelegateEventSuccess.h" #import "ATAAdjustDelegateSessionSuccess.h" #import "ATAAdjustDelegateSessionFailure.h" +#import "ATAAdjustDelegateDeferredDeeplink.h" #import "ATAAdjustCommandExecutor.h" #import "ViewController.h" @@ -123,6 +124,13 @@ - (void)testOptions:(NSDictionary *)parameters { testOptions.noBackoffWait = YES; } } + testOptions.iAdFrameworkEnabled = NO; // default value -> NO - iAd will not be used in test app by default + if ([parameters objectForKey:@"iAdFrameworkEnabled"]) { + NSString *iAdFrameworkEnabledStr = [parameters objectForKey:@"iAdFrameworkEnabled"][0]; + if ([iAdFrameworkEnabledStr isEqualToString:@"true"]) { + testOptions.iAdFrameworkEnabled = YES; + } + } if ([parameters objectForKey:@"teardown"]) { NSArray *teardownOptions = [parameters objectForKey:@"teardown"]; for (int i = 0; i < teardownOptions.count; i = i + 1) { @@ -257,58 +265,44 @@ - (void)config:(NSDictionary *)parameters { [adjustConfig setUserAgent:userAgent]; } - /* - self.adjustDelegate = [[ATAAdjustDelegate alloc] initWithTestLibrary:self.testLibrary]; - BOOL swizzleAttributionCallback = NO; - BOOL swizzleSessionSuccessCallback = NO; - BOOL swizzleSessionFailureCallback = NO; - BOOL swizzleEventSuccessCallback = NO; - BOOL swizzleEventFailureCallback = NO; - */ - if ([parameters objectForKey:@"attributionCallbackSendAll"]) { NSLog(@"attributionCallbackSendAll detected"); self.adjustDelegate = [[ATAAdjustDelegateAttribution alloc] initWithTestLibrary:self.testLibrary andBasePath:self.basePath]; - // swizzleAttributionCallback = YES; } if ([parameters objectForKey:@"sessionCallbackSendSuccess"]) { NSLog(@"sessionCallbackSendSuccess detected"); self.adjustDelegate = [[ATAAdjustDelegateSessionSuccess alloc] initWithTestLibrary:self.testLibrary andBasePath:self.basePath]; - // swizzleSessionSuccessCallback = YES; } if ([parameters objectForKey:@"sessionCallbackSendFailure"]) { NSLog(@"sessionCallbackSendFailure detected"); self.adjustDelegate = [[ATAAdjustDelegateSessionFailure alloc] initWithTestLibrary:self.testLibrary andBasePath:self.basePath]; - // swizzleSessionFailureCallback = YES; } if ([parameters objectForKey:@"eventCallbackSendSuccess"]) { NSLog(@"eventCallbackSendSuccess detected"); self.adjustDelegate = [[ATAAdjustDelegateEventSuccess alloc] initWithTestLibrary:self.testLibrary andBasePath:self.basePath]; - // swizzleEventSuccessCallback = YES; } if ([parameters objectForKey:@"eventCallbackSendFailure"]) { NSLog(@"eventCallbackSendFailure detected"); self.adjustDelegate = [[ATAAdjustDelegateEventFailure alloc] initWithTestLibrary:self.testLibrary andBasePath:self.basePath]; - // swizzleEventFailureCallback = YES; } - /* - [self.adjustDelegate swizzleAttributionCallback:swizzleAttributionCallback - eventSucceededCallback:swizzleEventSuccessCallback - eventFailedCallback:swizzleEventFailureCallback - sessionSucceededCallback:swizzleSessionSuccessCallback - sessionFailedCallback:swizzleSessionFailureCallback]; - [adjustConfig setDelegate:self.adjustDelegate]; - */ + if ([parameters objectForKey:@"deferredDeeplinkCallback"]) { + NSLog(@"deferredDeeplinkCallback detected"); + NSString *shouldOpenDeeplinkS = [parameters objectForKey:@"deferredDeeplinkCallback"][0]; + self.adjustDelegate = [[ATAAdjustDelegateDeferredDeeplink alloc] initWithTestLibrary:self.testLibrary + basePath:self.basePath + andReturnValue:[shouldOpenDeeplinkS boolValue]]; + } + [adjustConfig setDelegate:self.adjustDelegate]; } diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/AppDelegate.m b/AdjustTests/AdjustTestApp/AdjustTestApp/AppDelegate.m index 34bfc054c..f0dfcfc76 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/AppDelegate.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/AppDelegate.m @@ -7,6 +7,7 @@ // #import "AppDelegate.h" +#import "Adjust.h" @interface AppDelegate () @@ -41,4 +42,9 @@ - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { + [Adjust appWillOpenUrl:url]; + return YES; +} + @end diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/Delegates/ATAAdjustDelegateDeferredDeeplink.h b/AdjustTests/AdjustTestApp/AdjustTestApp/Delegates/ATAAdjustDelegateDeferredDeeplink.h new file mode 100644 index 000000000..89e3683de --- /dev/null +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/Delegates/ATAAdjustDelegateDeferredDeeplink.h @@ -0,0 +1,17 @@ +// +// ATAAdjustDelegateDeferredDeeplink.h +// AdjustTestApp +// +// Created by Uglješa Erceg on 20.07.18. +// Copyright © 2018 adjust. All rights reserved. +// + +#import +#import "Adjust.h" +#import "ATLTestLibrary.h" + +@interface ATAAdjustDelegateDeferredDeeplink : NSObject + +- (id)initWithTestLibrary:(ATLTestLibrary *)testLibrary basePath:(NSString *)basePath andReturnValue:(BOOL)returnValue; + +@end diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/Delegates/ATAAdjustDelegateDeferredDeeplink.m b/AdjustTests/AdjustTestApp/AdjustTestApp/Delegates/ATAAdjustDelegateDeferredDeeplink.m new file mode 100644 index 000000000..6e30364d5 --- /dev/null +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/Delegates/ATAAdjustDelegateDeferredDeeplink.m @@ -0,0 +1,45 @@ +// +// ATAAdjustDelegateDeferredDeeplink.m +// AdjustTestApp +// +// Created by Uglješa Erceg on 20.07.18. +// Copyright © 2018 adjust. All rights reserved. +// + +#import "ATAAdjustDelegateDeferredDeeplink.h" + +@interface ATAAdjustDelegateDeferredDeeplink () + +@property (nonatomic, strong) ATLTestLibrary *testLibrary; +@property (nonatomic, copy) NSString *basePath; +@property (nonatomic, assign) BOOL returnValue; + +@end + +@implementation ATAAdjustDelegateDeferredDeeplink + +- (id)initWithTestLibrary:(ATLTestLibrary *)testLibrary basePath:(NSString *)basePath andReturnValue:(BOOL)returnValue { + self = [super init]; + + if (nil == self) { + return nil; + } + + self.testLibrary = testLibrary; + self.basePath = basePath; + self.returnValue = returnValue; + + return self; +} + +- (BOOL)adjustDeeplinkResponse:(nullable NSURL *)deeplink { + NSLog(@"Deferred deep link callback called!"); + NSLog(@"Deep link: %@", deeplink); + + [self.testLibrary addInfoToSend:@"deeplink" value:[deeplink absoluteString]]; + [self.testLibrary sendInfoToServer:self.basePath]; + + return self.returnValue; +} + +@end diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/Info.plist b/AdjustTests/AdjustTestApp/AdjustTestApp/Info.plist index 16be3b681..9d6cd0051 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/Info.plist +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/Info.plist @@ -41,5 +41,16 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + CFBundleURLTypes + + + CFBundleURLName + com.adjust.AdjustTestApp + CFBundleURLSchemes + + adjust-test + + + diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.m index 25abdc46f..9204be313 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.14.1"]; + [self.testLibrary startTestSession:@"ios4.14.2"]; } - (void)didReceiveMemoryWarning { diff --git a/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj b/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj index 9baba938f..6e2b6200d 100644 --- a/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustTestLibrary/AdjustTestLibrary.xcodeproj/project.pbxproj @@ -212,7 +212,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\n# If we're already inside this script then die\nif [ -n \"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS\" ]; then\nexit 0\nfi\nexport RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1\n\nRW_FRAMEWORK_NAME=${PROJECT_NAME}\nRW_INPUT_STATIC_LIB=\"lib${PROJECT_NAME}.a\"\nRW_FRAMEWORK_LOCATION=\"${BUILT_PRODUCTS_DIR}/Static/${RW_FRAMEWORK_NAME}.framework\"\n\nfunction build_static_library {\n echo \"1\"\n echo \"${BUILD_DIR}\"\n # Will rebuild the static library as specified\n # build_static_library sdk\n xcrun xcodebuild -project \"${PROJECT_FILE_PATH}\" \\\n -target \"${TARGET_NAME}\" \\\n -configuration \"${CONFIGURATION}\" \\\n -sdk \"${1}\" \\\n ONLY_ACTIVE_ARCH=NO \\\n BUILD_DIR=\"${BUILD_DIR}\" \\\n OBJROOT=\"${OBJROOT}\" \\\n BUILD_ROOT=\"${BUILD_ROOT}\" \\\n SYMROOT=\"${SYMROOT}\" $ACTION\n}\n\nfunction make_fat_library {\n # Will smash 2 static libs together\n # make_fat_library in1 in2 out\n xcrun lipo -create \"${1}\" \"${2}\" -output \"${3}\"\n}\n\n# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name\nif [[ \"$SDK_NAME\" =~ ([A-Za-z]+) ]]; then\nRW_SDK_PLATFORM=${BASH_REMATCH[1]}\nelse\necho \"Could not find platform name from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 2 - Extract the version from the SDK\nif [[ \"$SDK_NAME\" =~ ([0-9]+.*$) ]]; then\nRW_SDK_VERSION=${BASH_REMATCH[1]}\nelse\necho \"Could not find sdk version from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 3 - Determine the other platform\nif [ \"$RW_SDK_PLATFORM\" == \"iphoneos\" ]; then\nRW_OTHER_PLATFORM=iphonesimulator\nelse\nRW_OTHER_PLATFORM=iphoneos\nfi\n\n# 4 - Find the build directory\nif [[ \"$BUILT_PRODUCTS_DIR\" =~ (.*)$RW_SDK_PLATFORM$ ]]; then\nRW_OTHER_BUILT_PRODUCTS_DIR=\"${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}\"\nelse\necho \"Could not find other platform build directory.\"\nexit 1\nfi\n\n# Build the other platform.\nbuild_static_library \"${RW_OTHER_PLATFORM}${RW_SDK_VERSION}\"\n\n# If we're currently building for iphonesimulator, then need to rebuild\n# to ensure that we get both i386 and x86_64\nif [ \"$RW_SDK_PLATFORM\" == \"iphonesimulator\" ]; then\nbuild_static_library \"${SDK_NAME}\"\nfi\n\n# Join the 2 static libs into 1 and push into the .framework\nmake_fat_library \"${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}\"\n\n# Ensure that the framework is present in both platform's build directories\ncp -a \"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/Static/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}\"\n\n# Copy the framework to the project directory\nditto \"${RW_FRAMEWORK_LOCATION}\" \"${SRCROOT}/../../Frameworks/Static/${RW_FRAMEWORK_NAME}.framework\""; + shellScript = "set -e\n\n# If we're already inside this script then die\nif [ -n \"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS\" ]; then\nexit 0\nfi\nexport RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1\n\nRW_FRAMEWORK_NAME=${PROJECT_NAME}\nRW_INPUT_STATIC_LIB=\"lib${PROJECT_NAME}.a\"\nRW_FRAMEWORK_LOCATION=\"${BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}.framework\"\n\nfunction build_static_library {\n echo \"1\"\n echo \"${BUILD_DIR}\"\n # Will rebuild the static library as specified\n # build_static_library sdk\n xcrun xcodebuild -project \"${PROJECT_FILE_PATH}\" \\\n -target \"${TARGET_NAME}\" \\\n -configuration \"${CONFIGURATION}\" \\\n -sdk \"${1}\" \\\n ONLY_ACTIVE_ARCH=NO \\\n BUILD_DIR=\"${BUILD_DIR}\" \\\n OBJROOT=\"${OBJROOT}\" \\\n BUILD_ROOT=\"${BUILD_ROOT}\" \\\n SYMROOT=\"${SYMROOT}\" $ACTION\n}\n\nfunction make_fat_library {\n # Will smash 2 static libs together\n # make_fat_library in1 in2 out\n xcrun lipo -create \"${1}\" \"${2}\" -output \"${3}\"\n}\n\n# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name\nif [[ \"$SDK_NAME\" =~ ([A-Za-z]+) ]]; then\nRW_SDK_PLATFORM=${BASH_REMATCH[1]}\nelse\necho \"Could not find platform name from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 2 - Extract the version from the SDK\nif [[ \"$SDK_NAME\" =~ ([0-9]+.*$) ]]; then\nRW_SDK_VERSION=${BASH_REMATCH[1]}\nelse\necho \"Could not find sdk version from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 3 - Determine the other platform\nif [ \"$RW_SDK_PLATFORM\" == \"iphoneos\" ]; then\nRW_OTHER_PLATFORM=iphonesimulator\nelse\nRW_OTHER_PLATFORM=iphoneos\nfi\n\n# 4 - Find the build directory\nif [[ \"$BUILT_PRODUCTS_DIR\" =~ (.*)$RW_SDK_PLATFORM$ ]]; then\nRW_OTHER_BUILT_PRODUCTS_DIR=\"${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}\"\nelse\necho \"Could not find other platform build directory.\"\nexit 1\nfi\n\n# Build the other platform.\nbuild_static_library \"${RW_OTHER_PLATFORM}${RW_SDK_VERSION}\"\n\n# If we're currently building for iphonesimulator, then need to rebuild\n# to ensure that we get both i386 and x86_64\nif [ \"$RW_SDK_PLATFORM\" == \"iphonesimulator\" ]; then\nbuild_static_library \"${SDK_NAME}\"\nfi\n\n# Join the 2 static libs into 1 and push into the .framework\nmake_fat_library \"${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}\"\n\n# Ensure that the framework is present in both platform's build directories\ncp -a \"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}\"\n\n# Copy the framework to the project directory\nditto \"${RW_FRAMEWORK_LOCATION}\" \"${SRCROOT}/../../frameworks/static/${RW_FRAMEWORK_NAME}.framework\""; }; 9D8AB2B6203F202B0015DA32 /* Build Framework */ = { isa = PBXShellScriptBuildPhase; diff --git a/AdjustTests/AdjustUnitTests/ADJPackageFields.m b/AdjustTests/AdjustUnitTests/ADJPackageFields.m index 47eb1b1e4..f5f212c22 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.14.1"; + self.clientSdk = @"ios4.14.2"; self.suffix = @""; self.environment = @"sandbox"; diff --git a/CHANGELOG.md b/CHANGELOG.md index c07eaecd2..977da7347 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +### Version 4.14.2 (15th August 2018) +#### Added +- Added support for iMessage target. +- Added iMessage framework to releases page. +- Added Web Bridge framework to releases page. + +#### Changed +- Updated web view SDK (`v4.14.0`) and way of how it's being added to your iOS apps with web views. Please, make sure to check iOS web views SDK guide for more details. + +--- + ### Version 4.14.1 (18th June 2018) #### Added - Added `setPushToken:` method to `Adjust` interface to use push token as `NSString` data type. This method is intended only to be used by Adjust non native SDKs and you should not be using it in your native iOS app. Please, continue with usage of `setDeviceToken:` method as stated in `README`. diff --git a/README.md b/README.md index 97c84a3d0..cf2f64025 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ If your app is an app which uses web views you would like to use adjust tracking * [Add iOS frameworks](#sdk-frameworks) * [Integrate the SDK into your app](#sdk-integrate) * [Basic setup](#basic-setup) + * [iMessage specific setup](#basic-setup-imessage) * [Adjust logging](#adjust-logging) * [Build your app](#build-the-app) * [Additional features](#additional-features) @@ -57,30 +58,29 @@ If your app is an app which uses web views you would like to use adjust tracking ## Example apps -There are example apps inside the [`examples` directory][examples] for [`iOS (Objective-C)`][example-ios-objc], [`iOS (Swift)`][example-ios-swift], [`tvOS`][example-tvos] and [`Apple Watch`][example-iwatch]. You can open any of these Xcode projects to see an example of how the adjust SDK can be integrated. +There are example apps inside the [`examples` directory][examples] for [`iOS (Objective-C)`][example-ios-objc], [`iOS (Swift)`][example-ios-swift], [`tvOS`][example-tvos], [`iMessage`][example-imessage] and [`Apple Watch`][example-iwatch]. You can open any of these Xcode projects to see an example of how the Adjust SDK can be integrated. ## Basic integration -We will describe the steps to integrate the adjust SDK into your iOS project. We are going to assume that you are using Xcode for your iOS development. +We will describe the steps to integrate the Adjust SDK into your iOS project. We are going to assume that you are using Xcode for your iOS development. ### Add the SDK to your project 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.14.1' +pod 'Adjust', '~> 4.14.2' ``` or: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.14.1' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.14.2' ``` --- -If you're using [Carthage][carthage], you can add following line to your `Cartfile` and continue from -[this step](#sdk-frameworks): +If you're using [Carthage][carthage], you can add following line to your `Cartfile` and continue from [this step](#sdk-frameworks): ```ruby github "adjust/ios_sdk" @@ -88,15 +88,18 @@ github "adjust/ios_sdk" --- -You can also choose to integrate the adjust SDK by adding it to your project as a framework. On the [releases page][releases] you can find the following archives: +You can also choose to integrate the Adjust SDK by adding it to your project as a framework. On the [releases page][releases] you can find the following archives: * `AdjustSdkStatic.framework.zip` * `AdjustSdkDynamic.framework.zip` * `AdjustSdkTv.framework.zip` +* `AdjustSdkIm.framework.zip` -Since the release of iOS 8, Apple has introduced dynamic frameworks (also known as embedded frameworks). If your app is targeting iOS 8 or higher, you can use the adjust SDK dynamic framework. Choose which framework you want to use – static or dynamic – and add it to your project. +Since the release of iOS 8, Apple has introduced dynamic frameworks (also known as embedded frameworks). If your app is targeting iOS 8 or higher, you can use the Adjust SDK dynamic framework. Choose which framework you want to use – static or dynamic – and add it to your project. -If you are having `tvOS` app, you can use the adjust SDK with it as well with usage of our tvOS framework which you can extract from `AdjustSdkTv.framework.zip` archive. +If you are having `tvOS` app, you can use the Adjust SDK with it as well with usage of our tvOS framework which you can extract from `AdjustSdkTv.framework.zip` archive. + +If you are having `iMessage` app, you can use the Adjust SDK with it as well with usage of our IM framework which you can extract from `AdjustSdkIm.framework.zip` archive. ### Add iOS frameworks @@ -110,7 +113,7 @@ If you are having `tvOS` app, you can use the adjust SDK with it as well with us ### Integrate the SDK into your app -If you added the adjust SDK via a Pod repository, you should use one of the following import statements: +If you added the Adjust SDK via a Pod repository, you should use one of the following import statements: ```objc #import "Adjust.h" @@ -124,7 +127,7 @@ or --- -If you added the adjust SDK as a static/dynamic framework or via Carthage, you should use the following import statement: +If you added the Adjust SDK as a static/dynamic framework or via Carthage, you should use the following import statement: ```objc #import @@ -132,12 +135,20 @@ If you added the adjust SDK as a static/dynamic framework or via Carthage, you s --- -If you are are using the adjust SDK with your tvOS app, you should use the following import statement: +If you are are using the Adjust SDK with your tvOS app, you should use the following import statement: ```objc #import ``` +--- + +If you are are using the Adjust SDK with your iMessage app, you should use the following import statement: + +```objc +#import +``` + Next, we'll set up basic session tracking. ### Basic setup @@ -149,6 +160,7 @@ In the Project Navigator, open the source file of your application delegate. Add // or #import // or #import // or #import +// or #import // ... @@ -162,7 +174,7 @@ ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken ![][delegate] -**Note**: Initialising the adjust SDK like this is `very important`. Otherwise, you may encounter different kinds of issues as described in our [troubleshooting section](#ts-delayed-init). +**Note**: Initialising the Adjust SDK like this is `very important`. Otherwise, you may encounter different kinds of issues as described in our [troubleshooting section](#ts-delayed-init). Replace `{YourAppToken}` with your app token. You can find this in your [dashboard]. @@ -177,6 +189,46 @@ NSString *environment = ADJEnvironmentProduction; We use this environment to distinguish between real traffic and test traffic from test devices. It is very important that you keep this value meaningful at all times! This is especially important if you are tracking revenue. +### iMessage specific setup + +**Adding SDK from source:** In case that you have chosen to add Adjust SDK to your iMessage app **from source**, please make sure that you have pre-processor macro **ADJUST_IM=1** set in your iMessage project settings. + +**Adding SDK as framework:** After you have added `AdjustSdkIm.framework` to your iMessage app, please make sure to add `New Copy Files Phase` in your `Build Phases` project settings and select that `AdjustSdkIm.framework` should be copied to `Frameworks` folder. + +**Session tracking:** If you would like to have session tracking properly working in your iMessage app, you will need to do one additional integration step. In standard iOS apps Adjust SDK is automatically subscribed to iOS system notifications which enable us to know when app entered or left foreground. In case of iMessage app, this is not the case, so we need you to add explicit calls to `trackSubsessionStart` and `trackSubsessionEnd` methods inside of your iMessage app view controller to make our SDK aware of the moments when your app is being in foreground or not. + +Add call to `trackSubsessionStart` inside of `didBecomeActiveWithConversation:` method: + +```objc +-(void)didBecomeActiveWithConversation:(MSConversation *)conversation { + // Called when the extension is about to move from the inactive to active state. + // This will happen when the extension is about to present UI. + // Use this method to configure the extension and restore previously stored state. + + [Adjust trackSubsessionStart]; +} +``` + +Add call to `trackSubsessionEnd` inside of `willResignActiveWithConversation:` method: + +```objc +-(void)willResignActiveWithConversation:(MSConversation *)conversation { + // Called when the extension is about to move from the active to inactive state. + // This will happen when the user dissmises the extension, changes to a different + // conversation or quits Messages. + + // Use this method to release shared resources, save user data, invalidate timers, + // and store enough state information to restore your extension to its current state + // in case it is terminated later. + + [Adjust trackSubsessionEnd]; +} +``` + +With this set, Adjust SDK will be able to successfully perform session tracking inside of your iMessage app. + +**Note:** You should be aware that your iOS app and iMessage extension you wrote for it are running in different memory spaces and they as well have different bundle identifiers. Initialising Adjust SDK with same app token in both places will result in two independent instances tracking things unaware of each other which might cause data mixture you don't want to see in your dashboard data. General advice would be to create separate app in Adjust dashboard for your iMessage app and initialise SDK inside of it with separate app token. + ### Adjust logging You can increase or decrease the amount of logs that you see during testing by calling `setLogLevel:` on your `ADJConfig` instance with one of the following parameters: @@ -191,13 +243,14 @@ You can increase or decrease the amount of logs that you see during testing by c [adjustConfig setLogLevel:ADJLogLevelSuppress]; // disable all logging ``` -If you don't want your app in production to display any logs coming from the adjust SDK, then you should select `ADJLogLevelSuppress` and in addition to that, initialise `ADJConfig` object with another constructor where you should enable suppress log level mode: +If you don't want your app in production to display any logs coming from the Adjust SDK, then you should select `ADJLogLevelSuppress` and in addition to that, initialise `ADJConfig` object with another constructor where you should enable suppress log level mode: ```objc #import "Adjust.h" // or #import // or #import // or #import +// or #import // ... @@ -218,7 +271,7 @@ Build and run your app. If the build succeeds, you should carefully read the SDK ## Additional features -Once you integrate the adjust SDK into your project, you can take advantage of the following features. +Once you integrate the Adjust SDK into your project, you can take advantage of the following features. ### Event tracking @@ -322,13 +375,13 @@ You can read more about special partners and these integrations in our [guide to ### Session parameters -Some parameters are saved to be sent in every event and session of the adjust SDK. Once you have added any of these parameters, you don't need to add them every time, since they will be saved locally. If you add the same parameter twice, there will be no effect. +Some parameters are saved to be sent in every event and session of the Adjust SDK. Once you have added any of these parameters, you don't need to add them every time, since they will be saved locally. If you add the same parameter twice, there will be no effect. -If you want to send session parameters with the initial install event, they must be called before the Adjust SDK launches via `[Adjust appDidLaunch:]`. If you need to send them with an install, but can only obtain the needed values after launch, it's possible to [delay](#delay-start) the first launch of the adjust SDK to allow this behavior. +If you want to send session parameters with the initial install event, they must be called before the Adjust SDK launches via `[Adjust appDidLaunch:]`. If you need to send them with an install, but can only obtain the needed values after launch, it's possible to [delay](#delay-start) the first launch of the Adjust SDK to allow this behavior. ### Session callback parameters -The same callback parameters that are registered for [events](#callback-parameters) can be also saved to be sent in every event or session of the adjust SDK. +The same callback parameters that are registered for [events](#callback-parameters) can be also saved to be sent in every event or session of the Adjust SDK. The session callback parameters have a similar interface of the event callback parameters. Instead of adding the key and it's value to an event, it's added through a call to `Adjust` method `addSessionCallbackParameter:value:`: @@ -352,7 +405,7 @@ If you wish to remove all key and values from the session callback parameters, y ### Session partner parameters -In the same way that there is [session callback parameters](#session-callback-parameters) that are sent every in event or session of the adjust SDK, there is also session partner parameters. +In the same way that there is [session callback parameters](#session-callback-parameters) that are sent every in event or session of the Adjust SDK, there is also session partner parameters. These will be transmitted to network partners, for the integrations that have been activated in your adjust [dashboard]. @@ -378,7 +431,7 @@ If you wish to remove all key and values from the session partner parameters, yo ### Delay start -Delaying the start of the adjust SDK allows your app some time to obtain session parameters, such as unique identifiers, to be send on install. +Delaying the start of the Adjust SDK allows your app some time to obtain session parameters, such as unique identifiers, to be send on install. Set the initial delay time in seconds with the method `setDelayStart` in the `ADJConfig` instance: @@ -386,9 +439,9 @@ Set the initial delay time in seconds with the method `setDelayStart` in the `AD [adjustConfig setDelayStart:5.5]; ``` -In this case this will make the adjust SDK not send the initial install session and any event created for 5.5 seconds. After this time is expired or if you call `[Adjust sendFirstPackages]` in the meanwhile, every session parameter will be added to the delayed install session and events and the adjust SDK will resume as usual. +In this case this will make the Adjust SDK not send the initial install session and any event created for 5.5 seconds. After this time is expired or if you call `[Adjust sendFirstPackages]` in the meanwhile, every session parameter will be added to the delayed install session and events and the Adjust SDK will resume as usual. -**The maximum delay start time of the adjust SDK is 10 seconds**. +**The maximum delay start time of the Adjust SDK is 10 seconds**. ### Attribution callback @@ -481,17 +534,17 @@ And both event and session failed objects also contain: ### Disable tracking -You can disable the adjust SDK from tracking any activities of the current device by calling `setEnabled` with parameter `NO`. **This setting is remembered between sessions**, but it can only be activated after the first session. +You can disable the Adjust SDK from tracking any activities of the current device by calling `setEnabled` with parameter `NO`. **This setting is remembered between sessions**. ```objc [Adjust setEnabled:NO]; ``` -You can check if the adjust SDK is currently enabled by calling the function `isEnabled`. It is always possible to activate the adjust SDK by invoking `setEnabled` with the enabled parameter as `YES`. +You can check if the Adjust SDK is currently enabled by calling the function `isEnabled`. It is always possible to activate the Adjust SDK by invoking `setEnabled` with the enabled parameter as `YES`. ### Offline mode -You can put the adjust SDK in offline mode to suspend transmission to our servers while retaining tracked data to be sent later. While in offline mode, all information is saved in a file, so be careful not to trigger too many events while in offline mode. +You can put the Adjust SDK in offline mode to suspend transmission to our servers while retaining tracked data to be sent later. While in offline mode, all information is saved in a file, so be careful not to trigger too many events while in offline mode. You can activate offline mode by calling `setOfflineMode` with the parameter `YES`. @@ -499,7 +552,7 @@ You can activate offline mode by calling `setOfflineMode` with the parameter `YE [Adjust setOfflineMode:YES]; ``` -Conversely, you can deactivate offline mode by calling `setOfflineMode` with `NO`. When the adjust SDK is put back in online mode, all saved information is sent to our servers with the correct time information. +Conversely, you can deactivate offline mode by calling `setOfflineMode` with `NO`. When the Adjust SDK is put back in online mode, all saved information is sent to our servers with the correct time information. Unlike disabling tracking, this setting is **not remembered** bettween sessions. This means that the SDK is in online mode whenever it is started, even if the app was terminated in offline mode. @@ -537,7 +590,7 @@ An App Secret is set by calling `setAppSecret` on your `AdjustConfig` instance: ### Background tracking -The default behaviour of the adjust SDK is to pause sending HTTP requests while the app is in the background. You can change this in your `AdjustConfig` instance: +The default behaviour of the Adjust SDK is to pause sending HTTP requests while the app is in the background. You can change this in your `AdjustConfig` instance: ```objc [adjustConfig setSendInBackground:YES]; @@ -547,7 +600,7 @@ If nothing is set, sending in background is **disabled by default**. ### Device IDs -The adjust SDK offers you possibility to obtain some of the device identifiers. +The Adjust SDK offers you possibility to obtain some of the device identifiers. ### iOS Advertising Identifier @@ -567,7 +620,7 @@ For each device with your app installed, adjust backend generates unique **adjus NSString *adid = [Adjust adid]; ``` -**Note**: Information about the **adid** is available after the app's installation has been tracked by the adjust backend. From that moment on, the adjust SDK has information about the device **adid** and you can access it with this method. So, **it is not possible** to access the **adid** before the SDK has been initialised and the installation of your app has been tracked successfully. +**Note**: Information about the **adid** is available after the app's installation has been tracked by the adjust backend. From that moment on, the Adjust SDK has information about the device **adid** and you can access it with this method. So, **it is not possible** to access the **adid** before the SDK has been initialised and the installation of your app has been tracked successfully. ### User attribution @@ -577,7 +630,7 @@ The attribution callback will be triggered as described in the [attribution call ADJAttribution *attribution = [Adjust attribution]; ``` -**Note**: Information about current attribution is available after app installation has been tracked by the adjust backend and attribution callback has been initially triggered. From that moment on, adjust SDK has information about your user's attribution and you can access it with this method. So, **it is not possible** to access user's attribution value before the SDK has been initialised and attribution callback has been initially triggered. +**Note**: Information about current attribution is available after app installation has been tracked by the adjust backend and attribution callback has been initially triggered. From that moment on, Adjust SDK has information about your user's attribution and you can access it with this method. So, **it is not possible** to access user's attribution value before the SDK has been initialised and attribution callback has been initially triggered. ### Push token @@ -616,7 +669,7 @@ If you want to use the Adjust SDK to recognize users that found your app pre-ins ### Deep linking -If you are using the adjust tracker URL with an option to deep link into your app from the URL, there is the possibility to get info about the deep link URL and its content. Hitting the URL can happen when the user has your app already installed (standard deep linking scenario) or if they don't have the app on their device (deferred deep linking scenario). Both of these scenarios are supported by the adjust SDK and in both cases the deep link URL will be provided to you after you app has been started after hitting the tracker URL. In order to use this feature in your app, you need to set it up properly. +If you are using the adjust tracker URL with an option to deep link into your app from the URL, there is the possibility to get info about the deep link URL and its content. Hitting the URL can happen when the user has your app already installed (standard deep linking scenario) or if they don't have the app on their device (deferred deep linking scenario). Both of these scenarios are supported by the Adjust SDK and in both cases the deep link URL will be provided to you after you app has been started after hitting the tracker URL. In order to use this feature in your app, you need to set it up properly. ### Standard deep linking scenario @@ -696,7 +749,7 @@ We provide a helper function that allows you to convert a universal link to an o ### Deferred deep linking scenario -You can register a delegate callback to be notified before a deferred deep link is opened and decide if the adjust SDK will try to open it. The same optional protocol `AdjustDelegate` used for the [attribution callback](#attribution-callback) and for [event and session callbacks](#event-session-callbacks) is used. +You can register a delegate callback to be notified before a deferred deep link is opened and decide if the Adjust SDK will try to open it. The same optional protocol `AdjustDelegate` used for the [attribution callback](#attribution-callback) and for [event and session callbacks](#event-session-callbacks) is used. Follow the same steps and implement the following delegate callback function for deferred deep links: @@ -704,7 +757,7 @@ Follow the same steps and implement the following delegate callback function for - (BOOL)adjustDeeplinkResponse:(NSURL *)deeplink { // deeplink object contains information about deferred deep link content - // Apply your logic to determine whether the adjust SDK should try to open the deep link + // Apply your logic to determine whether the Adjust SDK should try to open the deep link return YES; // or // return NO; @@ -713,15 +766,15 @@ Follow the same steps and implement the following delegate callback function for The callback function will be called after the SDK receives a deffered deep link from our server and before opening it. Within the callback function you have access to the deep link. The returned boolean value determines if the SDK will launch the deep link. You could, for example, not allow the SDK to open the deep link at the current moment, save it, and open it yourself later. -If this callback is not implemented, **the adjust SDK will always try to open the deep link by default**. +If this callback is not implemented, **the Adjust SDK will always try to open the deep link by default**. ### Reattribution via deep links Adjust enables you to run re-engagement campaigns with usage of deep links. For more information on how to do that, please check our [official docs][reattribution-with-deeplinks]. -If you are using this feature, in order for your user to be properly reattributed, you need to make one additional call to the adjust SDK in your app. +If you are using this feature, in order for your user to be properly reattributed, you need to make one additional call to the Adjust SDK in your app. -Once you have received deep link content information in your app, add a call to the `appWillOpenUrl` method. By making this call, the adjust SDK will try to find if there is any new attribution info inside of the deep link and if any, it will be sent to the adjust backend. If your user should be reattributed due to a click on the adjust tracker URL with deep link content in it, you will see the [attribution callback](#attribution-callback) in your app being triggered with new attribution info for this user. +Once you have received deep link content information in your app, add a call to the `appWillOpenUrl` method. By making this call, the Adjust SDK will try to find if there is any new attribution info inside of the deep link and if any, it will be sent to the adjust backend. If your user should be reattributed due to a click on the adjust tracker URL with deep link content in it, you will see the [attribution callback](#attribution-callback) in your app being triggered with new attribution info for this user. The call to `appWillOpenUrl` should be done like this to support deep linking reattributions in all iOS versions: @@ -759,9 +812,9 @@ The call to `appWillOpenUrl` should be done like this to support deep linking re ### Issues with delayed SDK initialisation -As described in the [basic setup step](#basic-setup), we strongly advise you to initialise the adjust SDK in the `didFinishLaunching` or `didFinishLaunchingWithOptions` method of your app delegate. It is imperative to initialise the adjust SDK in as soon as possible so that you can use all the features of the SDK. +As described in the [basic setup step](#basic-setup), we strongly advise you to initialise the Adjust SDK in the `didFinishLaunching` or `didFinishLaunchingWithOptions` method of your app delegate. It is imperative to initialise the Adjust SDK in as soon as possible so that you can use all the features of the SDK. -Deciding not to initialise the adjust SDK immediately can have all kinds of impacts on the tracking in your app: **In order to perform any kind of tracking in your app, the adjust SDK *must* be initialised.** +Deciding not to initialise the Adjust SDK immediately can have all kinds of impacts on the tracking in your app: **In order to perform any kind of tracking in your app, the Adjust SDK *must* be initialised.** If you decide to perform any of these actions: @@ -772,13 +825,13 @@ If you decide to perform any of these actions: before initialising the SDK, `they won't be performed`. -If you want any of these actions to be tracked with the adjust SDK before its actual initialisation, you must build a `custom actions queueing mechanism` inside your app. You need to queue all the actions you want our SDK to perform and perform them once the SDK is initialised. +If you want any of these actions to be tracked with the Adjust SDK before its actual initialisation, you must build a `custom actions queueing mechanism` inside your app. You need to queue all the actions you want our SDK to perform and perform them once the SDK is initialised. Offline mode state won't be changed, tracking enabled/disabled state won't be changed, deep link reattributions will not be possible to happen, any of tracked events will be `dropped`. -Another thing which might be affected by delayed SDK initialisation is session tracking. The adjust SDK can't start to collect any session length info before it is actually initialised. This can affect your DAU numbers in the dashboard which might not be tracked properly. +Another thing which might be affected by delayed SDK initialisation is session tracking. The Adjust SDK can't start to collect any session length info before it is actually initialised. This can affect your DAU numbers in the dashboard which might not be tracked properly. -As an example, let's assume this scenario: You are initialising the adjust SDK when some specific view or view controller is loaded and let's say that this is not the splash nor the first screen in your app, but user has to navigate to it from the home screen. If user downloads your app and opens it, the home screen will be displayed. At this moment, this user has made an install which should be tracked. However, the adjust SDK doesn't know anything about this, because the user needs to navigate to the screen mentioned previously where you decided to initialise the adjust SDK. Further, if the user decides that he/she doesn't like the app and uninstalls it right after seeing home screen, all the information mentioned above will never be tracked by our SDK, nor displayed in the dashboard. +As an example, let's assume this scenario: You are initialising the Adjust SDK when some specific view or view controller is loaded and let's say that this is not the splash nor the first screen in your app, but user has to navigate to it from the home screen. If user downloads your app and opens it, the home screen will be displayed. At this moment, this user has made an install which should be tracked. However, the Adjust SDK doesn't know anything about this, because the user needs to navigate to the screen mentioned previously where you decided to initialise the Adjust SDK. Further, if the user decides that he/she doesn't like the app and uninstalls it right after seeing home screen, all the information mentioned above will never be tracked by our SDK, nor displayed in the dashboard. #### Event tracking @@ -798,18 +851,18 @@ As described [above](#deeplinking-reattribution), when handling deep link reattr [Adjust appWillOpenUrl:url] ``` -If you make this call before the SDK has been initialised, information about the attribution information from the deep link URL will be permanetly lost. If you want the adjust SDK to successfully reattribute your user, you would need to queue this `NSURL` object information and trigger `appWillOpenUrl` method once the SDK has been initialised. +If you make this call before the SDK has been initialised, information about the attribution information from the deep link URL will be permanetly lost. If you want the Adjust SDK to successfully reattribute your user, you would need to queue this `NSURL` object information and trigger `appWillOpenUrl` method once the SDK has been initialised. #### Session tracking -Session tracking is something what the adjust SDK performs automatically and is beyond reach of an app developer. For proper session tracking it is crucial to have the adjust SDK initialised as advised in this README. Not doing so can have unpredicted influences on proper session tracking and DAU numbers in the dashboard. +Session tracking is something what the Adjust SDK performs automatically and is beyond reach of an app developer. For proper session tracking it is crucial to have the Adjust SDK initialised as advised in this README. Not doing so can have unpredicted influences on proper session tracking and DAU numbers in the dashboard. For example: * A user opens but then deletes your app before the SDK was even inialised, causing the install and session to have never been tracked, thus never reported in the dashboard. -* If a user downloads and opens your app before midnight, and the adjust SDK gets initialised after midnight, all queued install and session data will be reported on wrong day. +* If a user downloads and opens your app before midnight, and the Adjust SDK gets initialised after midnight, all queued install and session data will be reported on wrong day. * If a user didn't use your app on some day but opens it shortly after midnight and the SDK gets initialised after midnight, causing DAU to be reported on another day from the day of the app opening. -For all these reasons, please follow the instructions in this document and initialise the adjust SDK in the `didFinishLaunching` or `didFinishLaunchingWithOptions` method of your app delegate. +For all these reasons, please follow the instructions in this document and initialise the Adjust SDK in the `didFinishLaunching` or `didFinishLaunchingWithOptions` method of your app delegate. ### I'm seeing "Adjust requires ARC" error @@ -819,7 +872,7 @@ Expand the `Compile Sources` group, select all adjust files and change the `Comp ### I'm seeing "[UIDevice adjTrackingEnabled]: unrecognized selector sent to instance" error -This error can occur when you are adding the adjust SDK framework to your app. The adjust SDK contains `categories` among it's source files and for this reason, if you have chosen this SDK integration approach, you need to add `-ObjC` flags to `Other Linker Flags` in your Xcode project settings. Adding this flag will fix this error. +This error can occur when you are adding the Adjust SDK framework to your app. The Adjust SDK contains `categories` among it's source files and for this reason, if you have chosen this SDK integration approach, you need to add `-ObjC` flags to `Other Linker Flags` in your Xcode project settings. Adding this flag will fix this error. ### I'm seeing the "Session failed (Ignoring too frequent session.)" error @@ -885,7 +938,7 @@ So, this message doesn't indicate any issue with your SDK integration but it's s ### I'm seeing incorrect revenue data in the adjust dashboard -The adjust SDK tracks what you tell it to track. If you are attaching revenue to your event, the number you write as an amount is the only amount which will reach the adjust backend and be displayed in the dashboard. Our SDK does not manipulate your amount value, nor does our backend. So, if you see wrong amount being tracked, it's because our SDK was told to track that amount. +The Adjust SDK tracks what you tell it to track. If you are attaching revenue to your event, the number you write as an amount is the only amount which will reach the adjust backend and be displayed in the dashboard. Our SDK does not manipulate your amount value, nor does our backend. So, if you see wrong amount being tracked, it's because our SDK was told to track that amount. Usually, a user's code for tracking revenue event looks something like this: @@ -933,20 +986,21 @@ If you are seing any value in the dashboard other than what you expected to be t [cocoapods]: http://cocoapods.org [transition]: http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html -[example-tvos]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-tvOS +[example-tvos]: examples/AdjustExample-tvOS +[example-iwatch]: examples/AdjustExample-iWatch +[example-imessage]: examples/AdjustExample-iMessage +[example-ios-objc]: examples/AdjustExample-iOS +[example-ios-swift]: examples/AdjustExample-Swift + [AEPriceMatrix]: https://github.com/adjust/AEPriceMatrix [event-tracking]: https://docs.adjust.com/en/event-tracking -[example-iwatch]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-iWatch [callbacks-guide]: https://docs.adjust.com/en/callbacks [universal-links]: https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html -[special-partners]: https://docs.adjust.com/en/special-partners -[attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md -[example-ios-objc]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-iOS -[example-ios-swift]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-Swift -[ios-web-views-guide]: doc/english/web_views.md -[currency-conversion]: https://docs.adjust.com/en/event-tracking/#tracking-purchases-in-different-currencies - +[special-partners]: https://docs.adjust.com/en/special-partners +[attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md +[ios-web-views-guide]: doc/english/web_views.md +[currency-conversion]: https://docs.adjust.com/en/event-tracking/#tracking-purchases-in-different-currencies [universal-links-guide]: https://docs.adjust.com/en/universal-links/ [adjust-universal-links]: https://docs.adjust.com/en/universal-links/#redirecting-to-universal-links-directly [universal-links-testing]: https://docs.adjust.com/en/universal-links/#testing-universal-link-implementations @@ -972,9 +1026,9 @@ If you are seing any value in the dashboard other than what you expected to be t ## License -The adjust SDK is licensed under the MIT License. +The Adjust SDK is licensed under the MIT License. -Copyright (c) 2012-2017 adjust GmbH, +Copyright (c) 2012-2018 adjust GmbH, http://www.adjust.com Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/Scripts/build.sh b/Scripts/build.sh deleted file mode 100755 index 68e498de6..000000000 --- a/Scripts/build.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash - -# End script if one of the lines fails -set -e - -# Go to root folder -cd .. - -# Clean the folders -rm -rf Frameworks/Static -rm -rf Frameworks/Dynamic -rm -rf Frameworks/tvOS - -# Create needed folders -mkdir -p Frameworks/Static -mkdir -p Frameworks/Dynamic -mkdir -p Frameworks/tvOS - -# Build static AdjustSdk.framework -xcodebuild -target AdjustStatic -configuration Release clean build - -# Build dynamic AdjustSdk.framework -xcodebuild -target AdjustSdk -configuration Release clean build - -# Build tvOS AdjustSdkTV.framework -# Build it for simulator and device -xcodebuild -configuration Release -target AdjustSdkTv -arch x86_64 -sdk appletvsimulator clean build -xcodebuild -configuration Release -target AdjustSdkTv -arch arm64 -sdk appletvos clean build - -# Copy tvOS framework to destination -cp -R build/Release-appletvos/AdjustSdkTv.framework Frameworks/tvOS - -# Create universal tvOS framework -lipo -create -output Frameworks/tvOS/AdjustSdkTv.framework/AdjustSdkTv build/Release-appletvos/AdjustSdkTv.framework/AdjustSdkTv build/Release-appletvsimulator/AdjustSdkTv.framework/AdjustSdkTv - -# Build Carthage AdjustSdk.framework -carthage build --no-skip-current - -# Copy build Carthage framework to Frameworks folder -cp -R Carthage/Build/iOS/* Frameworks/Dynamic/ - -# Build static AdjustTestLibrary.framework -cd AdjustTests/AdjustTestLibrary -xcodebuild -target AdjustTestLibraryStatic -configuration Debug clean build diff --git a/VERSION b/VERSION index d2b9909a9..0fb7a35b6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.14.1 +4.14.2 diff --git a/doc/english/migrate.md b/doc/english/migrate.md index c1a70a26c..09a05c203 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for iOS to v4.14.1 from v3.4.0 +## Migrate your adjust SDK for iOS to v4.14.2 from v3.4.0 ### Initial setup diff --git a/doc/english/web_view_migration.md b/doc/english/web_view_migration.md new file mode 100644 index 000000000..6036f5005 --- /dev/null +++ b/doc/english/web_view_migration.md @@ -0,0 +1,24 @@ +## Migrate your Adjust web bridge SDK to v4.14.0 or later from v4.9.1 or earlier + +### Integration + +Before, it was required to manualy drag-and-drop source files into your project to integrate the Adjust web view bridge. One of the main reasons to have to do this, was that we required the Javascript files from Adjust to be used on the view. Now that the Javascript files are injected into the view, it's possible to integrate the Adjust web bridge SDK by using either Cocoapods or Carthage. + +Whether you choose to keep the direct source files integration, or use Cocoapods/Carthage, you may remove the Adjust Javascript files you imported previously and their reference from your HTML file(s). + +### Adjust config + +The Adjust web bridge SDK is now accessing the bridge reference directly by name, so it's no longer necessary to pass +the bridge instance when creating the `AdjustConfig` object. So while previously you would do this: + +```js +var adjustConfig = new AdjustConfig(bridge, yourAppToken, environment); +``` + +Now you should do: + +```js +var adjustConfig = new AdjustConfig(yourAppToken, environment); +``` + +We are still detecting the previous API signature to be compatible, but you should change it when migrating. diff --git a/doc/english/web_views.md b/doc/english/web_views.md index 4be2be619..409412266 100644 --- a/doc/english/web_views.md +++ b/doc/english/web_views.md @@ -1,92 +1,151 @@ ## Summary -This is the guide to the iOS SDK of adjust.com™ for iOS apps which are using web views. You can read more about adjust.com™ -at [adjust.com]. +This is the guide to the iOS SDK of Adjust™ for iOS apps which are using web views. You can read more about Adjust™ at [adjust.com]. -It provides a bridge from Javascript to native Objective-C calls (and vice versa) by using the -[WebViewJavascriptBridge][web_view_js_bridge] plugin. This plugin is also licensed under `MIT License`. +It provides a bridge from Javascript to native Objective-C calls (and vice versa) by using the [WebViewJavascriptBridge][web_view_js_bridge] plugin. This plugin is also licensed under `MIT License`. ## Table of contents +* [Example app](#example-app) * [Basic integration](#basic-integration) - * [Add native adjust iOS SDK](#native-add) - * [Add AdjustBridge to your project](#bridge-add) + * [Add the SDK with the web bridge to your project](#sdk-add) + * [Add iOS frameworks](#sdk-frameworks) + * [Integrate the SDK into your app](#sdk-integrate) * [Integrate AdjustBridge into your app](#bridge-integrate-app) * [Integrate AdjustBridge into your web view](#bridge-integrate-web) * [Basic setup](#basic-setup) - * [AdjustBridge logging](#bridge-logging) + * [Adjust logging](#adjust-logging) * [Build your app](#build-the-app) * [Additional features](#additional-features) * [Event tracking](#event-tracking) * [Revenue tracking](#revenue-tracking) + * [Revenue deduplication](#revenue-deduplication) * [Callback parameters](#callback-parameters) * [Partner parameters](#partner-parameters) + * [Session parameters](#session-parameters) + * [Session callback parameters](#session-callback-parameters) + * [Session partner parameters](#session-partner-parameters) + * [Delay start](#delay-start) * [Attribution callback](#attribution-callback) * [Event and session callbacks](#event-session-callbacks) - * [Event buffering](#event-buffering) * [Disable tracking](#disable-tracking) * [Offline mode](#offline-mode) + * [Event buffering](#event-buffering) + * [GDPR right to be forgotten](#gdpr-forget-me) + * [SDK signature](#sdk-signature) * [Background tracking](#background-tracking) * [Device IDs](#device-ids) + * [iOS Advertising Identifier](#di-idfa) + * [Adjust device identifier](#di-adid) + * [User attribution](#user-attribution) + * [Push token](#push-token) + * [Pre-installed trackers](#pre-installed-trackers) * [Deep linking](#deeplinking) - * [Deferred deeplink callback](#deferred-deeplinking-callback) + * [Standard deep linking scenario](#deeplinking-standard) + * [Deep linking on iOS 8 and earlier](#deeplinking-setup-old) + * [Deep linking on iOS 9 and later](#deeplinking-setup-new) + * [Deferred deep linking scenario](#deeplinking-deferred) + * [Reattribution via deep links](#deeplinking-reattribution) * [License](#license) -## Basic integration +## Example app + +In the repository, you can find an example [`iOS app with web view`][example-webview]. You can use this project to see how the Adjust SDK can be integrated. + +## Basic integration -### Add native adjust iOS SDK +If you are migrating from the web bridge SDK v4.9.1 or previous, please follow [this migration guide](web_view_migration.md) when updating to this new version. -In oder to use adjust SDK in your web views, you need to add adjust's native iOS SDK to your app. To install adjust's native iOS SDK, follow the `Basic integration` chapter of our [iOS SDK README][basic_integration]. +We will describe the steps to integrate the Adjust SDK into your iOS project. We are going to assume that you are using Xcode for your iOS development. -### Add AdjustBridge to your project +### Add the SDK with the web bridge to your project -In Xcode's `Project Navigator` locate the `Supporting Files` group (or any other group of your choice). From Finder drag -the `AdjustBridge` subdirectory into Xcode's `Supporting Files` group. +If you're using [CocoaPods][cocoapods], you can add the following line to your `Podfile` and continue from [this step](#sdk-integrate): -![][bridge_drag] +```ruby +pod 'Adjust/WebBridge', '~> 4.14.2' +``` + +--- -In the dialog `Choose options for adding these files` make sure to check the checkbox to -`Copy items into destination group's folder` and select the upper radio button to `Create groups for any added folders`. +If you're using [Carthage][carthage], you can add following line to your `Cartfile` and continue from [this step](#sdk-frameworks): + +```ruby +github "adjust/ios_sdk" +``` -![][bridge_add] +--- -### 3. Integrate AdjustBridge into your app +You can also choose to integrate the Adjust SDK by adding it to your project as a framework. On the [releases page][releases] you can find the following archives: + +* `AdjustSdkStaticWebBridge.framework.zip` +* `AdjustSdkDynamicWebBridge.framework.zip` + +Since the release of iOS 8, Apple has introduced dynamic frameworks (also known as embedded frameworks). If your app is targeting iOS 8 or higher, you can use the Adjust SDK dynamic framework. Choose which framework you want to use – static or dynamic – and add it to your project. + +### Add iOS frameworks + +1. Select your project in the Project Navigator +2. In the left-hand side of the main view, select your target +3. In the `Build Phases` tab, expand the `Link Binary with Libraries` group +4. At the bottom of that section, select the `+` button +5. Select the `AdSupport.framework`, then the `Add` button +6. Repeat the same steps to add the `iAd.framework` and `CoreTelephony.framework` +7. Change the `Status` of the frameworks to `Optional`. + +### Integrate the SDK into your app + +If you added the Adjust SDK via a Pod repository, you should use one of the following import statements in your app's source files: + +```objc +#import "AdjustBridge.h" +``` + +--- + +If you added the Adjust SDK as a static/dynamic framework or via Carthage, you should use the following import statement in your app's source files: + +```objc +#import +``` + +Next, we'll set up basic session tracking. + +### Integrate AdjustBridge into your app In the Project Navigator open the source file your View Controller. Add the `import` statement at the top of the file. In the `viewDidLoad` or `viewWillAppear` method of your Web View Delegate add the following calls to `AdjustBridge`: ```objc -#import "Adjust.h" -// Or #import -// (depends on the way you have chosen to add our native iOS SDK) -// ... +#import "AdjustBridge.h" +// or #import - (void)viewWillAppear:(BOOL)animated { UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; // or with WKWebView: - // WKWebView *webView = [[NSClassFromString(@"WKWebView") alloc] initWithFrame:self.view.bounds]; + // WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds]; - AdjustBridge *adjustBridge = [[AdjustBridge alloc] init]; - [adjustBridge loadUIWebViewBridge:webView]; + // add @property (nonatomic, strong) AdjustBridge *adjustBridge; on your interface + self.adjustBridge = [[AdjustBridge alloc] init]; + [self.adjustBridge loadUIWebViewBridge:webView]; // optionally you can add a web view delegate so that you can also capture its events - // [adjustBridge loadUIWebViewBridge:webView webViewDelegate:(UIWebViewDelegate*)self]; + // [self.adjustBridge loadUIWebViewBridge:webView webViewDelegate:(UIWebViewDelegate*)self]; // or with WKWebView: - // [adjustBridge loadWKWebViewBridge:webView]; + // [self.adjustBridge loadWKWebViewBridge:webView]; // optionally you can add a web view delegate so that you can also capture its events - // [adjustBridge loadWKWebViewBridge:webView wkWebViewDelegate:(id)self]; + // [self.adjustBridge loadWKWebViewBridge:webView wkWebViewDelegate:(id)self]; } // ... ``` -![][bridge_init_objc] +You also can make use of the WebViewJavascriptBridge library we include, by using the `bridgeRegister` property of the `AdjustBridge` instance. +The register/call handler interface is similar to what WebViewJavascriptBridge does for ObjC. See [the library documentation](https://github.com/marcuswestin/WebViewJavascriptBridge#usage) for how to use it. -### Integrate AdjustBrige into your web view +### Integrate AdjustBrige into your web view -To use the Javascript bridge on your web view, it must be configured like the `WebViewJavascriptBridge` plugin -[README][wvjsb_readme] is advising in section `4`. Include the following Javascript code to intialize the adjust iOS web -bridge: +To use the Javascript bridge on your web view, it must be configured like the `WebViewJavascriptBridge` plugin [README][wvjsb_readme] is advising in section `4`. Include the following Javascript code to intialize the Adjust iOS web bridge: ```js function setupWebViewJavascriptBridge(callback) { @@ -107,174 +166,236 @@ function setupWebViewJavascriptBridge(callback) { setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0) } - -setupWebViewJavascriptBridge(function(bridge) { - // AdjustBridge initialisation will be added in this method. -}) ``` Take notice that the line `WVJBIframe.src = 'https://__bridge_loaded__';` was changed in version 4.11.6 from `WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';` due to a change in the `WebViewJavascriptBridge` plugin. -![][bridge_init_js] - -### Basic setup +### Basic setup -In your HTML file, add references to the adjust Javascript files: - -```html - - - -``` - -Once you added references to Javascript files, you can use them in your HTML file to initialise the adjust SDK: +In the same HTML file, initialise the Adjust SDK inside the `setupWebViewJavascriptBridge` callback: ```js setupWebViewJavascriptBridge(function(bridge) { // ... - var yourAppToken = '{YourAppToken}' - var environment = AdjustConfig.EnvironmentSandbox - var adjustConfig = new AdjustConfig(bridge, yourAppToken, environment) + var yourAppToken = yourAppToken; + var environment = AdjustConfig.EnvironmentSandbox; + var adjustConfig = new AdjustConfig(yourAppToken, environment); - Adjust.appDidLaunch(adjustConfig) + Adjust.appDidLaunch(adjustConfig); // ... -)} +}); ``` -![][bridge_init_js_xcode] +**Note**: Initialising the Adjust SDK like this is `very important`. Otherwise, you may encounter different kinds of issues as described in our [troubleshooting section](#ts-delayed-init). -Replace `{YourAppToken}` with your app token. You can find it in your [dashboard]. +Replace `yourAppToken` with your app token. You can find this in your [dashboard]. Depending on whether you build your app for testing or for production, you must set `environment` with one of these values: ```js -var environment = AdjustConfig.EnvironmentSandbox -var environment = AdjustConfig.EnvironmentProduction +var environment = AdjustConfig.EnvironmentSandbox; +var environment = AdjustConfig.EnvironmentProduction; ``` -**Important:** This value should be set to `AdjustConfig.EnvironmentSandbox` if and only if you or someone else is testing -your app. Make sure to set the environment to `AdjustConfig.EnvironmentProduction` just before you publish the app. Set it -back to `AdjustConfig.EnvironmentSandbox` when you start developing and testing it again. +**Important:** This value should be set to `AdjustConfig.EnvironmentSandbox` if and only if you or someone else is testing your app. Make sure to set the environment to `AdjustConfig.EnvironmentProduction` just before you publish the app. Set it back to `AdjustConfig.EnvironmentSandbox` when you start developing and testing it again. -We use this environment to distinguish between real traffic and test traffic from test devices. It is very important that -you keep this value meaningful at all times! This is especially important if you are tracking revenue. +We use this environment to distinguish between real traffic and test traffic from test devices. It is very important that you keep this value meaningful at all times! This is especially important if you are tracking revenue. -### AdjustBridge logging +### Adjust logging -You can increase or decrease the amount of logs you see in tests by calling `setLogLevel` on your `AdjustConfig` instance -with one of the following parameters: +You can increase or decrease the amount of logs that you see during testing by calling `setLogLevel:` on your `ADJConfig` instance with one of the following parameters: -```objc -adjustConfig.setLogLevel(AdjustConfig.LogLevelVerbose) // enable all logging -adjustConfig.setLogLevel(AdjustConfig.LogLevelDebug) // enable more logging -adjustConfig.setLogLevel(AdjustConfig.LogLevelInfo) // the default -adjustConfig.setLogLevel(AdjustConfig.LogLevelWarn) // disable info logging -adjustConfig.setLogLevel(AdjustConfig.LogLevelError) // disable warnings as well -adjustConfig.setLogLevel(AdjustConfig.LogLevelAssert) // disable errors as well +```js +adjustConfig.setLogLevel(AdjustConfig.LogLevelVerbose) // enable all logging +adjustConfig.setLogLevel(AdjustConfig.LogLevelDebug) // enable more logging +adjustConfig.setLogLevel(AdjustConfig.LogLevelInfo) // the default +adjustConfig.setLogLevel(AdjustConfig.LogLevelWarn) // disable info logging +adjustConfig.setLogLevel(AdjustConfig.LogLevelError) // disable warnings as well +adjustConfig.setLogLevel(AdjustConfig.LogLevelAssert) // disable errors as well +adjustConfig.setLogLevel(AdjustConfig.LogLevelSuppress) // disable all logging +``` + +If you don't want your app in production to display any logs coming from the Adjust SDK, then you should select `AdjustConfig.LogLevelSuppress` and in addition to that, initialise `AdjustConfig` object with another constructor where you should enable suppress log level mode with `true` in the third parameter: + +```js +setupWebViewJavascriptBridge(function(bridge) { + // ... + + var yourAppToken = yourAppToken; + var environment = AdjustConfig.EnvironmentSandbox; + var adjustConfig = new AdjustConfig(yourAppToken, environment, true); + + Adjust.appDidLaunch(adjustConfig); + + // ... +}); ``` -### Build your app +### Build your app Build and run your app. If the build succeeds, you should carefully read the SDK logs in the console. After the app launches for the first time, you should see the info log `Install tracked`. -![][bridge_install_tracked] - -## Additional features +## Additional features -Once you integrate the adjust SDK into your project, you can take advantage of the following features. +Once you integrate the Adjust SDK into your project, you can take advantage of the following features. -### Event tracking +### Event tracking -You can use adjust to track events. Let's say you want to track every tap on a particular button. You would create a new -event token in your [dashboard], which has an associated event token - looking something like `abc123`. In your button's -`onclick` method you would then add the following lines to track the tap: +You can use Adjust to track events. Let's say you want to track every tap on a particular button. You would create a new event token in your [dashboard], which has an associated event token - looking something like `abc123`. In your button's `onclick` method you would then add the following lines to track the tap: ```js -var adjustEvent = new AdjustEvent('abc123') -Adjust.trackEvent(adjustEvent) +var adjustEvent = new AdjustEvent('abc123'); +Adjust.trackEvent(adjustEvent); ``` When tapping the button you should now see `Event tracked` in the logs. The event instance can be used to configure the event even more before tracking it. -#### Revenue tracking +### Revenue tracking -If your users can generate revenue by tapping on advertisements or making in-app purchases you can track those revenues with -events. Lets say a tap is worth one Euro cent. You could then track the revenue event like this: +If your users can generate revenue by tapping on advertisements or making in-app purchases you can track those revenues with events. Lets say a tap is worth one Euro cent. You could then track the revenue event like this: ```js -var adjustEvent = new AdjustEvent('abc123') -adjustEvent.setRevenue(0.01, 'EUR') - -Adjust.trackEvent(adjustEvent) +var adjustEvent = new AdjustEvent(eventToken); +adjustEvent.setRevenue(0.01, 'EUR'); +Adjust.trackEvent(adjustEvent); ``` This can be combined with callback parameters of course. -When you set a currency token, adjust will automatically convert the incoming revenues into a reporting revenue of your -choice. Read more about [currency conversion here.][currency-conversion] +When you set a currency token, Adjust will automatically convert the incoming revenues into a reporting revenue of your choice. Read more about [currency conversion here.][currency-conversion] You can read more about revenue and event tracking in the [event tracking guide][event-tracking-guide]. -#### Callback parameters +### Revenue deduplication -You can register a callback URL for your events in your [dashboard]. We will send a GET request to that URL whenever the -event gets tracked. You can add callback parameters to that event by calling `addCallbackParameter` on the event before -tracking it. We will then append these parameters to your callback URL. +You can also pass in an optional transaction ID to avoid tracking duplicate revenues. The last ten transaction IDs are remembered and revenue events with duplicate transaction IDs are skipped. This is especially useful for in-app purchase tracking. -For example, suppose you have registered the URL `http://www.adjust.com/callback` then track an event like this: +If you have access to the transaction indentifier from the web view, you can pass it to the `setTransactionId` method on the Adjust event object. That way you can avoid tracking revenue that is not actually being generated. ```js -var adjustEvent = new AdjustEvent('abc123') -adjustEvent.addCallbackParameter('key', 'value') -adjustEvent.addCallbackParameter('foo', 'bar') +var adjustEvent = new AdjustEvent(eventToken); +adjustEvent.setTransactionId(transactionIdentifier); +Adjust.trackEvent(adjustEvent); +``` -Adjust.trackEvent(adjustEvent) +### Callback parameters + +You can register a callback URL for your events in your [dashboard]. We will send a GET request to that URL whenever the event gets tracked. You can add callback parameters to that event by calling `addCallbackParameter` on the event before tracking it. We will then append these parameters to your callback URL. + +For example, suppose you have registered the URL `http://www.adjust.com/callback` then track an event like this: + +```js +var adjustEvent = new AdjustEvent(eventToken); +adjustEvent.addCallbackParameter('key', 'value'); +adjustEvent.addCallbackParameter('foo', 'bar'); +Adjust.trackEvent(adjustEvent); ``` In that case we would track the event and send a request to: http://www.adjust.com/callback?key=value&foo=bar -It should be mentioned that we support a variety of placeholders like `{idfa}` that can be used as parameter values. In the -resulting callback this placeholder would be replaced with the ID for Advertisers of the current device. Also note that we -don't store any of your custom parameters, but only append them to your callbacks. If you haven't registered a callback for -an event, these parameters won't even be read. +It should be mentioned that we support a variety of placeholders like `{idfa}` that can be used as parameter values. In the resulting callback this placeholder would be replaced with the ID for Advertisers of the current device. Also note that we don't store any of your custom parameters, but only append them to your callbacks. If you haven't registered a callback for an event, these parameters won't even be read. -You can read more about using URL callbacks, including a full list of available values, in our -[callbacks guide][callbacks-guide]. +You can read more about using URL callbacks, including a full list of available values, in our [callbacks guide][callbacks-guide]. -#### Partner parameters +### Partner parameters -You can also add parameters to be transmitted to network partners, for the integrations that have been activated in your -adjust dashboard. +You can also add parameters to be transmitted to network partners, for the integrations that have been activated in your Adjust dashboard. -This works similarly to the callback parameters mentioned above, but can be added by calling the `addPartnerParameter` -method on your `AdjustEvent` instance. +This works similarly to the callback parameters mentioned above, but can be added by calling the `addPartnerParameter` method on your `AdjustEvent` instance. ```js -var adjustEvent = new AdjustEvent('abc123') -adjustEvent.addPartnerParameter('key', 'value') -adjustEvent.addPartnerParameter('foo', 'bar') - -Adjust.trackEvent(adjustEvent) +var adjustEvent = new AdjustEvent('abc123'); +adjustEvent.addPartnerParameter('key', 'value'); +adjustEvent.addPartnerParameter('foo', 'bar'); +Adjust.trackEvent(adjustEvent); ``` You can read more about special partners and these integrations in our [guide to special partners][special-partners]. -### Attribution callback +### Session parameters + +Some parameters are saved to be sent in every event and session of the Adjust SDK. Once you have added any of these parameters, you don't need to add them every time, since they will be saved locally. If you add the same parameter twice, there will be no effect. -You can register a callback method to be notified of attribution changes. Due to the different sources considered -for attribution, this information cannot by provided synchronously. +If you want to send session parameters with the initial install event, they must be called before the Adjust SDK launches via `Adjust.appDidLaunch()`. If you need to send them with an install, but can only obtain the needed values after launch, it's possible to [delay](#delay-start) the first launch of the Adjust SDK to allow this behavior. + +### Session callback parameters + +The same callback parameters that are registered for [events](#callback-parameters) can be also saved to be sent in every event or session of the Adjust SDK. + +The session callback parameters have a similar interface of the event callback parameters. Instead of adding the key and it's value to an event, it's added through a call to `Adjust` method `addSessionCallbackParameter(key,value)`: + +```js +Adjust.addSessionCallbackParameter('foo', 'bar'); +``` + +The session callback parameters will be merged with the callback parameters added to an event. The callback parameters added to an event have precedence over the session callback parameters. Meaning that, when adding a callback parameter to an event with the same key to one added from the session, the value that prevails is the callback parameter added to the event. + +It's possible to remove a specific session callback parameter by passing the desiring key to the method `removeSessionCallbackParameter`. + +```js +Adjust.removeSessionCallbackParameter('foo'); +``` + +If you wish to remove all key and values from the session callback parameters, you can reset it with the method `resetSessionCallbackParameters`. + +```js +Adjust.resetSessionCallbackParameters(); +``` + +### Session partner parameters + +In the same way that there is [session callback parameters](#session-callback-parameters) that are sent every in event or session of the Adjust SDK, there is also session partner parameters. + +These will be transmitted to network partners, for the integrations that have been activated in your Adjust [dashboard]. + +The session partner parameters have a similar interface to the event partner parameters. Instead of adding the key and it's value to an event, it's added through a call to `Adjust` method `addSessionPartnerParameter:value:`: + +```js +Adjust.addSessionPartnerParameter('foo','bar'); +``` + +The session partner parameters will be merged with the partner parameters added to an event. The partner parameters added to an event have precedence over the session partner parameters. Meaning that, when adding a partner parameter to an event with the same key to one added from the session, the value that prevails is the partner parameter added to the event. + +It's possible to remove a specific session partner parameter by passing the desiring key to the method `removeSessionPartnerParameter`. + +```js +Adjust.removeSessionPartnerParameter('foo'); +``` + +If you wish to remove all key and values from the session partner parameters, you can reset it with the method `resetSessionPartnerParameters`. + +```js +Adjust.resetSessionPartnerParameters(); +``` + +### Delay start + +Delaying the start of the Adjust SDK allows your app some time to obtain session parameters, such as unique identifiers, to be send on install. + +Set the initial delay time in seconds with the method `setDelayStart` in the `AdjustConfig` instance: + +```js +adjustConfig.setDelayStart(5.5); +``` + +In this case this will make the Adjust SDK not send the initial install session and any event created for 5.5 seconds. After this time is expired or if you call `Adjust.sendFirstPackages()` in the meanwhile, every session parameter will be added to the delayed install session and events and the Adjust SDK will resume as usual. + +**The maximum delay start time of the Adjust SDK is 10 seconds**. + +### Attribution callback + +You can register a callback method to be notified of attribution changes. Due to the different sources considered for attribution, this information cannot by provided synchronously. Please make sure to consider our [applicable attribution data policies][attribution-data]. -As the callback method is configured using the `AdjustConfig` instance, you should call `setAttributionCallback` before -calling `Adjust.appDidLaunch(adjustConfig)`. +As the callback method is configured using the `AdjustConfig` instance, you should call `setAttributionCallback` before calling `Adjust.appDidLaunch(adjustConfig)`. ```js adjustConfig.setAttributionCallback(function(attribution) { @@ -285,12 +406,12 @@ adjustConfig.setAttributionCallback(function(attribution) { 'Campaign = ' + attribution.campaign + '\n' + 'Adgroup = ' + attribution.adgroup + '\n' + 'Creative = ' + attribution.creative + '\n' + - 'Click label = ' + attribution.clickLabel) -}) + 'Click label = ' + attribution.clickLabel + '\n' + + 'Adid = ' + attribution.adid); +}); ``` -The callback method will get triggered when the SDK receives final attribution data. Within the callback you have access to -the `attribution` parameter. Here is a quick summary of its properties: +The callback method will get triggered when the SDK receives final attribution data. Within the callback you have access to the `attribution` parameter. Here is a quick summary of its properties: - `var trackerToken` the tracker token of the current install. - `var trackerName` the tracker name of the current install. @@ -299,19 +420,20 @@ the `attribution` parameter. Here is a quick summary of its properties: - `var adgroup` the ad group grouping level of the current install. - `var creative` the creative grouping level of the current install. - `var clickLabel` the click label of the current install. +- `var adid` the unique device identifier provided by attribution. -### Event and session callbacks +If any value is unavailable, it will not be part of the of the attribution object. -You can register a listener to be notified when events or sessions are tracked. There are four listeners: one for tracking -successful events, one for tracking failed events, one for tracking successful sessions and one for tracking failed -sessions. +### Event and session callbacks + +You can register a callback to be notified when events or sessions are tracked. There are four callbacks: one for tracking successful events, one for tracking failed events, one for tracking successful sessions and one for tracking failed sessions. Follow these steps and implement the following callback methods to track successful events: ```js adjustConfig.setEventSuccessCallback(function(eventSuccess) { // ... -}) +}); ``` The following delegate callback function to track failed events: @@ -319,7 +441,7 @@ The following delegate callback function to track failed events: ```js adjustConfig.setEventFailureCallback(function(eventFailure) { // ... -}) +}); ``` To track successful sessions: @@ -327,7 +449,7 @@ To track successful sessions: ```js adjustConfig.setSessionSuccessCallback(function(sessionSuccess) { // ... -}) +}); ``` And to track failed sessions: @@ -335,16 +457,14 @@ And to track failed sessions: ```js adjustConfig.setSessionFailureCallback(function(sessionFailure) { // ... -}) +}); ``` -The callback methods will be called after the SDK tries to send a package to the server. Within the callback methods you -have access to a response data object specifically for that callback. Here is a quick summary of the session response data -properties: +The callback methods will be called after the SDK tries to send a package to the server. Within the callback methods you have access to a response data object specifically for that callback. Here is a quick summary of the session response data properties: - `var message` the message from the server or the error logged by the SDK. - `var timeStamp` timestamp from the server. -- `var adid` a unique device identifier provided by adjust. +- `var adid` a unique device identifier provided by Adjust. - `var jsonResponse` the JSON object with the response from the server. Both event response data objects contain: @@ -355,26 +475,15 @@ And both event and session failed objects also contain: - `var willRetry` indicates there will be an attempt to resend the package at a later time. -### Event buffering - -If your app makes heavy use of event tracking, you might want to delay some HTTP requests in order to send them in one batch -every minute. You can enable event buffering with your `AdjustConfig` instance: - -```js -adjustConfig.setEventBufferingEnabled(true) -``` +### Disable tracking -### Disable tracking - -You can disable the adjust SDK from tracking any activities of the current device by calling `setEnabled` with parameter -`false`. **This setting is remembered between sessions**, but it can only be activated after the first session. +You can disable the Adjust SDK from tracking any activities of the current device by calling `setEnabled` with parameter `false`. **This setting is remembered between sessions**. ```js -Adjust.setEnabled(false) +Adjust.setEnabled(false); ``` -You can check if the adjust SDK is currently enabled by calling the function `isEnabled`. It is always -possible to activate the adjust SDK by invoking `setEnabled` with the enabled parameter as `true`. +You can check if the Adjust SDK is currently enabled by calling the function `isEnabled`. ```js Adjust.isEnabled(function(isEnabled) { @@ -383,40 +492,72 @@ Adjust.isEnabled(function(isEnabled) { } else { // SDK is disabled. } -}) +}); ``` -### Offline mode +It is always possible to activate the Adjust SDK by invoking `setEnabled` with the enabled parameter as `true`. -You can put the adjust SDK in offline mode to suspend transmission to our servers while retaining tracked data to be sent -later. While in offline mode, all information is saved in a file, so be careful not to trigger too many events while in -offline mode. +### Offline mode + +You can put the Adjust SDK in offline mode to suspend transmission to our servers while retaining tracked data to be sent later. While in offline mode, all information is saved in a file, so be careful not to trigger too many events while in offline mode. You can activate offline mode by calling `setOfflineMode` with the parameter `true`. ```js -Adjust.setOfflineMode(true) +Adjust.setOfflineMode(true); +``` + +Conversely, you can deactivate offline mode by calling `setOfflineMode` with `false`. When the Adjust SDK is put back in online mode, all saved information is send to our servers with the correct time information. + +Unlike disabling tracking, this setting is **not remembered bettween sessions**. This means that the SDK is in online mode whenever it is started, even if the app was terminated in offline mode. + +### Event buffering + +If your app makes heavy use of event tracking, you might want to delay some network requests in order to send them in one batch every minute. You can enable event buffering with your `AdjustConfig` instance: + +```js +adjustConfig.setEventBufferingEnabled(true); ``` -Conversely, you can deactivate offline mode by calling `setOfflineMode` with `false`. When the adjust SDK is put back in -online mode, all saved information is send to our servers with the correct time information. +### GDPR right to be forgotten + +In accordance with article 17 of the EU's General Data Protection Regulation (GDPR), you can notify Adjust when a user has exercised their right to be forgotten. Calling the following method will instruct the Adjust SDK to communicate the user's choice to be forgotten to the Adjust backend: -Unlike disabling tracking, this setting is **not remembered bettween sessions**. This means that the SDK is in online mode -whenever it is started, even if the app was terminated in offline mode. +```js +Adjust.gdprForgetMe(); +``` -### Background tracking +Upon receiving this information, Adjust will erase the user's data and the Adjust SDK will stop tracking the user. No requests from this device will be sent to Adjust in the future. -The default behaviour of the adjust SDK is to pause sending HTTP requests while the app is in the background. You can change -this behaviour in your `AdjustConfig` instance: +### SDK signature + +The Adjust SDK signature is enabled on a client-by-client basis. If you are interested in using this feature, please contact your account manager. + +If the SDK signature has already been enabled on your account and you have access to App Secrets in your Adjust Dashboard, please use the method below to integrate the SDK signature into your app. + +An App Secret is set by calling `setAppSecret` on your `AdjustConfig` instance: ```js -adjustConfig.setSendInBackground(true) +adjustConfig.setAppSecret(secretId, info1, info2, info3, info4); ``` -### Device IDs +### Background tracking + +The default behaviour of the Adjust SDK is to pause sending network requests while the app is in the background. You can change this behaviour in your `AdjustConfig` instance: + +```js +adjustConfig.setSendInBackground(true); +``` -Certain services (such as Google Analytics) require you to coordinate Device and Client IDs in order to prevent duplicate -reporting. +If nothing is set, sending in background is **disabled by default**. + +### Device IDs + +The Adjust SDK offers you possibility to obtain some of the device identifiers. + +### iOS Advertising Identifier + +Certain services (such as Google Analytics) require you to coordinate device and client IDs in order to prevent duplicate reporting. To obtain the device identifier IDFA, call the function `getIdfa`: @@ -426,103 +567,237 @@ Adjust.getIdfa(function(idfa) { }); ``` -### Deep linking +### Adjust device identifier + +For each device with your app installed, Adjust backend generates unique **adjust device identifier** (**adid**). In order to obtain this identifier, you can make a call to the following method on the `Adjust` instance: + +```js +var adid = Adjust.getAdid(); +``` + +**Note**: Information about the **adid** is available after the app's installation has been tracked by the Adjust backend. From that moment on, the Adjust SDK has information about the device **adid** and you can access it with this method. So, **it is not possible** to access the **adid** before the SDK has been initialised and the installation of your app has been tracked successfully. + +### User attribution + +The attribution callback will be triggered as described in the [attribution callback section](#attribution-callback), providing you with the information about any new attribution when ever it changes. In any other case, where you want to access information about your user's current attribution, you can make a call to the following method of the `Adjust` object: + +```js +var attribution = Adjust.getAttribution(); +``` -You can set up the adjust SDK to handle deep links that are used to open your app via a custom URL scheme. +**Note**: Information about current attribution is available after app installation has been tracked by the Adjust backend and attribution callback has been initially triggered. From that moment on, Adjust SDK has information about your user's attribution and you can access it with this method. So, **it is not possible** to access user's attribution value before the SDK has been initialised and attribution callback has been initially triggered. -If you are planning to run retargeting or re-engagement campaigns with deep links, you should put the adjust campaign -specific parameter into your deep link. For more information on how to run retargeting or re-engagement campaigns with deep -links, check our [official docs][reattribution-deeplinks]. +### Push token -In the Project Navigator open the source file your Application Delegate. Find or add the `openURL` and -`application:continueUserActivity:restorationHandler:` and add the call to the `AdjustBridge` reference which exists in your -view controller which is displaying the web view: +Push tokens are used for Audience Builder and client callbacks, and they are required for uninstall and reinstall tracking. + +To send us the push notification token, add the following call to `Adjust` in the `didRegisterForRemoteNotificationsWithDeviceToken` of your app delegate: ```objc #import "Adjust.h" -// Or #import -// (depends on the way you have chosen to add our native iOS SDK) -// ... +// or #import + +- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + [Adjust setDeviceToken:deviceToken]; +} +``` + +Or, if you have access to the push token from the web view, you can instead call the `setDeviceToken` method in the `Adjust` object in Javascript: + +```js +Adjust.setDeviceToken(deviceToken); +``` + +### Pre-installed trackers + +If you want to use the Adjust SDK to recognize users that found your app pre-installed on their device, follow these steps. + +1. Create a new tracker in your [dashboard]. +2. Open your app delegate and add set the default tracker of your `AdjustConfig` instance: + + ```js + adjustConfig.setDefaultTracker(trackerToken); + ``` + + Replace `trackerToken` with the tracker token you created in step 2. Please note that the dashboard displays a tracker + URL (including `http://app.adjust.com/`). In your source code, you should specify only the six-character token and not + the entire URL. + +### Deep linking + +If you are using the Adjust tracker URL with an option to deep link into your app from the URL, there is the possibility to get info about the deep link URL and its content. Hitting the URL can happen when the user has your app already installed (standard deep linking scenario) or if they don't have the app on their device (deferred deep linking scenario). Both of these scenarios are supported by the Adjust SDK and in both cases the deep link URL will be provided to you after you app has been started after hitting the tracker URL. In order to use this feature in your app, you need to set it up properly. + +### Standard deep linking scenario + +If your user already has the app installed and hits the tracker URL with deep link information in it, your application will be opened and the content of the deep link will be sent to your app so that you can parse it and decide what to do next. With introduction of iOS 9, Apple has changed the way how deep linking should be handled in the app. Depending on which scenario you want to use for your app (or if you want to use them both to support wide range of devices), you need to set up your app to handle one or both of the following scenarios. + +### Deep linking on iOS 8 and earlier + +Deep linking on iOS 8 and earlier devices is being done with usage of a custom URL scheme setting. You need to pick a custom URL scheme name which your app will be in charge for opening. This scheme name will also be used in the Adjust tracker URL as part of the `deep_link` parameter. In order to set this in your app, open your `Info.plist` file and add new `URL types` row to it. In there, as `URL identifier` write you app's bundle ID and under `URL schemes` add scheme name(s) which you want your app to handle. In the example below, we have chosen that our app should handle the `adjustExample` scheme name. + +![][custom-url-scheme] + +After this has been set up, your app will be opened after you click the Adjust tracker URL with `deep_link` parameter which contains the scheme name which you have chosen. After app is opened, `openURL` method of your `AppDelegate` class will be triggered and the place where the content of the `deep_link` parameter from the tracker URL will be delivered. If you want to access the content of the deep link, override this method. + +```objc +#import "Adjust.h" +// or #import - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { - // This is how AdjustBridge is accessed in our example app. - // Of course, you can choose on your own how to access it. - [self.uiWebViewExampleController.adjustBridge sendDeeplinkToWebView:url]; - - // Your logic whether URL should be opened or not. - BOOL shouldOpen = [self yourLogic:url]; - - return shouldOpen; + // url object contains your deep link content + + // Apply your logic to determine the return value of this method + return YES; + // or + // return NO; } +``` -// ... +With this setup, you have successfully set up deep linking handling for iOS devices with iOS 8 and earlier versions. + +### Deep linking on iOS 9 and later + +In order to set deep linking support for iOS 9 and later devices, you need to enable your app to handle Apple universal links. To find out more about universal links and how their setup looks like, you can check [here][universal-links]. + +Adjust is taking care of lots of things to do with universal links behind the scenes. But, in order to support universal links with the Adjust, you need to perform small setup for universal links in the Adjust dashboard. For more information on that should be done, please consult our official [docs][universal-links-guide]. + +Once you have successfully enabled the universal links feature in the dashboard, you need to do this in your app as well: + +After enabling `Associated Domains` for your app in Apple Developer Portal, you need to do the same thing in your app's Xcode project. After enabling `Assciated Domains`, add the universal link which was generated for you in the Adjust dashboard in the `Domains` section by prefixing it with `applinks:` and make sure that you also remove the `http(s)` part of the universal link. -- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity +![][associated-domains-applinks] + +After this has been set up, your app will be opened after you click the Adjust tracker universal link. After app is opened, `continueUserActivity` method of your `AppDelegate` class will be triggered and the place where the content of the universal link URL will be delivered. If you want to access the content of the deep link, override this method. + +``` objc +#import "Adjust.h" +// or #import + +- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) { - [self.uiWebViewExampleController.adjustBridge sendDeeplinkToWebView:[userActivity webpageURL]]; + NSURL *url = [userActivity webpageURL]; + + // url object contains your universal link content } - // Your logic whether URL should be opened or not. - BOOL shouldOpen = [self yourLogic:url]; - - return shouldOpen; + // Apply your logic to determine the return value of this method + return YES; + // or + // return NO; } ``` -By adding this call to both of these methods, you will support deeplink reattributions for both - iOS 8 and lower (which -uses old custom URL scheme approach) and iOS 9 and higher (which uses `universal links`). +With this setup, you have successfully set up deep linking handling for iOS devices with iOS 9 and later versions. + +We provide a helper function that allows you to convert a universal link to an old style deep link URL, in case you had some custom logic in your code which was always expecting deep link info to arrive in old style custom URL scheme format. You can call this method with universal link and the custom URL scheme name which you would like to see your deep link prefixed with and we will generate the custom URL scheme deep link for you: -**Important**: In order to enable universal links in your app, please read the [universal links guide][ios_sdk_ulinks] from -the native iOS SDK README. +``` objc +#import "Adjust.h" +// or #import -In order to get deeplink URL info back to your web view, you should register a handle on the bridge called `deeplink`. This -method will then get triggered by the adjust SDK once your app gets opened after clicking on tracker URL with deeplink -information in it. +- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { + if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) { + NSURL *url = [userActivity webpageURL]; -```js -setupWebViewJavascriptBridge(function(bridge) { - bridge.registerHandler('deeplink', function(data, responseCallback) { - // In this example, we're just displaying alert with deeplink URL content. - alert('Deeplink:\n' + data) - }) -}) -``` + NSURL *oldStyleDeeplink = [Adjust convertUniversalLink:url scheme:@"adjustExample"]; + } -#### Deferred deeplink callback + // Apply your logic to determine the return value of this method + return YES; + // or + // return NO; +} +``` -You can register a callback method to get notified before a deferred deeplink is opened and decide whether the adjust SDK -should open it or not. +### Deferred deep linking scenario -This callback is also set on `AdjustConfig` instance: +You can register a callback to be notified before a deferred deep link is opened. You can configure the callback on the `AdjustConfig` instance: ```js adjustConfig.setDeferredDeeplinkCallback(function(deferredDeeplink) { - // In this example, we're just displaying alert with deferred deeplink URL content. - alert('Deferred deeplink:\n' + deferredDeeplink) -}) + // ... +}); +``` +The callback function will be called after the SDK receives a deffered deep link from our server and before opening it. + +If this callback is not implemented, **the Adjust SDK will always try to open the deep link by default**. + +With another setting on the `AdjustConfig` instance, you have the possibility to decide whether the Adjust SDK will open this deeplink or not. You could, for example, not allow the SDK to open the deep link at the current moment, save it, and open it yourself later. You can do this by calling the `setOpenDeferredDeeplink` method: + +```js +// Default setting. The SDK will open the deeplink after the deferred deeplink callback +adjustConfig.setOpenDeferredDeeplink(true); + +// Or if you don't want our SDK to open the deeplink: +adjustConfig.setOpenDeferredDeeplink(false); +``` + +### Reattribution via deep links + +Adjust enables you to run re-engagement campaigns with usage of deep links. For more information on how to do that, please check our [official docs][reattribution-with-deeplinks]. + +If you are using this feature, in order for your user to be properly reattributed, you need to make one additional call to the Adjust SDK in your app. + +Once you have received deep link content information in your app, add a call to the `appWillOpenUrl` method. By making this call, the Adjust SDK will try to find if there is any new attribution info inside of the deep link and if any, it will be sent to the Adjust backend. If your user should be reattributed due to a click on the Adjust tracker URL with deep link content in it, you will see the [attribution callback](#attribution-callback) in your app being triggered with new attribution info for this user. + +The call to `appWillOpenUrl` should be done like this to support deep linking reattributions in all iOS versions: + +```objc +#import "Adjust.h" +// or #import + +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { + // url object contains your deep link content + + [Adjust appWillOpenUrl:url]; + + // Apply your logic to determine the return value of this method + return YES; + // or + // return NO; +} ``` -The callback function will be called after the SDK receives a deferred deeplink from the server and before SDK tries to -open it. +``` objc +#import "Adjust.h" +// or #import + +- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { + if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) { + NSURL url = [userActivity webpageURL]; + + [Adjust appWillOpenUrl:url]; + } -With another setting on the `AdjustConfig` instance, you have the possibility to tell our SDK to open this -link or not. You can do this by calling the `setOpenDeferredDeeplink` method: + // Apply your logic to determine the return value of this method + return YES; + // or + // return NO; +} +``` + +If you have access to the deeplink url in the web view, you can call the `appWillOpenUrl` method from the `Adjust` object from Javascript: ```js -adjustConfig.setOpenDeferredDeeplink(true) -// Or if you don't want our SDK to open the link: -adjustConfig.setOpenDeferredDeeplink(false) +Adjust.appWillOpenUrl(deeplinkUrl); ``` -If you do not specify anything, by default, our SDK will try to open the link. [dashboard]: http://adjust.com [adjust.com]: http://adjust.com +[releases]: https://github.com/adjust/ios_sdk/releases +[carthage]: https://github.com/Carthage/Carthage +[cocoapods]: http://cocoapods.org + [wvjsb_readme]: https://github.com/marcuswestin/WebViewJavascriptBridge#usage [ios_sdk_ulinks]: https://github.com/adjust/ios_sdk/#universal-links +[example-webview]: https://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-WebView [callbacks-guide]: https://docs.adjust.com/en/callbacks [attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md [special-partners]: https://docs.adjust.com/en/special-partners @@ -532,19 +807,14 @@ If you do not specify anything, by default, our SDK will try to open the link. [event-tracking-guide]: https://docs.adjust.com/en/event-tracking/#reference-tracking-purchases-and-revenues [reattribution-deeplinks]: https://docs.adjust.com/en/deeplinking/#manually-appending-attribution-data-to-a-deep-link -[bridge_add]: https://raw.githubusercontent.com/adjust/sdks/master/Resources/ios/bridge/bridge_add.png -[bridge_drag]: https://raw.githubusercontent.com/adjust/sdks/master/Resources/ios/bridge/bridge_drag.png -[bridge_init_js]: https://raw.githubusercontent.com/adjust/sdks/master/Resources/ios/bridge/bridge_init_js.png -[bridge_init_objc]: https://raw.githubusercontent.com/adjust/sdks/master/Resources/ios/bridge/bridge_init_objc.png -[bridge_init_js_xcode]: https://raw.githubusercontent.com/adjust/sdks/master/Resources/ios/bridge/bridge_init_js_xcode.png -[bridge_install_tracked]: https://raw.githubusercontent.com/adjust/sdks/master/Resources/ios/bridge/bridge_install_tracked.png +[custom-url-scheme]: https://raw.github.com/adjust/sdks/master/Resources/ios/custom-url-scheme.png +[associated-domains-applinks]: https://raw.github.com/adjust/sdks/master/Resources/ios/associated-domains-applinks.png -## License +## License -The adjust SDK is licensed under the MIT License. +The Adjust SDK is licensed under the MIT License. -Copyright (c) 2012-2016 adjust GmbH, -http://www.adjust.com +Copyright (c) 2012-2018 Adjust GmbH, http://www.adjust.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/doc/japanese/migrate_ja.md b/doc/japanese/migrate_ja.md index 98de0e3f4..3a6cdc6d7 100644 --- a/doc/japanese/migrate_ja.md +++ b/doc/japanese/migrate_ja.md @@ -1,4 +1,4 @@ -## iOS用adjust SDKのv3.4.0からv4.14.1への移行 +## iOS用adjust SDKのv3.4.0からv4.14.2への移行 ### 初期設定 diff --git a/doc/migrate.md b/doc/migrate.md index c1a70a26c..09a05c203 100644 --- a/doc/migrate.md +++ b/doc/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for iOS to v4.14.1 from v3.4.0 +## Migrate your adjust SDK for iOS to v4.14.2 from v3.4.0 ### Initial setup diff --git a/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj b/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj index 7e5df0295..0c9dc94b8 100644 --- a/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj @@ -39,7 +39,6 @@ 9D449E931E6EDC3D00E7E80B /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449E701E6EDC3D00E7E80B /* ADJTimerOnce.m */; }; 9D449E941E6EDC3D00E7E80B /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449E721E6EDC3D00E7E80B /* Adjust.m */; }; 9D449E951E6EDC3D00E7E80B /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449E741E6EDC3D00E7E80B /* ADJUtil.m */; }; - 9D449E961E6EDC3D00E7E80B /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9D449E751E6EDC3D00E7E80B /* Info.plist */; }; 9DD0E9C11F45879A00B2A759 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD0E9C01F45879A00B2A759 /* ADJUserDefaults.m */; }; 9DF7A9C61CB4ECA600D3591F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DF7A9C51CB4ECA600D3591F /* AppDelegate.swift */; }; 9DF7A9C81CB4ECA600D3591F /* ViewControllerSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DF7A9C71CB4ECA600D3591F /* ViewControllerSwift.swift */; }; @@ -115,7 +114,6 @@ 9D449E721E6EDC3D00E7E80B /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; 9D449E731E6EDC3D00E7E80B /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; 9D449E741E6EDC3D00E7E80B /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; - 9D449E751E6EDC3D00E7E80B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9DD0E9BF1F45879A00B2A759 /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; 9DD0E9C01F45879A00B2A759 /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; 9DF7A9C21CB4ECA600D3591F /* AdjustExample-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AdjustExample-Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -207,7 +205,6 @@ 6FCC850E1F2794BE00D6A0ED /* ADJReachability.m */, 9DD0E9BF1F45879A00B2A759 /* ADJUserDefaults.h */, 9DD0E9C01F45879A00B2A759 /* ADJUserDefaults.m */, - 9D449E751E6EDC3D00E7E80B /* Info.plist */, ); name = Adjust; path = ../../../Adjust; @@ -327,7 +324,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9D449E961E6EDC3D00E7E80B /* Info.plist in Resources */, 9DF7A9D01CB4ECA600D3591F /* LaunchScreen.storyboard in Resources */, 9DF7A9CD1CB4ECA600D3591F /* Assets.xcassets in Resources */, 9DF7A9CB1CB4ECA600D3591F /* Main.storyboard in Resources */, diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView.xcodeproj/project.pbxproj b/examples/AdjustExample-WebView/AdjustExample-WebView.xcodeproj/project.pbxproj index 55b36d0c0..af3dbcb87 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-WebView/AdjustExample-WebView.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6FA69FEB2101EA2900FCD3B5 /* AdjustBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FA69FEA2101EA2900FCD3B5 /* AdjustBridge_JS.m */; }; 6FCC85121F2794D900D6A0ED /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FCC85111F2794D600D6A0ED /* ADJReachability.m */; }; 968595F11D0B2E630011CA2B /* AdjustBridgeRegister.m in Sources */ = {isa = PBXBuildFile; fileRef = 968595F01D0B2E630011CA2B /* AdjustBridgeRegister.m */; }; 9D1082A91CFDAF8E0050568B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D1082A81CFDAF8E0050568B /* main.m */; }; @@ -52,20 +53,18 @@ 9D449EF71E6EDD4100E7E80B /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449ED41E6EDD4100E7E80B /* ADJTimerOnce.m */; }; 9D449EF81E6EDD4100E7E80B /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449ED61E6EDD4100E7E80B /* Adjust.m */; }; 9D449EF91E6EDD4100E7E80B /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449ED81E6EDD4100E7E80B /* ADJUtil.m */; }; - 9D449EFA1E6EDD4100E7E80B /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9D449ED91E6EDD4100E7E80B /* Info.plist */; }; 9D75F1961D07463800E5D222 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75F1881D07463800E5D222 /* WebViewJavascriptBridge.m */; }; 9D75F1971D07463800E5D222 /* WebViewJavascriptBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75F18A1D07463800E5D222 /* WebViewJavascriptBridge_JS.m */; }; 9D75F1981D07463800E5D222 /* WebViewJavascriptBridgeBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75F18C1D07463800E5D222 /* WebViewJavascriptBridgeBase.m */; }; 9D75F1991D07463800E5D222 /* WKWebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75F18E1D07463800E5D222 /* WKWebViewJavascriptBridge.m */; }; 9D75F19A1D07463800E5D222 /* AdjustBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75F1911D07463800E5D222 /* AdjustBridge.m */; }; - 9D75F19B1D07463800E5D222 /* adjust.js in Resources */ = {isa = PBXBuildFile; fileRef = 9D75F1921D07463800E5D222 /* adjust.js */; }; - 9D75F19C1D07463800E5D222 /* adjust_event.js in Resources */ = {isa = PBXBuildFile; fileRef = 9D75F1931D07463800E5D222 /* adjust_event.js */; }; - 9D75F19D1D07463800E5D222 /* adjust_config.js in Resources */ = {isa = PBXBuildFile; fileRef = 9D75F1941D07463800E5D222 /* adjust_config.js */; }; 9D9A99DA1D0B699A0022FFCE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D9A99D91D0B699A0022FFCE /* AppDelegate.m */; }; 9DD0E9C41F4587C600B2A759 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD0E9C31F4587C600B2A759 /* ADJUserDefaults.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 6FA69FE92101EA2900FCD3B5 /* AdjustBridge_JS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdjustBridge_JS.h; sourceTree = ""; }; + 6FA69FEA2101EA2900FCD3B5 /* AdjustBridge_JS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge_JS.m; sourceTree = ""; }; 6FCC85101F2794D600D6A0ED /* ADJReachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; 6FCC85111F2794D600D6A0ED /* ADJReachability.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; 968595EF1D0B2E630011CA2B /* AdjustBridgeRegister.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridgeRegister.h; sourceTree = ""; }; @@ -148,7 +147,6 @@ 9D449ED61E6EDD4100E7E80B /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; 9D449ED71E6EDD4100E7E80B /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; 9D449ED81E6EDD4100E7E80B /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; - 9D449ED91E6EDD4100E7E80B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9D75F1871D07463800E5D222 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = ""; }; 9D75F1881D07463800E5D222 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = ""; }; 9D75F1891D07463800E5D222 /* WebViewJavascriptBridge_JS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge_JS.h; sourceTree = ""; }; @@ -159,9 +157,6 @@ 9D75F18E1D07463800E5D222 /* WKWebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKWebViewJavascriptBridge.m; sourceTree = ""; }; 9D75F1901D07463800E5D222 /* AdjustBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridge.h; sourceTree = ""; }; 9D75F1911D07463800E5D222 /* AdjustBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge.m; sourceTree = ""; }; - 9D75F1921D07463800E5D222 /* adjust.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = adjust.js; sourceTree = ""; }; - 9D75F1931D07463800E5D222 /* adjust_event.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = adjust_event.js; sourceTree = ""; }; - 9D75F1941D07463800E5D222 /* adjust_config.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = adjust_config.js; sourceTree = ""; }; 9D9A99D81D0B699A0022FFCE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 9D9A99D91D0B699A0022FFCE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 9DD0E9C21F4587C600B2A759 /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; @@ -307,7 +302,6 @@ 6FCC85111F2794D600D6A0ED /* ADJReachability.m */, 9DD0E9C21F4587C600B2A759 /* ADJUserDefaults.h */, 9DD0E9C31F4587C600B2A759 /* ADJUserDefaults.m */, - 9D449ED91E6EDD4100E7E80B /* Info.plist */, ); name = Adjust; path = ../../../Adjust; @@ -329,6 +323,8 @@ 9D75F18F1D07463800E5D222 /* WebViewJavascriptBridge */ = { isa = PBXGroup; children = ( + 6FA69FE92101EA2900FCD3B5 /* AdjustBridge_JS.h */, + 6FA69FEA2101EA2900FCD3B5 /* AdjustBridge_JS.m */, 9D75F1871D07463800E5D222 /* WebViewJavascriptBridge.h */, 9D75F1881D07463800E5D222 /* WebViewJavascriptBridge.m */, 9D75F1891D07463800E5D222 /* WebViewJavascriptBridge_JS.h */, @@ -349,9 +345,6 @@ 968595EF1D0B2E630011CA2B /* AdjustBridgeRegister.h */, 968595F01D0B2E630011CA2B /* AdjustBridgeRegister.m */, 9D75F18F1D07463800E5D222 /* WebViewJavascriptBridge */, - 9D75F1921D07463800E5D222 /* adjust.js */, - 9D75F1931D07463800E5D222 /* adjust_event.js */, - 9D75F1941D07463800E5D222 /* adjust_config.js */, ); name = AdjustBridge; path = ../../../AdjustBridge; @@ -418,10 +411,6 @@ 9D1082B41CFDAF8E0050568B /* Assets.xcassets in Resources */, 9D10833F1CFDDBF50050568B /* Default-568h@2x.png in Resources */, 9D1082C51CFDAFDA0050568B /* AdjustExample-WebView.html in Resources */, - 9D75F19D1D07463800E5D222 /* adjust_config.js in Resources */, - 9D75F19C1D07463800E5D222 /* adjust_event.js in Resources */, - 9D75F19B1D07463800E5D222 /* adjust.js in Resources */, - 9D449EFA1E6EDD4100E7E80B /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -456,6 +445,7 @@ 9D75F19A1D07463800E5D222 /* AdjustBridge.m in Sources */, 9D449EF21E6EDD4100E7E80B /* ADJSessionFailure.m in Sources */, 9D449EDD1E6EDD4100E7E80B /* ADJActivityState.m in Sources */, + 6FA69FEB2101EA2900FCD3B5 /* AdjustBridge_JS.m in Sources */, 9D449EEB1E6EDD4100E7E80B /* ADJKeychain.m in Sources */, 9D449EE11E6EDD4100E7E80B /* ADJAdjustFactory.m in Sources */, 9D75F1971D07463800E5D222 /* WebViewJavascriptBridge_JS.m in Sources */, diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html b/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html index 4cc76c58a..1e92c7fd9 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html @@ -3,16 +3,14 @@ -

Adjust Web View Demo

- - - - -
- - - - - - - - - - -
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/AppDelegate.m b/examples/AdjustExample-WebView/AdjustExample-WebView/AppDelegate.m index ba8f69fe9..50409c6d2 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/AppDelegate.m +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/AppDelegate.m @@ -6,6 +6,7 @@ // Copyright © 2016 adjust GmbH. All rights reserved. // +#import "Adjust.h" #import "AppDelegate.h" #import "UIWebViewController.h" #import "WKWebViewController.h" @@ -44,22 +45,14 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { - NSLog(@"application openURL %@", url); - - [self.uiWebViewExampleController.adjustBridge sendDeeplinkToWebView:url]; - [self.wkWebViewExampleController.adjustBridge sendDeeplinkToWebView:url]; - + [Adjust appWillOpenUrl:url]; return YES; } - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) { - NSLog(@"application continueUserActivity %@", [userActivity webpageURL]); - - [self.uiWebViewExampleController.adjustBridge sendDeeplinkToWebView:[userActivity webpageURL]]; - [self.wkWebViewExampleController.adjustBridge sendDeeplinkToWebView:[userActivity webpageURL]]; + [Adjust appWillOpenUrl:[userActivity webpageURL]]; } - return YES; } diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist b/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist index 866573564..808e18c1f 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist @@ -25,7 +25,7 @@ com.adjust.examples CFBundleURLSchemes - adjustExample + adjust-example diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.h b/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.h index e19acf37d..b0e1b37fa 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.h +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.h @@ -7,12 +7,14 @@ // #import +#import #import "AdjustBridge.h" @interface UIWebViewController : UINavigationController @property AdjustBridge *adjustBridge; +@property JSContext *jsContext; @end diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.m b/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.m index b0257ea8e..9660c8f1e 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.m +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/UIWebViewController.m @@ -33,6 +33,11 @@ - (void)loadUIWebView { _adjustBridge = [[AdjustBridge alloc] init]; [_adjustBridge loadUIWebViewBridge:uiWebView webViewDelegate:self]; + _jsContext = [uiWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; + _jsContext[@"console"][@"log"] = ^(JSValue * msg) { + NSLog(@"JavaScript %@ log message: %@", [JSContext currentContext], msg); + }; + NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"AdjustExample-WebView" ofType:@"html"]; NSString *appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil]; NSURL *baseURL = [NSURL fileURLWithPath:htmlPath]; diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/adjust.js b/examples/AdjustExample-WebView/AdjustExample-WebView/adjust.js deleted file mode 100644 index 3580aa9da..000000000 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/adjust.js +++ /dev/null @@ -1,67 +0,0 @@ -var Adjust = { - appDidLaunch: function (adjustConfig) { - this.bridge = adjustConfig.getBridge(); - - if (this.bridge != null) { - if (adjustConfig != null) { - if (adjustConfig.getAttributionCallback() != null) { - this.bridge.callHandler('setAttributionCallback', null, adjustConfig.getAttributionCallback()) - } - - if (adjustConfig.getEventSuccessCallback() != null) { - this.bridge.callHandler('setEventSuccessCallback', null, adjustConfig.getEventSuccessCallback()) - } - - if (adjustConfig.getEventFailureCallback() != null) { - this.bridge.callHandler('setEventFailureCallback', null, adjustConfig.getEventFailureCallback()) - } - - if (adjustConfig.getSessionSuccessCallback() != null) { - this.bridge.callHandler('setSessionSuccessCallback', null, adjustConfig.getSessionSuccessCallback()) - } - - if (adjustConfig.getSessionFailureCallback() != null) { - this.bridge.callHandler('setSessionFailureCallback', null, adjustConfig.getSessionFailureCallback()) - } - - this.bridge.callHandler('appDidLaunch', adjustConfig, null) - } - } - }, - - trackEvent: function (adjustEvent) { - if (this.bridge != null) { - this.bridge.callHandler('trackEvent', adjustEvent, null) - } - }, - - setOfflineMode: function(isOffline) { - if (this.bridge != null) { - this.bridge.callHandler('setOfflineMode', isOffline, null) - } - }, - - appWillOpenUrl: function(url) { - - }, - - setEnabled: function (enabled) { - if (this.bridge != null) { - this.bridge.callHandler('setEnabled', enabled, null) - } - }, - - isEnabled: function (callback) { - this.bridge.callHandler('isEnabled', null, function(response) { - callback(response) - }) - }, - - getIdfa: function (callback) { - this.bridge.callHandler('idfa', null, function(response) { - callback(response) - }) - } -}; - -module.exports = Adjust; \ No newline at end of file diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/adjust_config.js b/examples/AdjustExample-WebView/AdjustExample-WebView/adjust_config.js deleted file mode 100644 index bab7ba8f3..000000000 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/adjust_config.js +++ /dev/null @@ -1,95 +0,0 @@ -function AdjustConfig(bridge, appToken, environment) { - this.bridge = bridge; - this.appToken = appToken; - this.environment = environment; - - this.sdkPrefix = 'web'; - - this.logLevel = null; - this.defaultTracker = null; - - this.sendInBackground = null; - this.eventBufferingEnabled = null; - - this.attributionCallback = null; - this.eventSuccessCallback = null; - this.eventFailureCallback = null; - this.sessionSuccessCallback = null; - this.sessionFailureCallback = null; -} - -AdjustConfig.EnvironmentSandbox = 'sandbox'; -AdjustConfig.EnvironmentProduction = 'production'; - -AdjustConfig.LogLevelVerbose = 'VERBOSE', -AdjustConfig.LogLevelDebug = 'DEBUG', -AdjustConfig.LogLevelInfo = 'INFO', -AdjustConfig.LogLevelWarn = 'WARN', -AdjustConfig.LogLevelError = 'ERROR', -AdjustConfig.LogLevelAssert = 'ASSERT', - -AdjustConfig.prototype.getBridge = function() { - return this.bridge; -}; - -AdjustConfig.prototype.getAttributionCallback = function() { - return this.attributionCallback; -}; - -AdjustConfig.prototype.getEventSuccessCallback = function() { - return this.eventSuccessCallback; -}; - -AdjustConfig.prototype.getEventFailureCallback = function() { - return this.eventFailureCallback; -}; - -AdjustConfig.prototype.getSessionSuccessCallback = function() { - return this.sessionSuccessCallback; -}; - -AdjustConfig.prototype.getSessionFailureCallback = function() { - return this.sessionFailureCallback; -}; - -AdjustConfig.prototype.setEventBufferingEnabled = function(isEnabled) { - this.eventBufferingEnabled = isEnabled; -}; - -AdjustConfig.prototype.setSendInBackground = function(isEnabled) { - this.sendInBackground = isEnabled; -}; - -AdjustConfig.prototype.setLogLevel = function(logLevel) { - this.logLevel = logLevel; -}; - -AdjustConfig.prototype.setProcessName = function(processName) { - this.processName = processName; -}; - -AdjustConfig.prototype.setDefaultTracker = function(defaultTracker) { - this.defaultTracker = defaultTracker; -}; - -AdjustConfig.prototype.setAttributionCallback = function(callbackFluf) { - this.attributionCallback = callbackFluf; -}; - -AdjustConfig.prototype.setEventSuccessCallback = function(callback) { - this.eventSuccessCallback = callback; -}; - -AdjustConfig.prototype.setEventFailureCallback = function(callback) { - this.eventFailureCallback = callback; -}; - -AdjustConfig.prototype.setSessionSuccessCallback = function(callback) { - this.sessionSuccessCallback = callback; -}; - -AdjustConfig.prototype.setSessionFailureCallback = function(callback) { - this.sessionFailureCallback = callback; -}; - -module.exports = AdjustConfig; diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/adjust_event.js b/examples/AdjustExample-WebView/AdjustExample-WebView/adjust_event.js deleted file mode 100644 index b769d33b0..000000000 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/adjust_event.js +++ /dev/null @@ -1,31 +0,0 @@ -function AdjustEvent(eventToken) { - this.eventToken = eventToken; - - this.revenue = null; - this.currency = null; - this.transactionId = null; - - this.callbackParameters = []; - this.partnerParameters = []; -} - -AdjustEvent.prototype.setRevenue = function(revenue, currency) { - this.revenue = revenue; - this.currency = currency; -}; - -AdjustEvent.prototype.addCallbackParameter = function(key, value) { - this.callbackParameters.push(key); - this.callbackParameters.push(value); -}; - -AdjustEvent.prototype.addPartnerParameter = function(key, value) { - this.partnerParameters.push(key); - this.partnerParameters.push(value); -}; - -AdjustEvent.prototype.setTransactionId = function(transactionId) { - this.transactionId = transactionId; -}; - -module.exports = AdjustEvent; \ No newline at end of file diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Assets.xcassets/Contents.json b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Assets.xcassets/iMessage App Icon.stickersiconset/Contents.json b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Assets.xcassets/iMessage App Icon.stickersiconset/Contents.json new file mode 100644 index 000000000..28c5ac36e --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Assets.xcassets/iMessage App Icon.stickersiconset/Contents.json @@ -0,0 +1,78 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x45", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x45", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "67x50", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "74x55", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + }, + { + "size" : "27x20", + "idiom" : "universal", + "scale" : "2x", + "platform" : "ios" + }, + { + "size" : "27x20", + "idiom" : "universal", + "scale" : "3x", + "platform" : "ios" + }, + { + "size" : "32x24", + "idiom" : "universal", + "scale" : "2x", + "platform" : "ios" + }, + { + "size" : "32x24", + "idiom" : "universal", + "scale" : "3x", + "platform" : "ios" + }, + { + "size" : "1024x768", + "idiom" : "ios-marketing", + "scale" : "1x", + "platform" : "ios" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Base.lproj/MainInterface.storyboard b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Base.lproj/MainInterface.storyboard new file mode 100644 index 000000000..80861b244 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Base.lproj/MainInterface.storyboard @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Info.plist b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Info.plist new file mode 100644 index 000000000..32a93a148 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/Info.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + AdjustExample-iMessage + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.message-payload-provider + + + diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/MessagesViewController.h b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/MessagesViewController.h new file mode 100644 index 000000000..a01f5d735 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/MessagesViewController.h @@ -0,0 +1,13 @@ +// +// MessagesViewController.h +// AdjustExample-iMessage MessagesExtension +// +// Created by Uglješa Erceg (@uerceg) on 18th of July 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import + +@interface MessagesViewController : MSMessagesAppViewController + +@end diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/MessagesViewController.m b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/MessagesViewController.m new file mode 100644 index 000000000..8bf506c13 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage MessagesExtension/MessagesViewController.m @@ -0,0 +1,113 @@ +// +// MessagesViewController.m +// AdjustExample-iMessage MessagesExtension +// +// Created by Uglješa Erceg (@uerceg) on 18th of July 2018. +// Copyright © 2018 Adjust GmbH. All rights reserved. +// + +#import "Adjust.h" +#import "MessagesViewController.h" + +@interface MessagesViewController () + +@property (weak, nonatomic) IBOutlet UIButton *btnTrackEvent; + +@end + +@implementation MessagesViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // Configure adjust SDK. + NSString *yourAppToken = @"2fm9gkqubvpc"; + NSString *environment = ADJEnvironmentSandbox; + ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken environment:environment]; + + // Change the log level. + [adjustConfig setLogLevel:ADJLogLevelVerbose]; + + // Add session callback parameters. + [Adjust addSessionCallbackParameter:@"sp_foo" value:@"sp_bar"]; + [Adjust addSessionCallbackParameter:@"sp_key" value:@"sp_value"]; + + // Add session partner parameters. + [Adjust addSessionPartnerParameter:@"sp_foo" value:@"sp_bar"]; + [Adjust addSessionPartnerParameter:@"sp_key" value:@"sp_value"]; + + // Remove session callback parameter. + [Adjust removeSessionCallbackParameter:@"sp_key"]; + + // Remove session partner parameter. + [Adjust removeSessionPartnerParameter:@"sp_foo"]; + + // Initialise the SDK. + [Adjust appDidLaunch:adjustConfig]; + }); +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + +#pragma mark - Conversation Handling + +-(void)didBecomeActiveWithConversation:(MSConversation *)conversation { + // Called when the extension is about to move from the inactive to active state. + // This will happen when the extension is about to present UI. + + // Use this method to configure the extension and restore previously stored state. + + [Adjust trackSubsessionStart]; +} + +-(void)willResignActiveWithConversation:(MSConversation *)conversation { + // Called when the extension is about to move from the active to inactive state. + // This will happen when the user dissmises the extension, changes to a different + // conversation or quits Messages. + + // Use this method to release shared resources, save user data, invalidate timers, + // and store enough state information to restore your extension to its current state + // in case it is terminated later. + + [Adjust trackSubsessionEnd]; +} + +-(void)didReceiveMessage:(MSMessage *)message conversation:(MSConversation *)conversation { + // Called when a message arrives that was generated by another instance of this + // extension on a remote device. + + // Use this method to trigger UI updates in response to the message. +} + +-(void)didStartSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation { + // Called when the user taps the send button. +} + +-(void)didCancelSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation { + // Called when the user deletes the message without sending it. + + // Use this to clean up state related to the deleted message. +} + +-(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle { + // Called before the extension transitions to a new presentation style. + + // Use this method to prepare for the change in presentation style. +} + +-(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle { + // Called after the extension transitions to a new presentation style. + + // Use this method to finalize any behaviors associated with the change in presentation style. +} + +- (IBAction)clickTrackSimpleEvent:(id)sender { + ADJEvent *event = [ADJEvent eventWithEventToken:@"g3mfiw"]; + [Adjust trackEvent:event]; +} + +@end diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.pbxproj b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.pbxproj new file mode 100644 index 000000000..6c88f2ed5 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.pbxproj @@ -0,0 +1,671 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 9D01676920FF812B0029CFFF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9D01676820FF812B0029CFFF /* Assets.xcassets */; }; + 9D01677020FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 9D01676F20FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 9D01677520FF812B0029CFFF /* Messages.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D01677420FF812B0029CFFF /* Messages.framework */; }; + 9D01677920FF812B0029CFFF /* MessagesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01677820FF812B0029CFFF /* MessagesViewController.m */; }; + 9D01677C20FF812B0029CFFF /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9D01677A20FF812B0029CFFF /* MainInterface.storyboard */; }; + 9D01677E20FF812C0029CFFF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9D01677D20FF812C0029CFFF /* Assets.xcassets */; }; + 9D01685620FF88F60029CFFF /* ADJDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01681320FF88F60029CFFF /* ADJDeviceInfo.m */; }; + 9D01685720FF88F60029CFFF /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01681420FF88F60029CFFF /* ADJTimerOnce.m */; }; + 9D01685820FF88F60029CFFF /* ADJAttributionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01681520FF88F60029CFFF /* ADJAttributionHandler.m */; }; + 9D01685920FF88F60029CFFF /* ADJRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01681820FF88F60029CFFF /* ADJRequestHandler.m */; }; + 9D01685A20FF88F60029CFFF /* ADJKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01681B20FF88F60029CFFF /* ADJKeychain.m */; }; + 9D01685B20FF88F60029CFFF /* ADJSdkClickHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01681C20FF88F60029CFFF /* ADJSdkClickHandler.m */; }; + 9D01685C20FF88F60029CFFF /* ADJEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01681E20FF88F60029CFFF /* ADJEvent.m */; }; + 9D01685D20FF88F60029CFFF /* ADJSessionSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682220FF88F60029CFFF /* ADJSessionSuccess.m */; }; + 9D01685E20FF88F60029CFFF /* ADJEventFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682320FF88F60029CFFF /* ADJEventFailure.m */; }; + 9D01685F20FF88F60029CFFF /* ADJEventSuccess.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682520FF88F60029CFFF /* ADJEventSuccess.m */; }; + 9D01686020FF88F60029CFFF /* ADJActivityState.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682620FF88F60029CFFF /* ADJActivityState.m */; }; + 9D01686120FF88F60029CFFF /* ADJSessionFailure.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682720FF88F60029CFFF /* ADJSessionFailure.m */; }; + 9D01686220FF88F60029CFFF /* ADJTimerCycle.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682B20FF88F60029CFFF /* ADJTimerCycle.m */; }; + 9D01686320FF88F60029CFFF /* ADJSessionParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682C20FF88F60029CFFF /* ADJSessionParameters.m */; }; + 9D01686420FF88F60029CFFF /* ADJLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682D20FF88F60029CFFF /* ADJLogger.m */; }; + 9D01686520FF88F60029CFFF /* ADJBackoffStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01682E20FF88F60029CFFF /* ADJBackoffStrategy.m */; }; + 9D01686620FF88F60029CFFF /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01683020FF88F60029CFFF /* Adjust.m */; }; + 9D01686720FF88F60029CFFF /* ADJConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01683420FF88F60029CFFF /* ADJConfig.m */; }; + 9D01686820FF88F60029CFFF /* ADJPackageHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01683520FF88F60029CFFF /* ADJPackageHandler.m */; }; + 9D01686920FF88F60029CFFF /* ADJActivityKind.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01683820FF88F60029CFFF /* ADJActivityKind.m */; }; + 9D01686A20FF88F60029CFFF /* NSString+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01683B20FF88F60029CFFF /* NSString+ADJAdditions.m */; }; + 9D01686B20FF88F60029CFFF /* NSData+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01683D20FF88F60029CFFF /* NSData+ADJAdditions.m */; }; + 9D01686C20FF88F60029CFFF /* UIDevice+ADJAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01683F20FF88F60029CFFF /* UIDevice+ADJAdditions.m */; }; + 9D01686D20FF88F60029CFFF /* ADJAttribution.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684120FF88F60029CFFF /* ADJAttribution.m */; }; + 9D01686E20FF88F60029CFFF /* ADJSystemProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684220FF88F60029CFFF /* ADJSystemProfile.m */; }; + 9D01686F20FF88F60029CFFF /* ADJActivityPackage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684420FF88F60029CFFF /* ADJActivityPackage.m */; }; + 9D01687020FF88F60029CFFF /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684520FF88F60029CFFF /* ADJUtil.m */; }; + 9D01687120FF88F60029CFFF /* ADJAdjustFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684820FF88F60029CFFF /* ADJAdjustFactory.m */; }; + 9D01687220FF88F60029CFFF /* ADJResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684B20FF88F60029CFFF /* ADJResponseData.m */; }; + 9D01687320FF88F60029CFFF /* ADJPackageBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684D20FF88F60029CFFF /* ADJPackageBuilder.m */; }; + 9D01687420FF88F60029CFFF /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01684E20FF88F60029CFFF /* ADJUserDefaults.m */; }; + 9D01687620FF88F60029CFFF /* ADJActivityHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01685420FF88F60029CFFF /* ADJActivityHandler.m */; }; + 9D01687720FF88F60029CFFF /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D01685520FF88F60029CFFF /* ADJReachability.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 9D01677120FF812B0029CFFF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9D01675F20FF81280029CFFF /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9D01676E20FF812B0029CFFF; + remoteInfo = "AdjustExample-iMessage MessagesExtension"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9D01678520FF812C0029CFFF /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 9D01677020FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 9D01676520FF81280029CFFF /* AdjustExample-iMessage.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AdjustExample-iMessage.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D01676820FF812B0029CFFF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 9D01676A20FF812B0029CFFF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9D01676F20FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "AdjustExample-iMessage MessagesExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D01677420FF812B0029CFFF /* Messages.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Messages.framework; path = System/Library/Frameworks/Messages.framework; sourceTree = SDKROOT; }; + 9D01677720FF812B0029CFFF /* MessagesViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessagesViewController.h; sourceTree = ""; }; + 9D01677820FF812B0029CFFF /* MessagesViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MessagesViewController.m; sourceTree = ""; }; + 9D01677B20FF812B0029CFFF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + 9D01677D20FF812C0029CFFF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 9D01677F20FF812C0029CFFF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9D01681220FF88F60029CFFF /* ADJConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJConfig.h; sourceTree = ""; }; + 9D01681320FF88F60029CFFF /* ADJDeviceInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJDeviceInfo.m; sourceTree = ""; }; + 9D01681420FF88F60029CFFF /* ADJTimerOnce.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerOnce.m; sourceTree = ""; }; + 9D01681520FF88F60029CFFF /* ADJAttributionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttributionHandler.m; sourceTree = ""; }; + 9D01681620FF88F60029CFFF /* Adjust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Adjust.h; sourceTree = ""; }; + 9D01681720FF88F60029CFFF /* ADJActivityPackage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityPackage.h; sourceTree = ""; }; + 9D01681820FF88F60029CFFF /* ADJRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJRequestHandler.m; sourceTree = ""; }; + 9D01681920FF88F60029CFFF /* ADJSystemProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSystemProfile.h; sourceTree = ""; }; + 9D01681A20FF88F60029CFFF /* ADJAttribution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttribution.h; sourceTree = ""; }; + 9D01681B20FF88F60029CFFF /* ADJKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJKeychain.m; sourceTree = ""; }; + 9D01681C20FF88F60029CFFF /* ADJSdkClickHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSdkClickHandler.m; sourceTree = ""; }; + 9D01681D20FF88F60029CFFF /* ADJActivityKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityKind.h; sourceTree = ""; }; + 9D01681E20FF88F60029CFFF /* ADJEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEvent.m; sourceTree = ""; }; + 9D01681F20FF88F60029CFFF /* ADJPackageHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageHandler.h; sourceTree = ""; }; + 9D01682020FF88F60029CFFF /* ADJPackageBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJPackageBuilder.h; sourceTree = ""; }; + 9D01682120FF88F60029CFFF /* ADJResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJResponseData.h; sourceTree = ""; }; + 9D01682220FF88F60029CFFF /* ADJSessionSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionSuccess.m; sourceTree = ""; }; + 9D01682320FF88F60029CFFF /* ADJEventFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventFailure.m; sourceTree = ""; }; + 9D01682420FF88F60029CFFF /* ADJAdjustFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAdjustFactory.h; sourceTree = ""; }; + 9D01682520FF88F60029CFFF /* ADJEventSuccess.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJEventSuccess.m; sourceTree = ""; }; + 9D01682620FF88F60029CFFF /* ADJActivityState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityState.m; sourceTree = ""; }; + 9D01682720FF88F60029CFFF /* ADJSessionFailure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionFailure.m; sourceTree = ""; }; + 9D01682820FF88F60029CFFF /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; + 9D01682920FF88F60029CFFF /* ADJReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; + 9D01682A20FF88F60029CFFF /* ADJActivityHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityHandler.h; sourceTree = ""; }; + 9D01682B20FF88F60029CFFF /* ADJTimerCycle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJTimerCycle.m; sourceTree = ""; }; + 9D01682C20FF88F60029CFFF /* ADJSessionParameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionParameters.m; sourceTree = ""; }; + 9D01682D20FF88F60029CFFF /* ADJLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJLogger.m; sourceTree = ""; }; + 9D01682E20FF88F60029CFFF /* ADJBackoffStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJBackoffStrategy.m; sourceTree = ""; }; + 9D01682F20FF88F60029CFFF /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; + 9D01683020FF88F60029CFFF /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; + 9D01683120FF88F60029CFFF /* ADJAttributionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJAttributionHandler.h; sourceTree = ""; }; + 9D01683220FF88F60029CFFF /* ADJTimerOnce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerOnce.h; sourceTree = ""; }; + 9D01683320FF88F60029CFFF /* ADJDeviceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJDeviceInfo.h; sourceTree = ""; }; + 9D01683420FF88F60029CFFF /* ADJConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJConfig.m; sourceTree = ""; }; + 9D01683520FF88F60029CFFF /* ADJPackageHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageHandler.m; sourceTree = ""; }; + 9D01683620FF88F60029CFFF /* ADJEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEvent.h; sourceTree = ""; }; + 9D01683720FF88F60029CFFF /* ADJSdkClickHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSdkClickHandler.h; sourceTree = ""; }; + 9D01683820FF88F60029CFFF /* ADJActivityKind.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityKind.m; sourceTree = ""; }; + 9D01683920FF88F60029CFFF /* ADJKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJKeychain.h; sourceTree = ""; }; + 9D01683B20FF88F60029CFFF /* NSString+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+ADJAdditions.m"; sourceTree = ""; }; + 9D01683C20FF88F60029CFFF /* UIDevice+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+ADJAdditions.h"; sourceTree = ""; }; + 9D01683D20FF88F60029CFFF /* NSData+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ADJAdditions.m"; sourceTree = ""; }; + 9D01683E20FF88F60029CFFF /* NSData+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ADJAdditions.h"; sourceTree = ""; }; + 9D01683F20FF88F60029CFFF /* UIDevice+ADJAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+ADJAdditions.m"; sourceTree = ""; }; + 9D01684020FF88F60029CFFF /* NSString+ADJAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+ADJAdditions.h"; sourceTree = ""; }; + 9D01684120FF88F60029CFFF /* ADJAttribution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAttribution.m; sourceTree = ""; }; + 9D01684220FF88F60029CFFF /* ADJSystemProfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSystemProfile.m; sourceTree = ""; }; + 9D01684320FF88F60029CFFF /* ADJRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJRequestHandler.h; sourceTree = ""; }; + 9D01684420FF88F60029CFFF /* ADJActivityPackage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityPackage.m; sourceTree = ""; }; + 9D01684520FF88F60029CFFF /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; + 9D01684620FF88F60029CFFF /* ADJSessionFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionFailure.h; sourceTree = ""; }; + 9D01684720FF88F60029CFFF /* ADJActivityState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJActivityState.h; sourceTree = ""; }; + 9D01684820FF88F60029CFFF /* ADJAdjustFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJAdjustFactory.m; sourceTree = ""; }; + 9D01684920FF88F60029CFFF /* ADJEventSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventSuccess.h; sourceTree = ""; }; + 9D01684A20FF88F60029CFFF /* ADJEventFailure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJEventFailure.h; sourceTree = ""; }; + 9D01684B20FF88F60029CFFF /* ADJResponseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJResponseData.m; sourceTree = ""; }; + 9D01684C20FF88F60029CFFF /* ADJSessionSuccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionSuccess.h; sourceTree = ""; }; + 9D01684D20FF88F60029CFFF /* ADJPackageBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJPackageBuilder.m; sourceTree = ""; }; + 9D01684E20FF88F60029CFFF /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; + 9D01684F20FF88F60029CFFF /* ADJBackoffStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJBackoffStrategy.h; sourceTree = ""; }; + 9D01685020FF88F60029CFFF /* ADJLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJLogger.h; sourceTree = ""; }; + 9D01685120FF88F60029CFFF /* ADJSessionParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionParameters.h; sourceTree = ""; }; + 9D01685320FF88F60029CFFF /* ADJTimerCycle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJTimerCycle.h; sourceTree = ""; }; + 9D01685420FF88F60029CFFF /* ADJActivityHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJActivityHandler.m; sourceTree = ""; }; + 9D01685520FF88F60029CFFF /* ADJReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9D01676C20FF812B0029CFFF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D01677520FF812B0029CFFF /* Messages.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9D01675E20FF81280029CFFF = { + isa = PBXGroup; + children = ( + 9D01676720FF81280029CFFF /* AdjustExample-iMessage */, + 9D01677620FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension */, + 9D01677320FF812B0029CFFF /* Frameworks */, + 9D01676620FF81280029CFFF /* Products */, + ); + sourceTree = ""; + }; + 9D01676620FF81280029CFFF /* Products */ = { + isa = PBXGroup; + children = ( + 9D01676520FF81280029CFFF /* AdjustExample-iMessage.app */, + 9D01676F20FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 9D01676720FF81280029CFFF /* AdjustExample-iMessage */ = { + isa = PBXGroup; + children = ( + 9D01676820FF812B0029CFFF /* Assets.xcassets */, + 9D01676A20FF812B0029CFFF /* Info.plist */, + ); + path = "AdjustExample-iMessage"; + sourceTree = ""; + }; + 9D01677320FF812B0029CFFF /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9D01677420FF812B0029CFFF /* Messages.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9D01677620FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension */ = { + isa = PBXGroup; + children = ( + 9D01681120FF88F60029CFFF /* Adjust */, + 9D01677720FF812B0029CFFF /* MessagesViewController.h */, + 9D01677820FF812B0029CFFF /* MessagesViewController.m */, + 9D01677A20FF812B0029CFFF /* MainInterface.storyboard */, + 9D01677D20FF812C0029CFFF /* Assets.xcassets */, + 9D01677F20FF812C0029CFFF /* Info.plist */, + ); + path = "AdjustExample-iMessage MessagesExtension"; + sourceTree = ""; + }; + 9D01681120FF88F60029CFFF /* Adjust */ = { + isa = PBXGroup; + children = ( + 9D01681220FF88F60029CFFF /* ADJConfig.h */, + 9D01681320FF88F60029CFFF /* ADJDeviceInfo.m */, + 9D01681420FF88F60029CFFF /* ADJTimerOnce.m */, + 9D01681520FF88F60029CFFF /* ADJAttributionHandler.m */, + 9D01681620FF88F60029CFFF /* Adjust.h */, + 9D01681720FF88F60029CFFF /* ADJActivityPackage.h */, + 9D01681820FF88F60029CFFF /* ADJRequestHandler.m */, + 9D01681920FF88F60029CFFF /* ADJSystemProfile.h */, + 9D01681A20FF88F60029CFFF /* ADJAttribution.h */, + 9D01681B20FF88F60029CFFF /* ADJKeychain.m */, + 9D01681C20FF88F60029CFFF /* ADJSdkClickHandler.m */, + 9D01681D20FF88F60029CFFF /* ADJActivityKind.h */, + 9D01681E20FF88F60029CFFF /* ADJEvent.m */, + 9D01681F20FF88F60029CFFF /* ADJPackageHandler.h */, + 9D01682020FF88F60029CFFF /* ADJPackageBuilder.h */, + 9D01682120FF88F60029CFFF /* ADJResponseData.h */, + 9D01682220FF88F60029CFFF /* ADJSessionSuccess.m */, + 9D01682320FF88F60029CFFF /* ADJEventFailure.m */, + 9D01682420FF88F60029CFFF /* ADJAdjustFactory.h */, + 9D01682520FF88F60029CFFF /* ADJEventSuccess.m */, + 9D01682620FF88F60029CFFF /* ADJActivityState.m */, + 9D01682720FF88F60029CFFF /* ADJSessionFailure.m */, + 9D01682820FF88F60029CFFF /* ADJUtil.h */, + 9D01682920FF88F60029CFFF /* ADJReachability.h */, + 9D01682A20FF88F60029CFFF /* ADJActivityHandler.h */, + 9D01682B20FF88F60029CFFF /* ADJTimerCycle.m */, + 9D01682C20FF88F60029CFFF /* ADJSessionParameters.m */, + 9D01682D20FF88F60029CFFF /* ADJLogger.m */, + 9D01682E20FF88F60029CFFF /* ADJBackoffStrategy.m */, + 9D01682F20FF88F60029CFFF /* ADJUserDefaults.h */, + 9D01683020FF88F60029CFFF /* Adjust.m */, + 9D01683120FF88F60029CFFF /* ADJAttributionHandler.h */, + 9D01683220FF88F60029CFFF /* ADJTimerOnce.h */, + 9D01683320FF88F60029CFFF /* ADJDeviceInfo.h */, + 9D01683420FF88F60029CFFF /* ADJConfig.m */, + 9D01683520FF88F60029CFFF /* ADJPackageHandler.m */, + 9D01683620FF88F60029CFFF /* ADJEvent.h */, + 9D01683720FF88F60029CFFF /* ADJSdkClickHandler.h */, + 9D01683820FF88F60029CFFF /* ADJActivityKind.m */, + 9D01683920FF88F60029CFFF /* ADJKeychain.h */, + 9D01683A20FF88F60029CFFF /* ADJAdditions */, + 9D01684120FF88F60029CFFF /* ADJAttribution.m */, + 9D01684220FF88F60029CFFF /* ADJSystemProfile.m */, + 9D01684320FF88F60029CFFF /* ADJRequestHandler.h */, + 9D01684420FF88F60029CFFF /* ADJActivityPackage.m */, + 9D01684520FF88F60029CFFF /* ADJUtil.m */, + 9D01684620FF88F60029CFFF /* ADJSessionFailure.h */, + 9D01684720FF88F60029CFFF /* ADJActivityState.h */, + 9D01684820FF88F60029CFFF /* ADJAdjustFactory.m */, + 9D01684920FF88F60029CFFF /* ADJEventSuccess.h */, + 9D01684A20FF88F60029CFFF /* ADJEventFailure.h */, + 9D01684B20FF88F60029CFFF /* ADJResponseData.m */, + 9D01684C20FF88F60029CFFF /* ADJSessionSuccess.h */, + 9D01684D20FF88F60029CFFF /* ADJPackageBuilder.m */, + 9D01684E20FF88F60029CFFF /* ADJUserDefaults.m */, + 9D01684F20FF88F60029CFFF /* ADJBackoffStrategy.h */, + 9D01685020FF88F60029CFFF /* ADJLogger.h */, + 9D01685120FF88F60029CFFF /* ADJSessionParameters.h */, + 9D01685320FF88F60029CFFF /* ADJTimerCycle.h */, + 9D01685420FF88F60029CFFF /* ADJActivityHandler.m */, + 9D01685520FF88F60029CFFF /* ADJReachability.m */, + ); + name = Adjust; + path = ../../../Adjust; + sourceTree = ""; + }; + 9D01683A20FF88F60029CFFF /* ADJAdditions */ = { + isa = PBXGroup; + children = ( + 9D01683B20FF88F60029CFFF /* NSString+ADJAdditions.m */, + 9D01683C20FF88F60029CFFF /* UIDevice+ADJAdditions.h */, + 9D01683D20FF88F60029CFFF /* NSData+ADJAdditions.m */, + 9D01683E20FF88F60029CFFF /* NSData+ADJAdditions.h */, + 9D01683F20FF88F60029CFFF /* UIDevice+ADJAdditions.m */, + 9D01684020FF88F60029CFFF /* NSString+ADJAdditions.h */, + ); + path = ADJAdditions; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 9D01676420FF81280029CFFF /* AdjustExample-iMessage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D01678620FF812C0029CFFF /* Build configuration list for PBXNativeTarget "AdjustExample-iMessage" */; + buildPhases = ( + 9D01676320FF81280029CFFF /* Resources */, + 9D01678520FF812C0029CFFF /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 9D01677220FF812B0029CFFF /* PBXTargetDependency */, + ); + name = "AdjustExample-iMessage"; + productName = "AdjustExample-iMessage"; + productReference = 9D01676520FF81280029CFFF /* AdjustExample-iMessage.app */; + productType = "com.apple.product-type.application.messages"; + }; + 9D01676E20FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D01678220FF812C0029CFFF /* Build configuration list for PBXNativeTarget "AdjustExample-iMessage MessagesExtension" */; + buildPhases = ( + 9D01676B20FF812B0029CFFF /* Sources */, + 9D01676C20FF812B0029CFFF /* Frameworks */, + 9D01676D20FF812B0029CFFF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "AdjustExample-iMessage MessagesExtension"; + productName = "AdjustExample-iMessage MessagesExtension"; + productReference = 9D01676F20FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension.appex */; + productType = "com.apple.product-type.app-extension.messages"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9D01675F20FF81280029CFFF /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = "Adjust GmbH"; + TargetAttributes = { + 9D01676420FF81280029CFFF = { + CreatedOnToolsVersion = 9.4.1; + }; + 9D01676E20FF812B0029CFFF = { + CreatedOnToolsVersion = 9.4.1; + }; + }; + }; + buildConfigurationList = 9D01676220FF81280029CFFF /* Build configuration list for PBXProject "AdjustExample-iMessage" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 9D01675E20FF81280029CFFF; + productRefGroup = 9D01676620FF81280029CFFF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9D01676420FF81280029CFFF /* AdjustExample-iMessage */, + 9D01676E20FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 9D01676320FF81280029CFFF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D01676920FF812B0029CFFF /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9D01676D20FF812B0029CFFF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D01677E20FF812C0029CFFF /* Assets.xcassets in Resources */, + 9D01677C20FF812B0029CFFF /* MainInterface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 9D01676B20FF812B0029CFFF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D01685820FF88F60029CFFF /* ADJAttributionHandler.m in Sources */, + 9D01686120FF88F60029CFFF /* ADJSessionFailure.m in Sources */, + 9D01686520FF88F60029CFFF /* ADJBackoffStrategy.m in Sources */, + 9D01677920FF812B0029CFFF /* MessagesViewController.m in Sources */, + 9D01686F20FF88F60029CFFF /* ADJActivityPackage.m in Sources */, + 9D01686920FF88F60029CFFF /* ADJActivityKind.m in Sources */, + 9D01685F20FF88F60029CFFF /* ADJEventSuccess.m in Sources */, + 9D01685920FF88F60029CFFF /* ADJRequestHandler.m in Sources */, + 9D01686420FF88F60029CFFF /* ADJLogger.m in Sources */, + 9D01687020FF88F60029CFFF /* ADJUtil.m in Sources */, + 9D01685B20FF88F60029CFFF /* ADJSdkClickHandler.m in Sources */, + 9D01686C20FF88F60029CFFF /* UIDevice+ADJAdditions.m in Sources */, + 9D01687620FF88F60029CFFF /* ADJActivityHandler.m in Sources */, + 9D01686720FF88F60029CFFF /* ADJConfig.m in Sources */, + 9D01687720FF88F60029CFFF /* ADJReachability.m in Sources */, + 9D01685A20FF88F60029CFFF /* ADJKeychain.m in Sources */, + 9D01686A20FF88F60029CFFF /* NSString+ADJAdditions.m in Sources */, + 9D01687120FF88F60029CFFF /* ADJAdjustFactory.m in Sources */, + 9D01687220FF88F60029CFFF /* ADJResponseData.m in Sources */, + 9D01686020FF88F60029CFFF /* ADJActivityState.m in Sources */, + 9D01687420FF88F60029CFFF /* ADJUserDefaults.m in Sources */, + 9D01686820FF88F60029CFFF /* ADJPackageHandler.m in Sources */, + 9D01685E20FF88F60029CFFF /* ADJEventFailure.m in Sources */, + 9D01686E20FF88F60029CFFF /* ADJSystemProfile.m in Sources */, + 9D01685720FF88F60029CFFF /* ADJTimerOnce.m in Sources */, + 9D01686220FF88F60029CFFF /* ADJTimerCycle.m in Sources */, + 9D01686D20FF88F60029CFFF /* ADJAttribution.m in Sources */, + 9D01686320FF88F60029CFFF /* ADJSessionParameters.m in Sources */, + 9D01686B20FF88F60029CFFF /* NSData+ADJAdditions.m in Sources */, + 9D01685C20FF88F60029CFFF /* ADJEvent.m in Sources */, + 9D01687320FF88F60029CFFF /* ADJPackageBuilder.m in Sources */, + 9D01685620FF88F60029CFFF /* ADJDeviceInfo.m in Sources */, + 9D01686620FF88F60029CFFF /* Adjust.m in Sources */, + 9D01685D20FF88F60029CFFF /* ADJSessionSuccess.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 9D01677220FF812B0029CFFF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9D01676E20FF812B0029CFFF /* AdjustExample-iMessage MessagesExtension */; + targetProxy = 9D01677120FF812B0029CFFF /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 9D01677A20FF812B0029CFFF /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 9D01677B20FF812B0029CFFF /* Base */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 9D01678020FF812C0029CFFF /* 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 = 11.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 9D01678120FF812C0029CFFF /* 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 = 11.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 9D01678320FF812C0029CFFF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QGUGW9AUMK; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "ADJUST_IM=1", + ); + INFOPLIST_FILE = "AdjustExample-iMessage MessagesExtension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.examples.MessagesExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 9D01678420FF812C0029CFFF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QGUGW9AUMK; + GCC_PREPROCESSOR_DEFINITIONS = "ADJUST_IM=1"; + INFOPLIST_FILE = "AdjustExample-iMessage MessagesExtension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.examples.MessagesExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 9D01678720FF812C0029CFFF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QGUGW9AUMK; + INFOPLIST_FILE = "AdjustExample-iMessage/Info.plist"; + OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.examples; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 9D01678820FF812C0029CFFF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QGUGW9AUMK; + INFOPLIST_FILE = "AdjustExample-iMessage/Info.plist"; + OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = com.adjust.examples; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 9D01676220FF81280029CFFF /* Build configuration list for PBXProject "AdjustExample-iMessage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D01678020FF812C0029CFFF /* Debug */, + 9D01678120FF812C0029CFFF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D01678220FF812C0029CFFF /* Build configuration list for PBXNativeTarget "AdjustExample-iMessage MessagesExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D01678320FF812C0029CFFF /* Debug */, + 9D01678420FF812C0029CFFF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D01678620FF812C0029CFFF /* Build configuration list for PBXNativeTarget "AdjustExample-iMessage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D01678720FF812C0029CFFF /* Debug */, + 9D01678820FF812C0029CFFF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 9D01675F20FF81280029CFFF /* Project object */; +} diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..6de1a42de --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/AdjustExample-iMessage/AdjustExample-iMessage/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d8db8d65f --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage/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/examples/AdjustExample-iMessage/AdjustExample-iMessage/Assets.xcassets/Contents.json b/examples/AdjustExample-iMessage/AdjustExample-iMessage/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage/Info.plist b/examples/AdjustExample-iMessage/AdjustExample-iMessage/Info.plist new file mode 100644 index 000000000..4222ac2dd --- /dev/null +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage/Info.plist @@ -0,0 +1,43 @@ + + + + + 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 + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj b/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj index 4e6df9c20..d28ea29f4 100644 --- a/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj @@ -39,7 +39,6 @@ 9D449FC01E6EE72000E7E80B /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449F9D1E6EE72000E7E80B /* ADJTimerOnce.m */; }; 9D449FC11E6EE72000E7E80B /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449F9F1E6EE72000E7E80B /* Adjust.m */; }; 9D449FC21E6EE72000E7E80B /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449FA11E6EE72000E7E80B /* ADJUtil.m */; }; - 9D449FC31E6EE72000E7E80B /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9D449FA21E6EE72000E7E80B /* Info.plist */; }; 9DD0E9C71F45949600B2A759 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD0E9C61F45949600B2A759 /* ADJUserDefaults.m */; }; 9DF7AC191CB4FEDB00D3591F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DF7AC181CB4FEDB00D3591F /* main.m */; }; 9DF7AC1C1CB4FEDB00D3591F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DF7AC1B1CB4FEDB00D3591F /* AppDelegate.m */; }; @@ -170,7 +169,6 @@ 9D449F9F1E6EE72000E7E80B /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; 9D449FA01E6EE72000E7E80B /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; 9D449FA11E6EE72000E7E80B /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; - 9D449FA21E6EE72000E7E80B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9DD0E9C51F45949600B2A759 /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; 9DD0E9C61F45949600B2A759 /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; 9DF7AC141CB4FEDB00D3591F /* AdjustExample-iWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AdjustExample-iWatch.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -292,7 +290,6 @@ 6FCC85171F2794F800D6A0ED /* ADJReachability.m */, 9DD0E9C51F45949600B2A759 /* ADJUserDefaults.h */, 9DD0E9C61F45949600B2A759 /* ADJUserDefaults.m */, - 9D449FA21E6EE72000E7E80B /* Info.plist */, ); name = Adjust; path = ../../../Adjust; @@ -502,7 +499,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9D449FC31E6EE72000E7E80B /* Info.plist in Resources */, 9DF7AC271CB4FEDB00D3591F /* LaunchScreen.storyboard in Resources */, 9DF7AC241CB4FEDB00D3591F /* Assets.xcassets in Resources */, 9DF7AC221CB4FEDB00D3591F /* Main.storyboard in Resources */, diff --git a/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj b/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj index 293224d35..e0f851cc2 100644 --- a/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj @@ -45,7 +45,6 @@ 9D449F5C1E6EE6C500E7E80B /* ADJTimerOnce.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449F391E6EE6C500E7E80B /* ADJTimerOnce.m */; }; 9D449F5D1E6EE6C500E7E80B /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449F3B1E6EE6C500E7E80B /* Adjust.m */; }; 9D449F5E1E6EE6C500E7E80B /* ADJUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449F3D1E6EE6C500E7E80B /* ADJUtil.m */; }; - 9D449F5F1E6EE6C500E7E80B /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9D449F3E1E6EE6C500E7E80B /* Info.plist */; }; 9DC95F2F1C10596500138E4B /* Constants.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DC95F2E1C10596500138E4B /* Constants.m */; }; 9DD0E9CF1F459ECE00B2A759 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD0E9CE1F459ECE00B2A759 /* ADJUserDefaults.m */; }; /* End PBXBuildFile section */ @@ -138,7 +137,6 @@ 9D449F3B1E6EE6C500E7E80B /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = ""; }; 9D449F3C1E6EE6C500E7E80B /* ADJUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUtil.h; sourceTree = ""; }; 9D449F3D1E6EE6C500E7E80B /* ADJUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUtil.m; sourceTree = ""; }; - 9D449F3E1E6EE6C500E7E80B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9DC95F2D1C10596500138E4B /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = ""; }; 9DC95F2E1C10596500138E4B /* Constants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Constants.m; sourceTree = ""; }; 9DD0E9CD1F459ECE00B2A759 /* ADJUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUserDefaults.h; sourceTree = ""; }; @@ -264,7 +262,6 @@ 6FCC85131F2794E800D6A0ED /* ADJReachability.m */, 9DD0E9CD1F459ECE00B2A759 /* ADJUserDefaults.h */, 9DD0E9CE1F459ECE00B2A759 /* ADJUserDefaults.m */, - 9D449F3E1E6EE6C500E7E80B /* Info.plist */, ); name = Adjust; path = ../../../Adjust; @@ -358,7 +355,6 @@ files = ( 963909C21BCC0D8300A2E8A4 /* Assets.xcassets in Resources */, 963909C01BCC0D8300A2E8A4 /* Main.storyboard in Resources */, - 9D449F5F1E6EE6C500E7E80B /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 000000000..a7204864f --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash + +set -e + +# ======================================== # + +# Colors for output +NC='\033[0m' +RED='\033[0;31m' +CYAN='\033[1;36m' +GREEN='\033[0;32m' + +# ======================================== # + +# Directories and paths of interest for the script. +SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +ROOT_DIR="$(dirname "$SCRIPTS_DIR")" +cd ${ROOT_DIR} + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Removing framework targets folders ... ${NC}" +rm -rf frameworks +rm -rf Carthage +rm -rf build +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Creating framework targets folders ... ${NC}" +mkdir -p frameworks/static +mkdir -p frameworks/dynamic/ios +mkdir -p frameworks/dynamic/tvos +mkdir -p frameworks/dynamic/imessage +mkdir -p frameworks/dynamic/webbridge +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Bulding static SDK framework and copying it to destination folder ... ${NC}" +xcodebuild -target AdjustStatic -configuration Release clean build +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Bulding universal tvOS SDK framework (device + simulator) and copying it to destination folder ... ${NC}" +xcodebuild -configuration Release -target AdjustSdkTv -arch x86_64 -sdk appletvsimulator clean build +xcodebuild -configuration Release -target AdjustSdkTv -arch arm64 -sdk appletvos clean build +cp -Rv build/Release-appletvos/AdjustSdkTv.framework frameworks/static +lipo -create -output frameworks/static/AdjustSdkTv.framework/AdjustSdkTv build/Release-appletvos/AdjustSdkTv.framework/AdjustSdkTv build/Release-appletvsimulator/AdjustSdkTv.framework/AdjustSdkTv +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Moving shared schemas to generate dynamic iOS and tvOS SDK framework using Carthage ... ${NC}" +mv Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkIm.xcscheme \ + Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkWebBridge.xcscheme . +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Bulding dynamic iOS and tvOS targets with Carthage ... ${NC}" +carthage build --no-skip-current +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Move Carthage generated dynamic iOS SDK framework to destination folder ... ${NC}" +mv Carthage/Build/iOS/* frameworks/dynamic/ios +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Move Carthage generated dynamic tvOs SDK framework to destination folder ... ${NC}" +mv Carthage/Build/tvOS/* frameworks/dynamic/tvos/ +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Moving shared schemas to generate dynamic iMessage SDK framework using Carthage ... ${NC}" +mv Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdk.xcscheme \ + Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkTv.xcscheme . +mv AdjustSdkIm.xcscheme Adjust.xcodeproj/xcshareddata/xcschemes +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Bulding dynamic iMessage target with Carthage ... ${NC}" +carthage build --no-skip-current +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Move Carthage generated dynamic iMessage SDK framework to destination folder ... ${NC}" +mv Carthage/Build/iOS/* frameworks/dynamic/imessage/ +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Moving shared schemas to generate dynamic WebBridge SDK framework using Carthage ... ${NC}" +mv Adjust.xcodeproj/xcshareddata/xcschemes/AdjustSdkIm.xcscheme . +mv AdjustSdkWebBridge.xcscheme Adjust.xcodeproj/xcshareddata/xcschemes +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Bulding dynamic WebBridge target with Carthage ... ${NC}" +carthage build --no-skip-current +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Move Carthage generated dynamic WebBridge SDK framework to destination folder ... ${NC}" +mv Carthage/Build/iOS/* frameworks/dynamic/webbridge/ +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Moving shared schemas back ... ${NC}" +mv *.xcscheme Adjust.xcodeproj/xcshareddata/xcschemes +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Bulding static test library framework and copying it to destination folder ... ${NC}" +cd ${ROOT_DIR}/AdjustTests/AdjustTestLibrary +xcodebuild -target AdjustTestLibraryStatic -configuration Debug clean build +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Done! ${NC}" + +# ======================================== # + +echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} Script completed! ${NC}"