diff --git a/Adjust.podspec b/Adjust.podspec index e5e8d48a9..8d98a56e4 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.24.0" + s.version = "4.25.0" s.summary = "This is the iOS SDK of adjust. You can read more about it at http://adjust.com." s.homepage = "https://github.com/adjust/ios_sdk" s.license = { :type => 'MIT', :file => 'MIT-LICENSE' } s.author = { "Christian Wellenbrock" => "welle@adjust.com" } - s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.24.0" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.25.0" } s.ios.deployment_target = '6.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' diff --git a/Adjust.xcodeproj/project.pbxproj b/Adjust.xcodeproj/project.pbxproj index 48f1b1ec7..cf3cb08a1 100644 --- a/Adjust.xcodeproj/project.pbxproj +++ b/Adjust.xcodeproj/project.pbxproj @@ -23,6 +23,10 @@ /* Begin PBXBuildFile section */ 2067002A1F18BDC700B4FDE1 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9601C19C1A31DD7F00A9AE21 /* CoreTelephony.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 6F84512425B1B1380004C7C0 /* ADJThirdPartySharing.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F84511025B1B1380004C7C0 /* ADJThirdPartySharing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6F84512525B1B1380004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84512325B1B1380004C7C0 /* ADJThirdPartySharing.m */; }; + 6FBE0C6E2577CDAC00EC2CE0 /* ADJThirdPartySharing.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FBE0C6C2577CDAC00EC2CE0 /* ADJThirdPartySharing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6FBE0C6F2577CDAC00EC2CE0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBE0C6D2577CDAC00EC2CE0 /* ADJThirdPartySharing.m */; }; 6FBEE92624E422EB00FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE92424E422EB00FEF3F1 /* ADJUrlStrategy.m */; }; 6FBEE92724E422EB00FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE92424E422EB00FEF3F1 /* ADJUrlStrategy.m */; }; 6FBEE92824E422EB00FEF3F1 /* ADJUrlStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FBEE92524E422EB00FEF3F1 /* ADJUrlStrategy.h */; }; @@ -237,6 +241,12 @@ 9D2F24042447DD6000B7CA90 /* ADJSubscription.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D2F24022447DD6000B7CA90 /* ADJSubscription.m */; }; 9D2F24052447DD6000B7CA90 /* ADJSubscription.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D2F24032447DD6000B7CA90 /* ADJSubscription.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9D363AC31BDA50FA00B47FE9 /* ADJLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 96E5E37318BBB48A008E7B30 /* ADJLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D651BF525B25A64006D69D6 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D651BE125B25A64006D69D6 /* ADJThirdPartySharing.m */; }; + 9D651BF625B25A64006D69D6 /* ADJThirdPartySharing.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D651BF425B25A64006D69D6 /* ADJThirdPartySharing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D651C8825B26DF5006D69D6 /* ADJThirdPartySharing.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D651C8625B26DF4006D69D6 /* ADJThirdPartySharing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D651C8925B26DF5006D69D6 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D651C8725B26DF5006D69D6 /* ADJThirdPartySharing.m */; }; + 9D651C9525B26E1B006D69D6 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D651C9325B26E1B006D69D6 /* ADJThirdPartySharing.m */; }; + 9D651C9625B26E1B006D69D6 /* ADJThirdPartySharing.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D651C9425B26E1B006D69D6 /* ADJThirdPartySharing.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 */; }; 9D7431F01EB9F9B700969F14 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D7431EF1EB9F9B700969F14 /* ViewController.m */; }; @@ -611,6 +621,10 @@ 6F0842182007766700568A31 /* AdjustTestLibrary.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AdjustTestLibrary.xcodeproj; path = AdjustTestLibrary/AdjustTestLibrary.xcodeproj; sourceTree = ""; }; 6F084240200776A000568A31 /* AdjustTestApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AdjustTestApp.xcodeproj; path = AdjustTestApp/AdjustTestApp.xcodeproj; sourceTree = ""; }; 6F7AF63F211878BC00F730B2 /* AdjustWebBridgeTestApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AdjustWebBridgeTestApp.xcodeproj; path = AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj; sourceTree = ""; }; + 6F84511025B1B1380004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 6F84512325B1B1380004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 6FBE0C6C2577CDAC00EC2CE0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 6FBE0C6D2577CDAC00EC2CE0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; 6FBEE8F124E2C26F00FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FBEE8F224E2C26F00FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FBEE92424E422EB00FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; @@ -850,6 +864,12 @@ 9D449DBF1E6ED23900E7E80B /* AdjustExample-Swift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "AdjustExample-Swift.xcodeproj"; path = "examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj"; sourceTree = ""; }; 9D449DC51E6ED24000E7E80B /* AdjustExample-tvOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "AdjustExample-tvOS.xcodeproj"; path = "examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj"; sourceTree = ""; }; 9D449DCB1E6ED24400E7E80B /* AdjustExample-WebView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "AdjustExample-WebView.xcodeproj"; path = "examples/AdjustExample-WebView/AdjustExample-WebView.xcodeproj"; sourceTree = ""; }; + 9D651BE125B25A64006D69D6 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 9D651BF425B25A64006D69D6 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 9D651C8625B26DF4006D69D6 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 9D651C8725B26DF5006D69D6 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 9D651C9325B26E1B006D69D6 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 9D651C9425B26E1B006D69D6 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; 9D7431E61EB9F9B700969F14 /* AdjustExampleTests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AdjustExampleTests.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9D7431E91EB9F9B700969F14 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 9D7431EB1EB9F9B700969F14 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -1378,6 +1398,8 @@ 9D2F23E12447CE5C00B7CA90 /* ADJSubscription.m */, 6FBEE8F124E2C26F00FEF3F1 /* ADJUrlStrategy.h */, 6FBEE8F224E2C26F00FEF3F1 /* ADJUrlStrategy.m */, + 9D651BF425B25A64006D69D6 /* ADJThirdPartySharing.h */, + 9D651BE125B25A64006D69D6 /* ADJThirdPartySharing.m */, ); path = Adjust; sourceTree = ""; @@ -1482,6 +1504,8 @@ 9D2F24022447DD6000B7CA90 /* ADJSubscription.m */, 6FBEE93224E4232800FEF3F1 /* ADJUrlStrategy.h */, 6FBEE93324E4232800FEF3F1 /* ADJUrlStrategy.m */, + 6F84511025B1B1380004C7C0 /* ADJThirdPartySharing.h */, + 6F84512325B1B1380004C7C0 /* ADJThirdPartySharing.m */, ); path = Adjust; sourceTree = SOURCE_ROOT; @@ -1690,6 +1714,8 @@ 9D2F23FB2447DD2500B7CA90 /* ADJSubscription.m */, 6FBEE92A24E4230700FEF3F1 /* ADJUrlStrategy.h */, 6FBEE92B24E4230700FEF3F1 /* ADJUrlStrategy.m */, + 9D651C8625B26DF4006D69D6 /* ADJThirdPartySharing.h */, + 9D651C8725B26DF5006D69D6 /* ADJThirdPartySharing.m */, ); path = Adjust; sourceTree = SOURCE_ROOT; @@ -1773,6 +1799,8 @@ 9D2F23F62447DCE800B7CA90 /* ADJSubscription.m */, 6FBEE92524E422EB00FEF3F1 /* ADJUrlStrategy.h */, 6FBEE92424E422EB00FEF3F1 /* ADJUrlStrategy.m */, + 6FBE0C6C2577CDAC00EC2CE0 /* ADJThirdPartySharing.h */, + 6FBE0C6D2577CDAC00EC2CE0 /* ADJThirdPartySharing.m */, ); path = Adjust; sourceTree = SOURCE_ROOT; @@ -1876,6 +1904,8 @@ 9D2F23FF2447DD3700B7CA90 /* ADJSubscription.m */, 6FBEE92E24E4231300FEF3F1 /* ADJUrlStrategy.h */, 6FBEE92F24E4231300FEF3F1 /* ADJUrlStrategy.m */, + 9D651C9425B26E1B006D69D6 /* ADJThirdPartySharing.h */, + 9D651C9325B26E1B006D69D6 /* ADJThirdPartySharing.m */, ); path = Adjust; sourceTree = SOURCE_ROOT; @@ -1908,11 +1938,12 @@ 96BCFBD11AC99246005A65C5 /* ADJAttribution.h in Headers */, 9D2F23E22447CE5C00B7CA90 /* ADJSubscription.h in Headers */, 9601CAE81C74BAAE00670879 /* ADJEventFailure.h in Headers */, + 968173871C3C2D36002AE1DE /* ADJSessionFailure.h in Headers */, + 968173831C3C2D07002AE1DE /* ADJSessionSuccess.h in Headers */, 9601CAE41C74B70600670879 /* ADJEventSuccess.h in Headers */, 6FCC85011F278CF300D6A0ED /* ADJReachability.h in Headers */, + 9D651BF625B25A64006D69D6 /* ADJThirdPartySharing.h in Headers */, 96BCFBD41AC99338005A65C5 /* NSData+ADJAdditions.h in Headers */, - 968173871C3C2D36002AE1DE /* ADJSessionFailure.h in Headers */, - 968173831C3C2D07002AE1DE /* ADJSessionSuccess.h in Headers */, 96BCFBD21AC99332005A65C5 /* NSString+ADJAdditions.h in Headers */, 96BCFBD31AC99336005A65C5 /* UIDevice+ADJAdditions.h in Headers */, 96BCFBD51AC9933E005A65C5 /* ADJActivityHandler.h in Headers */, @@ -1958,6 +1989,7 @@ 9D0E2E9E210B575600133B4F /* ADJSessionFailure.h in Headers */, 9D0E2EA4210B575600133B4F /* ADJSessionSuccess.h in Headers */, 9D0E2EA8210B575600133B4F /* ADJLogger.h in Headers */, + 6F84512425B1B1380004C7C0 /* ADJThirdPartySharing.h in Headers */, 9D0E2E92210B575600133B4F /* ADJKeychain.h in Headers */, 9D0E2E7D210B575600133B4F /* ADJAdjustFactory.h in Headers */, 9D0E2E76210B575600133B4F /* ADJActivityKind.h in Headers */, @@ -1999,10 +2031,11 @@ 9D2F23FC2447DD2500B7CA90 /* ADJSubscription.h in Headers */, 9DEAF0FD210072BC005CAEDB /* ADJAttribution.h in Headers */, 9DEAF12E210072BC005CAEDB /* ADJSessionSuccess.h in Headers */, + 9DEAF132210072BC005CAEDB /* ADJLogger.h in Headers */, + 9DEAF12C210072BC005CAEDB /* ADJEventFailure.h in Headers */, 9DEAF128210072BC005CAEDB /* ADJSessionFailure.h in Headers */, 9DEAF12B210072BC005CAEDB /* ADJEventSuccess.h in Headers */, - 9DEAF12C210072BC005CAEDB /* ADJEventFailure.h in Headers */, - 9DEAF132210072BC005CAEDB /* ADJLogger.h in Headers */, + 9D651C8825B26DF5006D69D6 /* ADJThirdPartySharing.h in Headers */, 9DEAF107210072BC005CAEDB /* ADJAdjustFactory.h in Headers */, 9DEAF100210072BC005CAEDB /* ADJActivityKind.h in Headers */, 9DEAF112210072BC005CAEDB /* ADJUserDefaults.h in Headers */, @@ -2043,8 +2076,9 @@ 9D2F23F92447DCE800B7CA90 /* ADJSubscription.h in Headers */, 9DF9C9251D6F3CA5008E362F /* ADJEventFailure.h in Headers */, 9DF9C9271D6F3CA5008E362F /* ADJEventSuccess.h in Headers */, - 9DF9C9371D6F3CA5008E362F /* ADJSessionFailure.h in Headers */, 9DF9C9391D6F3CA5008E362F /* ADJSessionSuccess.h in Headers */, + 9DF9C9371D6F3CA5008E362F /* ADJSessionFailure.h in Headers */, + 6FBE0C6E2577CDAC00EC2CE0 /* ADJThirdPartySharing.h in Headers */, 9DDF24431F7BE4BA001C1A70 /* ADJUserDefaults.h in Headers */, 6FCC85041F27945E00D6A0ED /* ADJReachability.h in Headers */, 9DF9C9111D6F3CA5008E362F /* NSData+ADJAdditions.h in Headers */, @@ -2086,8 +2120,9 @@ 9D2F24002447DD3700B7CA90 /* ADJSubscription.h in Headers */, 9DFB06761D7470C0006D48FC /* ADJEventFailure.h in Headers */, 9DFB06781D7470C0006D48FC /* ADJEventSuccess.h in Headers */, - 9DFB06881D7470C0006D48FC /* ADJSessionFailure.h in Headers */, 9DFB068A1D7470C0006D48FC /* ADJSessionSuccess.h in Headers */, + 9DFB06881D7470C0006D48FC /* ADJSessionFailure.h in Headers */, + 9D651C9625B26E1B006D69D6 /* ADJThirdPartySharing.h in Headers */, 9DDF24451F7BE4E7001C1A70 /* ADJUserDefaults.h in Headers */, 6FCC85081F27948C00D6A0ED /* ADJReachability.h in Headers */, 9DFB06621D7470C0006D48FC /* NSData+ADJAdditions.h in Headers */, @@ -2595,6 +2630,7 @@ 96E5E39218BBB48A008E7B30 /* ADJAdjustFactory.m in Sources */, 96E5E39318BBB48A008E7B30 /* ADJLogger.m in Sources */, 96E5E39518BBB48A008E7B30 /* ADJPackageHandler.m in Sources */, + 9D651BF525B25A64006D69D6 /* ADJThirdPartySharing.m in Sources */, 96E5E39418BBB48A008E7B30 /* ADJPackageBuilder.m in Sources */, 6FCC85001F278CF300D6A0ED /* ADJReachability.m in Sources */, 96E5E39618BBB48A008E7B30 /* ADJRequestHandler.m in Sources */, @@ -2690,6 +2726,7 @@ 9D0E2E6E210B575600133B4F /* ADJAttributionHandler.m in Sources */, 9D0E2E87210B575600133B4F /* ADJBackoffStrategy.m in Sources */, 9D0E2EBB210B575600133B4F /* AdjustBridgeRegister.m in Sources */, + 6F84512525B1B1380004C7C0 /* ADJThirdPartySharing.m in Sources */, 9D0E2E84210B575600133B4F /* ADJTimerCycle.m in Sources */, 9D0E2E6C210B575600133B4F /* ADJDeviceInfo.m in Sources */, 6FBEE93524E4232800FEF3F1 /* ADJUrlStrategy.m in Sources */, @@ -2728,6 +2765,7 @@ 9DEAF113210072BC005CAEDB /* Adjust.m in Sources */, 9DEAF136210072BC005CAEDB /* ADJActivityHandler.m in Sources */, 9DEAF0FE210072BC005CAEDB /* ADJKeychain.m in Sources */, + 9D651C8925B26DF5006D69D6 /* ADJThirdPartySharing.m in Sources */, 9DEAF10A210072BC005CAEDB /* ADJSessionFailure.m in Sources */, 9DEAF121210072BC005CAEDB /* UIDevice+ADJAdditions.m in Sources */, 9DEAF105210072BC005CAEDB /* ADJSessionSuccess.m in Sources */, @@ -2770,6 +2808,7 @@ 9DF9C9101D6F3CA5008E362F /* ADJActivityState.m in Sources */, 9DF9C9181D6F3CA5008E362F /* ADJAdjustFactory.m in Sources */, 9DF9C92C1D6F3CA5008E362F /* ADJLogger.m in Sources */, + 6FBE0C6F2577CDAC00EC2CE0 /* ADJThirdPartySharing.m in Sources */, 9DF9C92E1D6F3CA5008E362F /* ADJPackageBuilder.m in Sources */, 9DF9C9301D6F3CA5008E362F /* ADJPackageHandler.m in Sources */, 6FCC85051F27946100D6A0ED /* ADJReachability.m in Sources */, @@ -2812,6 +2851,7 @@ 9DFB06611D7470C0006D48FC /* ADJActivityState.m in Sources */, 9DFB06691D7470C0006D48FC /* ADJAdjustFactory.m in Sources */, 9DFB067D1D7470C0006D48FC /* ADJLogger.m in Sources */, + 9D651C9525B26E1B006D69D6 /* ADJThirdPartySharing.m in Sources */, 9DFB067F1D7470C0006D48FC /* ADJPackageBuilder.m in Sources */, 9DFB06811D7470C0006D48FC /* ADJPackageHandler.m in Sources */, 6FCC85091F27949000D6A0ED /* ADJReachability.m in Sources */, diff --git a/Adjust/ADJActivityHandler.h b/Adjust/ADJActivityHandler.h index c22609d8d..3670ccfe3 100644 --- a/Adjust/ADJActivityHandler.h +++ b/Adjust/ADJActivityHandler.h @@ -11,6 +11,7 @@ #import "ADJActivityState.h" #import "ADJDeviceInfo.h" #import "ADJSessionParameters.h" +#import "ADJThirdPartySharing.h" @interface ADJInternalState : NSObject @@ -45,6 +46,8 @@ @property (nonatomic, copy) NSNumber *enabled; @property (nonatomic, assign) BOOL offline; @property (nonatomic, copy) NSString *extraPath; +@property (nonatomic, strong) NSMutableArray *preLaunchAdjustThirdPartySharingArray; +@property (nonatomic, copy) NSNumber *lastMeasurementConsentTracked; - (id)init; @@ -86,6 +89,8 @@ - (BOOL)updateAttributionI:(id)selfI attribution:(ADJAttribution *)attribution; - (void)setAttributionDetails:(NSDictionary *)attributionDetails error:(NSError *)error; +- (void)setAdServicesAttributionToken:(NSString *)token + error:(NSError *)error; - (void)setOfflineMode:(BOOL)offline; - (void)sendFirstPackages; @@ -100,6 +105,8 @@ - (void)resetSessionPartnerParameters; - (void)trackAdRevenue:(NSString *)soruce payload:(NSData *)payload; - (void)disableThirdPartySharing; +- (void)trackThirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing; +- (void)trackMeasurementConsent:(BOOL)enabled; - (void)trackSubscription:(ADJSubscription *)subscription; - (void)updateAttStatusFromUserCallback:(int)newAttStatusFromUser; diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index 69569dcea..5a9d77b44 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -23,6 +23,7 @@ #import "ADJUrlStrategy.h" NSString * const ADJiAdPackageKey = @"iad3"; +NSString * const ADJAdServicesPackageKey = @"apple_ads"; typedef void (^activityHandlerBlockI)(ADJActivityHandler * activityHandler); @@ -42,6 +43,7 @@ static double kSessionInterval; static double kSubSessionInterval; static const int kiAdRetriesCount = 3; +static const int kAdServicesdRetriesCount = 1; @implementation ADJInternalState @@ -90,6 +92,7 @@ @interface ADJActivityHandler() @property (nonatomic, strong) ADJTimerCycle *foregroundTimer; @property (nonatomic, strong) ADJTimerOnce *backgroundTimer; @property (nonatomic, assign) NSInteger iAdRetriesLeft; +@property (nonatomic, assign) NSInteger adServicesRetriesLeft; @property (nonatomic, strong) ADJInternalState *internalState; @property (nonatomic, strong) ADJDeviceInfo *deviceInfo; @property (nonatomic, strong) ADJTimerOnce *delayStartTimer; @@ -99,6 +102,7 @@ @interface ADJActivityHandler() @property (nonatomic, weak) NSObject *adjustDelegate; // copy for objects shared with the user @property (nonatomic, copy) ADJConfig *adjustConfig; +@property (nonatomic, weak) ADJSavedPreLaunch *savedPreLaunch; @property (nonatomic, copy) NSData* deviceTokenData; @property (nonatomic, copy) NSString* basePath; @property (nonatomic, copy) NSString* gdprPath; @@ -148,8 +152,12 @@ - (id)initWithConfig:(ADJConfig *)adjustConfig if (adjustConfig.allowiAdInfoReading == NO) { [ADJAdjustFactory.logger warn:@"iAd info reading has been switched off"]; } + if (adjustConfig.allowAdServicesInfoReading == NO) { + [ADJAdjustFactory.logger warn:@"AdServices info reading has been switched off"]; + } self.adjustConfig = adjustConfig; + self.savedPreLaunch = savedPreLaunch; self.adjustDelegate = adjustConfig.delegate; // init logger to be available everywhere @@ -206,6 +214,7 @@ - (id)initWithConfig:(ADJConfig *)adjustConfig self.internalState.sessionResponseProcessed = NO; self.iAdRetriesLeft = kiAdRetriesCount; + self.adServicesRetriesLeft = kAdServicesdRetriesCount; self.trackingStatusManager = [[ADJTrackingStatusManager alloc] initWithActivityHandler:self]; @@ -400,6 +409,30 @@ - (void)setTrackingStateOptedOut { }]; } +- (void)setAdServicesAttributionToken:(NSString *)token + error:(NSError *)error { + if (![ADJUtil isNull:error]) { + [self.logger warn:@"Unable to read AdServices details"]; + + // 3 == platform not supported + if (error.code != 3 && self.adServicesRetriesLeft > 0) { + self.adServicesRetriesLeft = self.adServicesRetriesLeft - 1; + // retry after 5 seconds + dispatch_time_t retryTime = dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC); + dispatch_after(retryTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self checkForAdServicesAttributionI:self]; + }); + } else { + [self sendAdServicesInfoPackage:self + token:nil + errorCodeNumber:[NSNumber numberWithInteger:error.code]]; + } + } else { + [self sendAdServicesInfoPackage:self + token:token + errorCodeNumber:nil]; + } +} - (void)setAttributionDetails:(NSDictionary *)attributionDetails error:(NSError *)error @@ -521,7 +554,7 @@ - (void)sendIad3ClickPackage:(ADJActivityHandler *)selfI if (![selfI isEnabledI:selfI]) { return; } - + if (ADJAdjustFactory.iAdFrameworkEnabled == NO) { [self.logger verbose:@"Sending iAd details to server suppressed."]; return; @@ -545,10 +578,46 @@ - (void)sendIad3ClickPackage:(ADJActivityHandler *)selfI clickBuilder.attributionDetails = attributionDetails; - ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:ADJiAdPackageKey]; + ADJActivityPackage *clickPackage = [clickBuilder buildClickPackage:ADJiAdPackageKey]; [selfI.sdkClickHandler sendSdkClick:clickPackage]; } +- (void)sendAdServicesInfoPackage:(ADJActivityHandler *)selfI + token:(NSString *)token + errorCodeNumber:(NSNumber *)errorCodeNumber + { + if (![selfI isEnabledI:selfI]) { + return; + } + + if (ADJAdjustFactory.adServicesFrameworkEnabled == NO) { + [self.logger verbose:@"Sending AdServices attribution to server suppressed."]; + return; + } + + double now = [NSDate.date timeIntervalSince1970]; + if (selfI.activityState != nil) { + [ADJUtil launchSynchronisedWithObject:[ADJActivityState class] + block:^{ + double lastInterval = now - selfI.activityState.lastActivity; + selfI.activityState.lastInterval = lastInterval; + }]; + } + ADJPackageBuilder *infoBuilder = [[ADJPackageBuilder alloc] + initWithDeviceInfo:selfI.deviceInfo + activityState:selfI.activityState + config:selfI.adjustConfig + sessionParameters:self.sessionParameters + trackingStatusManager:self.trackingStatusManager + createdAt:now]; + + ADJActivityPackage *infoPackage = + [infoBuilder buildInfoPackage:ADJAdServicesPackageKey + token:token + errorCodeNumber:errorCodeNumber]; + [selfI.packageHandler addPackage:infoPackage]; +} + - (void)saveAttributionDetailsI:(ADJActivityHandler *)selfI attributionDetails:(NSDictionary *)attributionDetails { @@ -667,6 +736,37 @@ - (void)disableThirdPartySharing { }]; } +- (void)trackThirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing { + [ADJUtil launchInQueue:self.internalQueue + selfInject:self + block:^(ADJActivityHandler * selfI) { + BOOL tracked = + [selfI trackThirdPartySharingI:selfI thirdPartySharing:thirdPartySharing]; + if (! tracked) { + if (self.savedPreLaunch.preLaunchAdjustThirdPartySharingArray == nil) { + self.savedPreLaunch.preLaunchAdjustThirdPartySharingArray = + [[NSMutableArray alloc] init]; + } + + [self.savedPreLaunch.preLaunchAdjustThirdPartySharingArray + addObject:thirdPartySharing]; + } + }]; +} + +- (void)trackMeasurementConsent:(BOOL)enabled { + [ADJUtil launchInQueue:self.internalQueue + selfInject:self + block:^(ADJActivityHandler * selfI) { + BOOL tracked = + [selfI trackMeasurementConsentI:selfI enabled:enabled]; + if (! tracked) { + selfI.savedPreLaunch.lastMeasurementConsentTracked = + [NSNumber numberWithBool:enabled]; + } + }]; +} + - (void)writeActivityState { [ADJUtil launchInQueue:self.internalQueue selfInject:self @@ -693,7 +793,8 @@ - (void)trackAttStatusUpdateI:(ADJActivityHandler *)selfI { trackingStatusManager:self.trackingStatusManager createdAt:now]; - ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"att"]; + ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"att" + token:nil errorCodeNumber:nil]; [selfI.packageHandler addPackage:infoPackage]; if (selfI.adjustConfig.eventBufferingEnabled) { @@ -902,6 +1003,10 @@ - (void)initI:(ADJActivityHandler *)selfI if (selfI.adjustConfig.allowiAdInfoReading == YES) { [selfI checkForiAdI:selfI]; } + + if (selfI.adjustConfig.allowAdServicesInfoReading == YES) { + [selfI checkForAdServicesAttributionI:selfI]; + } [selfI.trackingStatusManager checkForNewAttStatus]; @@ -963,6 +1068,24 @@ - (void)processSessionI:(ADJActivityHandler *)selfI { if ([ADJUserDefaults getDisableThirdPartySharing]) { [selfI disableThirdPartySharingI:selfI]; } + if (selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray != nil) { + for (ADJThirdPartySharing *thirdPartySharing + in selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray) + { + [selfI trackThirdPartySharingI:selfI + thirdPartySharing:thirdPartySharing]; + } + + selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray = nil; + } + if (selfI.savedPreLaunch.lastMeasurementConsentTracked != nil) { + [selfI + trackMeasurementConsentI:selfI + enabled:[selfI.savedPreLaunch.lastMeasurementConsentTracked boolValue]]; + + selfI.savedPreLaunch.lastMeasurementConsentTracked = nil; + } + [ADJUtil launchSynchronisedWithObject:[ADJActivityState class] block:^{ selfI.activityState.sessionCount = 1; // this is the first session @@ -1025,6 +1148,8 @@ - (void)trackNewSessionI:(double)now withActivityHandler:(ADJActivityHandler *)s return; } + [selfI checkForAdServicesAttributionI:selfI]; + double lastInterval = now - selfI.activityState.lastActivity; [ADJUtil launchSynchronisedWithObject:[ADJActivityState class] block:^{ @@ -1255,6 +1380,80 @@ - (void)disableThirdPartySharingI:(ADJActivityHandler *)selfI { } } +- (BOOL)trackThirdPartySharingI:(ADJActivityHandler *)selfI + thirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing +{ + if (!selfI.activityState) { + return NO; + } + if (![selfI isEnabledI:selfI]) { + return NO; + } + if (selfI.activityState.isGdprForgotten) { + return NO; + } + + double now = [NSDate.date timeIntervalSince1970]; + + // build package + ADJPackageBuilder *tpsBuilder = [[ADJPackageBuilder alloc] + initWithDeviceInfo:selfI.deviceInfo + activityState:selfI.activityState + config:selfI.adjustConfig + sessionParameters:selfI.sessionParameters + trackingStatusManager:self.trackingStatusManager + createdAt:now]; + + ADJActivityPackage *dtpsPackage = [tpsBuilder buildThirdPartySharingPackage:thirdPartySharing]; + + [selfI.packageHandler addPackage:dtpsPackage]; + + if (selfI.adjustConfig.eventBufferingEnabled) { + [selfI.logger info:@"Buffered event %@", dtpsPackage.suffix]; + } else { + [selfI.packageHandler sendFirstPackage]; + } + + return YES; +} + +- (BOOL)trackMeasurementConsentI:(ADJActivityHandler *)selfI + enabled:(BOOL)enabled +{ + if (!selfI.activityState) { + return NO; + } + if (![selfI isEnabledI:selfI]) { + return NO; + } + if (selfI.activityState.isGdprForgotten) { + return NO; + } + + double now = [NSDate.date timeIntervalSince1970]; + + // build package + ADJPackageBuilder *tpsBuilder = [[ADJPackageBuilder alloc] + initWithDeviceInfo:selfI.deviceInfo + activityState:selfI.activityState + config:selfI.adjustConfig + sessionParameters:selfI.sessionParameters + trackingStatusManager:self.trackingStatusManager + createdAt:now]; + + ADJActivityPackage *mcPackage = [tpsBuilder buildMeasurementConsentPackage:enabled]; + + [selfI.packageHandler addPackage:mcPackage]; + + if (selfI.adjustConfig.eventBufferingEnabled) { + [selfI.logger info:@"Buffered event %@", mcPackage.suffix]; + } else { + [selfI.packageHandler sendFirstPackage]; + } + + return YES; +} + - (void)launchEventResponseTasksI:(ADJActivityHandler *)selfI eventResponseData:(ADJEventResponseData *)eventResponseData { [selfI updateAdidI:selfI adid:eventResponseData.adid]; @@ -1481,12 +1680,34 @@ - (void)setEnabledI:(ADJActivityHandler *)selfI enabled:(BOOL)enabled { } if ([ADJUserDefaults getGdprForgetMe]) { [selfI setGdprForgetMe]; - } else if ([ADJUserDefaults getDisableThirdPartySharing]) { - [selfI disableThirdPartySharing]; + } else { + if ([ADJUserDefaults getDisableThirdPartySharing]) { + [selfI disableThirdPartySharing]; + } + if (selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray != nil) { + for (ADJThirdPartySharing *thirdPartySharing + in selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray) + { + [selfI trackThirdPartySharing:thirdPartySharing]; + } + + selfI.savedPreLaunch.preLaunchAdjustThirdPartySharingArray = nil; + } + if (selfI.savedPreLaunch.lastMeasurementConsentTracked != nil) { + [selfI + trackMeasurementConsent: + [selfI.savedPreLaunch.lastMeasurementConsentTracked boolValue]]; + + selfI.savedPreLaunch.lastMeasurementConsentTracked = nil; + } + } if (selfI.adjustConfig.allowiAdInfoReading == YES) { [selfI checkForiAdI:selfI]; } + if (selfI.adjustConfig.allowAdServicesInfoReading == YES) { + [selfI checkForAdServicesAttributionI:selfI]; + } } [selfI checkStatusI:selfI @@ -1500,6 +1721,14 @@ - (void)checkForiAdI:(ADJActivityHandler *)selfI { [[UIDevice currentDevice] adjCheckForiAd:selfI queue:selfI.internalQueue]; } +- (void)checkForAdServicesAttributionI:(ADJActivityHandler *)selfI { + if (@available(iOS 14.3, tvOS 14.3, *)) { + if (selfI.adjustConfig.allowAdServicesInfoReading == YES && selfI.attribution == nil) { + [[UIDevice currentDevice] adjCheckForAdServicesAttribution:selfI]; + } + } +} + - (void)setOfflineModeI:(ADJActivityHandler *)selfI offline:(BOOL)offline { // compare with the internal state @@ -1719,7 +1948,8 @@ - (void)setDeviceTokenI:(ADJActivityHandler *)selfI trackingStatusManager:self.trackingStatusManager createdAt:now]; - ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"push"]; + ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"push" + token:nil errorCodeNumber:nil]; [selfI.packageHandler addPackage:infoPackage]; @@ -1768,7 +1998,8 @@ - (void)setPushTokenI:(ADJActivityHandler *)selfI trackingStatusManager:self.trackingStatusManager createdAt:now]; - ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"push"]; + ADJActivityPackage *infoPackage = [infoBuilder buildInfoPackage:@"push" + token:nil errorCodeNumber:nil]; [selfI.packageHandler addPackage:infoPackage]; // if push token was cached, remove it diff --git a/Adjust/ADJActivityKind.h b/Adjust/ADJActivityKind.h index 1f83c99d0..c7867fec9 100644 --- a/Adjust/ADJActivityKind.h +++ b/Adjust/ADJActivityKind.h @@ -23,7 +23,9 @@ typedef NS_ENUM(int, ADJActivityKind) { ADJActivityKindGdpr = 7, ADJActivityKindAdRevenue = 8, ADJActivityKindDisableThirdPartySharing = 9, - ADJActivityKindSubscription = 10 + ADJActivityKindSubscription = 10, + ADJActivityKindThirdPartySharing = 11, + ADJActivityKindMeasurementConsent = 12 }; @interface ADJActivityKindUtil : NSObject diff --git a/Adjust/ADJActivityKind.m b/Adjust/ADJActivityKind.m index 7c8cb862d..fe6bb5b03 100644 --- a/Adjust/ADJActivityKind.m +++ b/Adjust/ADJActivityKind.m @@ -31,6 +31,10 @@ + (ADJActivityKind)activityKindFromString:(NSString *)activityKindString { return ADJActivityKindDisableThirdPartySharing; } else if ([@"subscription" isEqualToString:activityKindString]) { return ADJActivityKindSubscription; + } else if ([@"third_party_sharing" isEqualToString:activityKindString]) { + return ADJActivityKindThirdPartySharing; + } else if ([@"measurement_consent" isEqualToString:activityKindString]) { + return ADJActivityKindMeasurementConsent; } else { return ADJActivityKindUnknown; } @@ -56,6 +60,10 @@ + (NSString *)activityKindToString:(ADJActivityKind)activityKind { return @"disable_third_party_sharing"; case ADJActivityKindSubscription: return @"subscription"; + case ADJActivityKindThirdPartySharing: + return @"third_party_sharing"; + case ADJActivityKindMeasurementConsent: + return @"measurement_consent"; default: return @"unknown"; } diff --git a/Adjust/ADJAdditions/UIDevice+ADJAdditions.h b/Adjust/ADJAdditions/UIDevice+ADJAdditions.h index f47fbb56b..2b3c6f70f 100644 --- a/Adjust/ADJAdditions/UIDevice+ADJAdditions.h +++ b/Adjust/ADJAdditions/UIDevice+ADJAdditions.h @@ -23,6 +23,7 @@ - (NSString *)adjVendorId; - (NSString *)adjDeviceId:(ADJDeviceInfo *)deviceInfo; - (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler queue:(dispatch_queue_t)queue; +- (void)adjCheckForAdServicesAttribution:(ADJActivityHandler *)activityHandler; - (void)requestTrackingAuthorizationWithCompletionHandler:(void (^)(NSUInteger status))completion; diff --git a/Adjust/ADJAdditions/UIDevice+ADJAdditions.m b/Adjust/ADJAdditions/UIDevice+ADJAdditions.m index 29a8aff6d..e7bf3a103 100644 --- a/Adjust/ADJAdditions/UIDevice+ADJAdditions.m +++ b/Adjust/ADJAdditions/UIDevice+ADJAdditions.m @@ -349,7 +349,7 @@ - (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler queue:(dispatch_que } [logger debug:@"iAd framework successfully found in user's app"]; - + BOOL iAdInformationAvailable = [self setiAdWithDetails:activityHandler adcClientSharedInstance:ADClientSharedClientInstance queue:queue]; @@ -362,6 +362,52 @@ - (void)adjCheckForiAd:(ADJActivityHandler *)activityHandler queue:(dispatch_que #endif } +- (void)adjCheckForAdServicesAttribution:(ADJActivityHandler *)activityHandler { + id logger = [ADJAdjustFactory logger]; + + // [AAAttribution attributionTokenWithError:...] + Class attributionClass = NSClassFromString(@"AAAttribution"); + if (attributionClass == nil) { + [logger warn:@"AdServices framework not found in user's app (AAAttribution not found)"]; + [activityHandler setAdServicesAttributionToken:nil + error:[NSError errorWithDomain:@"com.adjust.sdk.adServices" + code:100 + userInfo:@{@"Error reason": @"AdServices framework not found"}]]; + return; + } + + SEL attributionTokenSelector = NSSelectorFromString(@"attributionTokenWithError:"); + if (![attributionClass respondsToSelector:attributionTokenSelector]) { + [activityHandler setAdServicesAttributionToken:nil + error:[NSError errorWithDomain:@"com.adjust.sdk.adServices" + code:100 + userInfo:@{@"Error reason": @"AdServices framework not found"}]]; + return; + } + + NSMethodSignature *attributionTokenMethodSignature = [attributionClass methodSignatureForSelector:attributionTokenSelector]; + NSInvocation *tokenInvocation = [NSInvocation invocationWithMethodSignature:attributionTokenMethodSignature]; + [tokenInvocation setSelector:attributionTokenSelector]; + [tokenInvocation setTarget:attributionClass]; + + __autoreleasing NSError *error; + __autoreleasing NSError **errorPointer = &error; + [tokenInvocation setArgument:&errorPointer atIndex:2]; + [tokenInvocation invoke]; + + if (error) { + [logger error:@"Error while retrieving AdServices attribution token: %@", error]; + [activityHandler setAdServicesAttributionToken:nil error:error]; + return; + } + + NSString * __unsafe_unretained tmpToken = nil; + [tokenInvocation getReturnValue:&tmpToken]; + + NSString *token = tmpToken; + [activityHandler setAdServicesAttributionToken:token error:nil]; +} + - (BOOL)setiAdWithDetails:(ADJActivityHandler *)activityHandler adcClientSharedInstance:(id)ADClientSharedClientInstance queue:(dispatch_queue_t)queue { diff --git a/Adjust/ADJAdjustFactory.h b/Adjust/ADJAdjustFactory.h index cef20d7e3..bed7caf29 100644 --- a/Adjust/ADJAdjustFactory.h +++ b/Adjust/ADJAdjustFactory.h @@ -30,6 +30,7 @@ + (NSString *)gdprUrl; + (NSString *)subscriptionUrl; + (BOOL)iAdFrameworkEnabled; ++ (BOOL)adServicesFrameworkEnabled; + (void)setLogger:(id)logger; + (void)setSessionInterval:(double)sessionInterval; @@ -41,6 +42,7 @@ + (void)setSdkClickHandlerBackoffStrategy:(ADJBackoffStrategy *)backoffStrategy; + (void)setTesting:(BOOL)testing; + (void)setiAdFrameworkEnabled:(BOOL)iAdFrameworkEnabled; ++ (void)setAdServicesFrameworkEnabled:(BOOL)adServicesFrameworkEnabled; + (void)setMaxDelayStart:(NSTimeInterval)maxDelayStart; + (void)setBaseUrl:(NSString *)baseUrl; + (void)setGdprUrl:(NSString *)gdprUrl; diff --git a/Adjust/ADJAdjustFactory.m b/Adjust/ADJAdjustFactory.m index bb7b66c82..4670a6245 100644 --- a/Adjust/ADJAdjustFactory.m +++ b/Adjust/ADJAdjustFactory.m @@ -23,6 +23,7 @@ static BOOL internalTesting = NO; static NSTimeInterval internalMaxDelayStart = -1; static BOOL internaliAdFrameworkEnabled = YES; +static BOOL internalAdServicesFrameworkEnabled = YES; static NSString * internalBaseUrl = nil; static NSString * internalGdprUrl = nil; @@ -102,6 +103,10 @@ + (BOOL)iAdFrameworkEnabled { return internaliAdFrameworkEnabled; } ++ (BOOL)adServicesFrameworkEnabled { + return internalAdServicesFrameworkEnabled; +} + + (NSTimeInterval)maxDelayStart { if (internalMaxDelayStart < 0) { return 10.0; // 10 seconds @@ -161,6 +166,10 @@ + (void)setiAdFrameworkEnabled:(BOOL)iAdFrameworkEnabled { internaliAdFrameworkEnabled = iAdFrameworkEnabled; } ++ (void)setAdServicesFrameworkEnabled:(BOOL)adServicesFrameworkEnabled { + internalAdServicesFrameworkEnabled = adServicesFrameworkEnabled; +} + + (void)setMaxDelayStart:(NSTimeInterval)maxDelayStart { internalMaxDelayStart = maxDelayStart; } @@ -239,5 +248,6 @@ + (void)teardown:(BOOL)deleteState { internalGdprUrl = nil; internalSubscriptionUrl = nil; internaliAdFrameworkEnabled = YES; + internalAdServicesFrameworkEnabled = YES; } @end diff --git a/Adjust/ADJConfig.h b/Adjust/ADJConfig.h index 0d80e13c6..b062cf987 100644 --- a/Adjust/ADJConfig.h +++ b/Adjust/ADJConfig.h @@ -148,6 +148,11 @@ */ @property (nonatomic, assign) BOOL allowiAdInfoReading; +/** + * @brief Enables/disables reading of AdServices framework data needed for attribution. + */ +@property (nonatomic, assign) BOOL allowAdServicesInfoReading; + /** * @brief Enables/disables reading of IDFA parameter. */ diff --git a/Adjust/ADJConfig.m b/Adjust/ADJConfig.m index 773177882..0e09ab80d 100644 --- a/Adjust/ADJConfig.m +++ b/Adjust/ADJConfig.m @@ -69,6 +69,7 @@ - (id)initWithAppToken:(NSString *)appToken self.eventBufferingEnabled = NO; self.allowIdfaReading = YES; self.allowiAdInfoReading = YES; + self.allowAdServicesInfoReading = YES; _isSKAdNetworkHandlingActive = YES; return self; @@ -195,6 +196,7 @@ - (id)copyWithZone:(NSZone *)zone { copy.sendInBackground = self.sendInBackground; copy.allowIdfaReading = self.allowIdfaReading; copy.allowiAdInfoReading = self.allowiAdInfoReading; + copy.allowAdServicesInfoReading = self.allowAdServicesInfoReading; copy.delayStart = self.delayStart; copy.userAgent = [self.userAgent copyWithZone:zone]; copy.externalDeviceId = [self.externalDeviceId copyWithZone:zone]; diff --git a/Adjust/ADJPackageBuilder.h b/Adjust/ADJPackageBuilder.h index e25752995..18bf44555 100644 --- a/Adjust/ADJPackageBuilder.h +++ b/Adjust/ADJPackageBuilder.h @@ -14,6 +14,7 @@ #import "ADJSessionParameters.h" #import #import "ADJActivityHandler.h" +#import "ADJThirdPartySharing.h" @interface ADJPackageBuilder : NSObject @@ -41,7 +42,9 @@ - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event isInDelay:(BOOL)isInDelay; -- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource; +- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource + token:(NSString *)token + errorCodeNumber:(NSNumber *)errorCodeNumber; - (ADJActivityPackage *)buildAdRevenuePackage:(NSString *)source payload:(NSData *)payload; @@ -53,6 +56,10 @@ - (ADJActivityPackage *)buildDisableThirdPartySharingPackage; +- (ADJActivityPackage *)buildThirdPartySharingPackage:(nonnull ADJThirdPartySharing *)thirdPartySharing; + +- (ADJActivityPackage *)buildMeasurementConsentPackage:(BOOL)enabled; + - (ADJActivityPackage *)buildSubscriptionPackage:(ADJSubscription *)subscription isInDelay:(BOOL)isInDelay; diff --git a/Adjust/ADJPackageBuilder.m b/Adjust/ADJPackageBuilder.m index 49387314d..6feaa3cfd 100644 --- a/Adjust/ADJPackageBuilder.m +++ b/Adjust/ADJPackageBuilder.m @@ -91,8 +91,23 @@ - (ADJActivityPackage *)buildEventPackage:(ADJEvent *)event return eventPackage; } -- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource { +- (ADJActivityPackage *)buildInfoPackage:(NSString *)infoSource + token:(NSString *)token + errorCodeNumber:(NSNumber *)errorCodeNumber +{ NSMutableDictionary *parameters = [self getInfoParameters:infoSource]; + + if (token != nil) { + [ADJPackageBuilder parameters:parameters + setString:token + forKey:@"attribution_token"]; + } + if (errorCodeNumber != nil) { + [ADJPackageBuilder parameters:parameters + setInt:errorCodeNumber.intValue + forKey:@"error_code"]; + } + ADJActivityPackage *infoPackage = [self defaultActivityPackage]; infoPackage.path = @"/sdk_info"; infoPackage.activityKind = ADJActivityKindInfo; @@ -180,6 +195,33 @@ - (ADJActivityPackage *)buildDisableThirdPartySharingPackage { return dtpsPackage; } + +- (ADJActivityPackage *)buildThirdPartySharingPackage:(nonnull ADJThirdPartySharing *)thirdPartySharing { + NSMutableDictionary *parameters = [self getThirdPartySharingParameters:thirdPartySharing]; + ADJActivityPackage *tpsPackage = [self defaultActivityPackage]; + tpsPackage.path = @"/third_party_sharing"; + tpsPackage.activityKind = ADJActivityKindThirdPartySharing; + tpsPackage.suffix = @""; + tpsPackage.parameters = parameters; + + [self signWithSigV2Plugin:tpsPackage]; + + return tpsPackage; +} + +- (ADJActivityPackage *)buildMeasurementConsentPackage:(BOOL)enabled { + NSMutableDictionary *parameters = [self getMeasurementConsentParameters:enabled]; + ADJActivityPackage *mcPackage = [self defaultActivityPackage]; + mcPackage.path = @"/measurement_consent"; + mcPackage.activityKind = ADJActivityKindMeasurementConsent; + mcPackage.suffix = @""; + mcPackage.parameters = parameters; + + [self signWithSigV2Plugin:mcPackage]; + + return mcPackage; +} + - (ADJActivityPackage *)buildSubscriptionPackage:(ADJSubscription *)subscription isInDelay:(BOOL)isInDelay { NSMutableDictionary *parameters = [self getSubscriptionParameters:isInDelay forSubscriptionPackage:subscription]; @@ -899,6 +941,176 @@ - (NSMutableDictionary *)getDisableThirdPartySharingParameters { return parameters; } +- (NSMutableDictionary *)getThirdPartySharingParameters:(nonnull ADJThirdPartySharing *)thirdPartySharing { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getUpdateTime] forKey:@"app_updated_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDictionary:[self.sessionParameters.callbackParameters copy] forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.clickTime forKey:@"click_time"]; + [ADJPackageBuilder parameters:parameters setNumberInt:[ADJUtil readReachabilityFlags] forKey:@"connectivity_type"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.countryCode forKey:@"country"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.cpuSubtype forKey:@"cpu_type"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deeplink forKey:@"deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.defaultTracker forKey:@"default_tracker"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.attributionDetails forKey:@"details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.externalDeviceId forKey:@"external_device_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.fbAnonymousId forKey:@"fb_anon_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.machineModel forKey:@"hardware_name"]; + if (self.adjustConfig.allowIdfaReading == YES) { + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + } + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getInstallTime] forKey:@"installed_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.languageCode forKey:@"language"]; + [ADJPackageBuilder parameters:parameters setString:[[UIDevice currentDevice] adjDeviceId:_deviceInfo] forKey:@"m"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.deeplinkParameters forKey:@"params"]; + [ADJPackageBuilder parameters:parameters setDictionary:[self.sessionParameters.partnerParameters copy] forKey:@"partner_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.purchaseTime forKey:@"purchase_time"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + + // Third Party Sharing + if (thirdPartySharing.enabled != nil) { + NSString *enableValue = thirdPartySharing.enabled.boolValue ? @"enable" : @"disable"; + [ADJPackageBuilder parameters:parameters setString:enableValue forKey:@"sharing"]; + } + [ADJPackageBuilder parameters:parameters + setDictionaryJson:thirdPartySharing.granularOptions + forKey:@"granular_third_party_sharing_options"]; + + if ([self.trackingStatusManager canGetAttStatus]) { + [ADJPackageBuilder parameters:parameters setInt:self.trackingStatusManager.attStatus + forKey:@"att_status"]; + } else { + [ADJPackageBuilder parameters:parameters setInt:self.trackingStatusManager.trackingEnabled + forKey:@"tracking_enabled"]; + } + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.sessionCount forKey:@"session_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"]; + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + +#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMCC] forKey:@"mcc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMNC] forKey:@"mnc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readCurrentRadioAccessTechnology] forKey:@"network_type"]; +#endif + + return parameters; +} + +- (NSMutableDictionary *)getMeasurementConsentParameters:(BOOL)enabled { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appSecret forKey:@"app_secret"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.appToken forKey:@"app_token"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getUpdateTime] forKey:@"app_updated_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleVersion forKey:@"app_version"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundleShortVersion forKey:@"app_version_short"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"attribution_deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.bundeIdentifier forKey:@"bundle_id"]; + [ADJPackageBuilder parameters:parameters setDictionary:[self.sessionParameters.callbackParameters copy] forKey:@"callback_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.clickTime forKey:@"click_time"]; + [ADJPackageBuilder parameters:parameters setNumberInt:[ADJUtil readReachabilityFlags] forKey:@"connectivity_type"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.countryCode forKey:@"country"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.cpuSubtype forKey:@"cpu_type"]; + [ADJPackageBuilder parameters:parameters setDate1970:self.createdAt forKey:@"created_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deeplink forKey:@"deeplink"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.defaultTracker forKey:@"default_tracker"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.attributionDetails forKey:@"details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceName forKey:@"device_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.deviceType forKey:@"device_type"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.environment forKey:@"environment"]; + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.eventBufferingEnabled forKey:@"event_buffering_enabled"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.externalDeviceId forKey:@"external_device_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.fbAnonymousId forKey:@"fb_anon_id"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.machineModel forKey:@"hardware_name"]; + if (self.adjustConfig.allowIdfaReading == YES) { + [ADJPackageBuilder parameters:parameters setString:UIDevice.currentDevice.adjIdForAdvertisers forKey:@"idfa"]; + } + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.vendorId forKey:@"idfv"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.installReceiptBase64 forKey:@"install_receipt"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil getInstallTime] forKey:@"installed_at"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.languageCode forKey:@"language"]; + [ADJPackageBuilder parameters:parameters setString:[[UIDevice currentDevice] adjDeviceId:_deviceInfo] forKey:@"m"]; + [ADJPackageBuilder parameters:parameters setBool:YES forKey:@"needs_response_details"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osBuild forKey:@"os_build"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.osName forKey:@"os_name"]; + [ADJPackageBuilder parameters:parameters setString:self.deviceInfo.systemVersion forKey:@"os_version"]; + [ADJPackageBuilder parameters:parameters setDictionary:self.deeplinkParameters forKey:@"params"]; + [ADJPackageBuilder parameters:parameters setDictionary:[self.sessionParameters.partnerParameters copy] forKey:@"partner_params"]; + [ADJPackageBuilder parameters:parameters setDate:self.purchaseTime forKey:@"purchase_time"]; + [ADJPackageBuilder parameters:parameters setString:self.adjustConfig.secretId forKey:@"secret_id"]; + + // Measurement Consent + NSString *enableValue = enabled ? @"enable" : @"disable"; + [ADJPackageBuilder parameters:parameters + setString:enableValue + forKey:@"sharing"]; + + if ([self.trackingStatusManager canGetAttStatus]) { + [ADJPackageBuilder parameters:parameters setInt:self.trackingStatusManager.attStatus + forKey:@"att_status"]; + } else { + [ADJPackageBuilder parameters:parameters setInt:self.trackingStatusManager.trackingEnabled + forKey:@"tracking_enabled"]; + } + + if (self.adjustConfig.isDeviceKnown) { + [ADJPackageBuilder parameters:parameters setBool:self.adjustConfig.isDeviceKnown forKey:@"device_known"]; + } + + if (self.activityState != nil) { + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.lastInterval forKey:@"last_interval"]; + [ADJPackageBuilder parameters:parameters setString:self.activityState.deviceToken forKey:@"push_token"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.sessionCount forKey:@"session_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.sessionLength forKey:@"session_length"]; + [ADJPackageBuilder parameters:parameters setInt:self.activityState.subsessionCount forKey:@"subsession_count"]; + [ADJPackageBuilder parameters:parameters setDuration:self.activityState.timeSpent forKey:@"time_spent"]; + if (self.activityState.isPersisted) { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"persistent_ios_uuid"]; + } else { + [ADJPackageBuilder parameters:parameters setString:self.activityState.uuid forKey:@"ios_uuid"]; + } + } + +#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMCC] forKey:@"mcc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readMNC] forKey:@"mnc"]; + [ADJPackageBuilder parameters:parameters setString:[ADJUtil readCurrentRadioAccessTechnology] forKey:@"network_type"]; +#endif + + return parameters; +} - (NSMutableDictionary *)getSubscriptionParameters:(BOOL)isInDelay forSubscriptionPackage:(ADJSubscription *)subscription { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; diff --git a/Adjust/ADJRequestHandler.m b/Adjust/ADJRequestHandler.m index c71e6b6c1..c29431937 100644 --- a/Adjust/ADJRequestHandler.m +++ b/Adjust/ADJRequestHandler.m @@ -345,7 +345,7 @@ - (void)handleResponseWithData:(NSData *)data NSString *urlString = [NSString stringWithFormat:@"%@%@%@", urlHostString, self.urlStrategy.extraPath, path]; - [self.logger verbose:@"Sending request to endpoint: %@", urlString]; + [self.logger verbose:@"Makig request to endpoint: %@", urlString]; NSURL *url = [NSURL URLWithString:urlString]; //NSURL *url = [baseUrl URLByAppendingPathComponent:path]; diff --git a/Adjust/ADJThirdPartySharing.h b/Adjust/ADJThirdPartySharing.h new file mode 100644 index 000000000..610ca80bc --- /dev/null +++ b/Adjust/ADJThirdPartySharing.h @@ -0,0 +1,23 @@ +// +// ADJThirdPartySharing.h +// AdjustSdk +// +// Created by Pedro S. on 02.12.20. +// Copyright © 2020 adjust GmbH. All rights reserved. +// + +#import + +@interface ADJThirdPartySharing : NSObject + +- (nullable id)initWithIsEnabledNumberBool:(nullable NSNumber *)isEnabledNumberBool; + +- (void)addGranularOption:(nonnull NSString *)partnerName + key:(nonnull NSString *)key + value:(nonnull NSString *)value; + +@property (nonatomic, nullable, readonly, strong) NSNumber *enabled; +@property (nonatomic, nonnull, readonly, strong) NSMutableDictionary *granularOptions; + +@end + diff --git a/Adjust/ADJThirdPartySharing.m b/Adjust/ADJThirdPartySharing.m new file mode 100644 index 000000000..d39709112 --- /dev/null +++ b/Adjust/ADJThirdPartySharing.m @@ -0,0 +1,44 @@ +// +// ADJThirdPartySharing.m +// AdjustSdk +// +// Created by Pedro S. on 02.12.20. +// Copyright © 2020 adjust GmbH. All rights reserved. +// + +#import "ADJThirdPartySharing.h" +#import "ADJAdjustFactory.h" + +@implementation ADJThirdPartySharing + +- (nullable id)initWithIsEnabledNumberBool:(nullable NSNumber *)isEnabledNumberBool { + self = [super init]; + if (self == nil) { + return nil; + } + + _granularOptions = [[NSMutableDictionary alloc] init]; + _enabled = isEnabledNumberBool; + + return self; +} + +- (void)addGranularOption:(nonnull NSString *)partnerName + key:(nonnull NSString *)key + value:(nonnull NSString *)value +{ + if (partnerName == nil || key == nil || value == nil) { + [ADJAdjustFactory.logger error:@"Cannot add granular option with any nil value"]; + return; + } + + NSMutableDictionary *partnerOptions = [self.granularOptions objectForKey:partnerName]; + if (partnerOptions == nil) { + partnerOptions = [[NSMutableDictionary alloc] init]; + [self.granularOptions setObject:partnerOptions forKey:partnerName]; + } + + [partnerOptions setObject:value forKey:key]; +} + +@end diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 4b6ab811c..119ebe383 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -37,7 +37,7 @@ static CTTelephonyNetworkInfo *networkInfo = nil; #endif -static NSString * const kClientSdk = @"ios4.24.0"; +static NSString * const kClientSdk = @"ios4.25.0"; static NSString * const kDeeplinkParam = @"deep_link="; static NSString * const kSchemeDelimiter = @"://"; static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index 5040f3f56..cc8ab108d 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust // -// V4.24.0 +// V4.25.0 // Created by Christian Wellenbrock (wellle) on 23rd July 2013. // Copyright © 2012-2017 Adjust GmbH. All rights reserved. // @@ -11,6 +11,7 @@ #import "ADJConfig.h" #import "ADJAttribution.h" #import "ADJSubscription.h" +#import "ADJThirdPartySharing.h" @interface AdjustTestOptions : NSObject @@ -26,6 +27,7 @@ @property (nonatomic, assign) BOOL deleteState; @property (nonatomic, assign) BOOL noBackoffWait; @property (nonatomic, assign) BOOL iAdFrameworkEnabled; +@property (nonatomic, assign) BOOL adServicesFrameworkEnabled; @property (nonatomic, assign) BOOL enableSigning; @property (nonatomic, assign) BOOL disableSigning; @@ -273,6 +275,10 @@ extern NSString * __nonnull const ADJUrlStrategyChina; */ + (void)disableThirdPartySharing; ++ (void)trackThirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing; + ++ (void)trackMeasurementConsent:(BOOL)enabled; + /** * @brief Track subscription. * @@ -282,6 +288,8 @@ extern NSString * __nonnull const ADJUrlStrategyChina; + (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion; ++ (int)appTrackingAuthorizationStatus; + /** * Obtain singleton Adjust object. */ @@ -343,4 +351,6 @@ extern NSString * __nonnull const ADJUrlStrategyChina; - (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion; +- (int)appTrackingAuthorizationStatus; + @end diff --git a/Adjust/Adjust.m b/Adjust/Adjust.m index ce9b05071..faca96eef 100644 --- a/Adjust/Adjust.m +++ b/Adjust/Adjust.m @@ -231,19 +231,36 @@ + (void)disableThirdPartySharing { } } ++ (void)trackThirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing { + @synchronized (self) { + [[Adjust getInstance] trackThirdPartySharing:thirdPartySharing]; + } +} + ++ (void)trackMeasurementConsent:(BOOL)enabled { + @synchronized (self) { + [[Adjust getInstance] trackMeasurementConsent:enabled]; + } +} + + (void)trackSubscription:(nonnull ADJSubscription *)subscription { @synchronized (self) { [[Adjust getInstance] trackSubscription:subscription]; } } -+ (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion -{ ++ (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion { @synchronized (self) { [[Adjust getInstance] requestTrackingAuthorizationWithCompletionHandler:completion]; } } ++ (int)appTrackingAuthorizationStatus { + @synchronized (self) { + return [[Adjust getInstance] appTrackingAuthorizationStatus]; + } +} + + (ADJAttribution *)attribution { @synchronized (self) { return [[Adjust getInstance] attribution]; @@ -498,6 +515,29 @@ - (void)disableThirdPartySharing { [self.activityHandler disableThirdPartySharing]; } +- (void)trackThirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing { + if (![self checkActivityHandler]) { + if (self.savedPreLaunch.preLaunchAdjustThirdPartySharingArray == nil) { + self.savedPreLaunch.preLaunchAdjustThirdPartySharingArray = + [[NSMutableArray alloc] init]; + } + + [self.savedPreLaunch.preLaunchAdjustThirdPartySharingArray addObject:thirdPartySharing]; + return; + } + + [self.activityHandler trackThirdPartySharing:thirdPartySharing]; +} + +- (void)trackMeasurementConsent:(BOOL)enabled { + if (![self checkActivityHandler]) { + self.savedPreLaunch.lastMeasurementConsentTracked = [NSNumber numberWithBool:enabled]; + return; + } + + [self.activityHandler trackMeasurementConsent:enabled]; +} + - (void)trackSubscription:(ADJSubscription *)subscription { if (![self checkActivityHandler]) { return; @@ -506,10 +546,8 @@ - (void)trackSubscription:(ADJSubscription *)subscription { [self.activityHandler trackSubscription:subscription]; } -- (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion -{ - [UIDevice.currentDevice requestTrackingAuthorizationWithCompletionHandler:^(NSUInteger status) - { +- (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion { + [UIDevice.currentDevice requestTrackingAuthorizationWithCompletionHandler:^(NSUInteger status) { if (completion) { completion(status); } @@ -522,6 +560,10 @@ - (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSU }]; } +- (int)appTrackingAuthorizationStatus { + return [[UIDevice currentDevice] adjATTStatus]; +} + - (ADJAttribution *)attribution { if (![self checkActivityHandler]) { return nil; @@ -595,6 +637,7 @@ - (void)setTestOptions:(AdjustTestOptions *)testOptions { } [ADJAdjustFactory setiAdFrameworkEnabled:testOptions.iAdFrameworkEnabled]; + [ADJAdjustFactory setAdServicesFrameworkEnabled:testOptions.adServicesFrameworkEnabled]; } #pragma mark - Private & helper methods diff --git a/AdjustBridge/AdjustBridge.m b/AdjustBridge/AdjustBridge.m index a2fb0fcf3..66cd588df 100644 --- a/AdjustBridge/AdjustBridge.m +++ b/AdjustBridge/AdjustBridge.m @@ -193,6 +193,7 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView NSNumber *isDeviceKnown = [data objectForKey:@"isDeviceKnown"]; NSNumber *needsCost = [data objectForKey:@"needsCost"]; NSNumber *allowiAdInfoReading = [data objectForKey:@"allowiAdInfoReading"]; + NSNumber *allowAdServicesInfoReading = [data objectForKey:@"allowAdServicesInfoReading"]; NSNumber *allowIdfaReading = [data objectForKey:@"allowIdfaReading"]; NSNumber *secretId = [data objectForKey:@"secretId"]; NSString *info1 = [data objectForKey:@"info1"]; @@ -255,6 +256,9 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView if ([self isFieldValid:allowiAdInfoReading]) { [adjustConfig setAllowiAdInfoReading:[allowiAdInfoReading boolValue]]; } + if ([self isFieldValid:allowAdServicesInfoReading]) { + [adjustConfig setAllowAdServicesInfoReading:[allowAdServicesInfoReading boolValue]]; + } if ([self isFieldValid:allowIdfaReading]) { [adjustConfig setAllowIdfaReading:[allowIdfaReading boolValue]]; } @@ -409,14 +413,32 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView NSString *sdkVersion = [NSString stringWithFormat:@"%@@%@", sdkPrefix, [Adjust sdkVersion]]; responseCallback(sdkVersion); }]; - + [self.bridgeRegister registerHandler:@"adjust_idfa" handler:^(id data, WVJBResponseCallback responseCallback) { if (responseCallback == nil) { return; } responseCallback([Adjust idfa]); }]; - + + [self.bridgeRegister registerHandler:@"adjust_requestTrackingAuthorizationWithCompletionHandler" handler:^(id data, WVJBResponseCallback responseCallback) { + if (responseCallback == nil) { + return; + } + + [Adjust requestTrackingAuthorizationWithCompletionHandler:^(NSUInteger status) { + responseCallback([NSNumber numberWithUnsignedInteger:status]); + }]; + }]; + + [self.bridgeRegister registerHandler:@"adjust_appTrackingAuthorizationStatus" handler:^(id data, WVJBResponseCallback responseCallback) { + if (responseCallback == nil) { + return; + } + + responseCallback([NSNumber numberWithInt:[Adjust appTrackingAuthorizationStatus]]); + }]; + [self.bridgeRegister registerHandler:@"adjust_adid" handler:^(id data, WVJBResponseCallback responseCallback) { if (responseCallback == nil) { return; @@ -491,6 +513,36 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView [Adjust disableThirdPartySharing]; }]; + [self.bridgeRegister registerHandler:@"adjust_trackThirdPartySharing" handler:^(id data, WVJBResponseCallback responseCallback) { + id isEnabledO = [data objectForKey:@"isEnabled"]; + id granularOptions = [data objectForKey:@"granularOptions"]; + + NSNumber *isEnabled = nil; + if ([isEnabledO isKindOfClass:[NSNumber class]]) { + isEnabled = (NSNumber *)isEnabledO; + } + + ADJThirdPartySharing *adjustThirdPartySharing = + [[ADJThirdPartySharing alloc] initWithIsEnabledNumberBool:isEnabled]; + + for (int i = 0; i < [granularOptions count]; i += 3) { + NSString *partnerName = [[granularOptions objectAtIndex:i] description]; + NSString *key = [[granularOptions objectAtIndex:(i + 1)] description]; + NSString *value = [[granularOptions objectAtIndex:(i + 2)] description]; + [adjustThirdPartySharing addGranularOption:partnerName key:key value:value]; + } + + [Adjust trackThirdPartySharing:adjustThirdPartySharing]; + }]; + + [self.bridgeRegister registerHandler:@"adjust_trackMeasurementConsent" handler:^(id data, WVJBResponseCallback responseCallback) { + if (![data isKindOfClass:[NSNumber class]]) { + return; + } + [Adjust trackMeasurementConsent:[(NSNumber *)data boolValue]]; + }]; + + [self.bridgeRegister registerHandler:@"adjust_setTestOptions" handler:^(id data, WVJBResponseCallback responseCallback) { NSString *baseUrl = [data objectForKey:@"baseUrl"]; NSString *gdprUrl = [data objectForKey:@"gdprUrl"]; @@ -503,6 +555,7 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView NSNumber *deleteState = [data objectForKey:@"deleteState"]; NSNumber *noBackoffWait = [data objectForKey:@"noBackoffWait"]; NSNumber *iAdFrameworkEnabled = [data objectForKey:@"iAdFrameworkEnabled"]; + NSNumber *adServicesFrameworkEnabled = [data objectForKey:@"adServicesFrameworkEnabled"]; AdjustTestOptions *testOptions = [[AdjustTestOptions alloc] init]; @@ -542,6 +595,9 @@ - (void)loadWKWebViewBridge:(WKWebView *)wkWebView if ([self isFieldValid:iAdFrameworkEnabled]) { testOptions.iAdFrameworkEnabled = [iAdFrameworkEnabled boolValue]; } + if ([self isFieldValid:adServicesFrameworkEnabled]) { + testOptions.adServicesFrameworkEnabled = [adServicesFrameworkEnabled boolValue]; + } [Adjust setTestOptions:testOptions]; }]; diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 8ec796adf..f5c6f97e9 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -145,6 +145,16 @@ + (NSString *)adjust_js { if (WebViewJavascriptBridge) { WebViewJavascriptBridge.callHandler('adjust_idfa', null, callback); } + }, + requestTrackingAuthorizationWithCompletionHandler: function(callback) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_requestTrackingAuthorizationWithCompletionHandler', null, callback); + } + }, + getAppTrackingAuthorizationStatus: function(callback) { + if (WebViewJavascriptBridge) { + WebViewJavascriptBridge.callHandler('adjust_appTrackingAuthorizationStatus', null, callback); + } }, getAdid: function(callback) { if (WebViewJavascriptBridge) { @@ -201,6 +211,16 @@ + (NSString *)adjust_js { WebViewJavascriptBridge.callHandler('adjust_disableThirdPartySharing', null, null); } }, + trackThirdPartySharing: function(adjustThirdPartySharing) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_trackThirdPartySharing', adjustThirdPartySharing, null); + } + }, + trackMeasurementConsent: function(consentMeasurement) { + if (WebViewJavascriptBridge != null) { + WebViewJavascriptBridge.callHandler('adjust_trackMeasurementConsent', consentMeasurement, null); + } + }, fbPixelEvent: function(pixelID, evtName, customData) { if (WebViewJavascriptBridge != null) { WebViewJavascriptBridge.callHandler('adjust_fbPixelEvent', @@ -221,7 +241,7 @@ + (NSString *)adjust_js { if (this.sdkPrefix) { return this.sdkPrefix; } else { - return 'web-bridge4.24.0'; + return 'web-bridge4.25.0'; } }, setTestOptions: function(testOptions) { @@ -261,6 +281,18 @@ + (NSString *)adjust_js { this.callbackId = callbackId; }; + // Adjust Third Party Sharing + window.AdjustThirdPartySharing = function(isEnabled) { + this.isEnabled = isEnabled; + this.granularOptions = []; + }; + + AdjustThirdPartySharing.prototype.addGranularOption = function(partnerName, key, value) { + this.granularOptions.push(partnerName); + this.granularOptions.push(key); + this.granularOptions.push(value); + }; + // Copied from adjust_config.js window.AdjustConfig = function(appToken, environment, legacy) { if (arguments.length === 2) { @@ -292,6 +324,7 @@ + (NSString *)adjust_js { this.isDeviceKnown = null; this.needsCost = null; this.allowiAdInfoReading = null; + this.allowAdServicesInfoReading = null; this.allowIdfaReading = null; this.secretId = null; this.info1 = null; @@ -377,6 +410,9 @@ + (NSString *)adjust_js { AdjustConfig.prototype.setAllowiAdInfoReading = function(allowiAdInfoReading) { this.allowiAdInfoReading = allowiAdInfoReading; }; + AdjustConfig.prototype.setAllowAdServicesInfoReading = function(allowAdServicesInfoReading) { + this.allowAdServicesInfoReading = allowAdServicesInfoReading; + }; AdjustConfig.prototype.setAllowIdfaReading = function(allowIdfaReading) { this.allowIdfaReading = allowIdfaReading; }; diff --git a/AdjustSdk/AdjustSdk.h b/AdjustSdk/AdjustSdk.h index 7004b4f6a..56daff456 100644 --- a/AdjustSdk/AdjustSdk.h +++ b/AdjustSdk/AdjustSdk.h @@ -18,6 +18,7 @@ FOUNDATION_EXPORT const unsigned char AdjustSdkVersionString[]; #import #import +#import #import #import #import diff --git a/AdjustSdkIm/AdjustSdkIm.h b/AdjustSdkIm/AdjustSdkIm.h index 38b59b571..f45a4da9b 100644 --- a/AdjustSdkIm/AdjustSdkIm.h +++ b/AdjustSdkIm/AdjustSdkIm.h @@ -18,6 +18,7 @@ FOUNDATION_EXPORT const unsigned char AdjustSdkImVersionString[]; #import #import +#import #import #import #import diff --git a/AdjustSdkTv/AdjustSdkTv.h b/AdjustSdkTv/AdjustSdkTv.h index 31947ac54..9a66f0edc 100644 --- a/AdjustSdkTv/AdjustSdkTv.h +++ b/AdjustSdkTv/AdjustSdkTv.h @@ -18,6 +18,7 @@ FOUNDATION_EXPORT const unsigned char AdjustSdkTvVersionString[]; #import #import +#import #import #import #import diff --git a/AdjustSdkWebBridge/AdjustSdkWebBridge.h b/AdjustSdkWebBridge/AdjustSdkWebBridge.h index 123b03d18..6bca5b94d 100644 --- a/AdjustSdkWebBridge/AdjustSdkWebBridge.h +++ b/AdjustSdkWebBridge/AdjustSdkWebBridge.h @@ -19,6 +19,7 @@ FOUNDATION_EXPORT const unsigned char AdjustSdkWebBridgeVersionString[]; #import #import #import +#import #import #import #import diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj index d76ade4b3..9d235ba5d 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustTestApp/AdjustTestApp.xcodeproj/project.pbxproj @@ -61,6 +61,7 @@ 6F3A5EA12018CE3A000AACD0 /* ATLUtilNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E9B2018CE3A000AACD0 /* ATLUtilNetworking.m */; }; 6F3A5EA22018CE3A000AACD0 /* ATLTestLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E9C2018CE3A000AACD0 /* ATLTestLibrary.m */; }; 6F3A5EA32018CE3A000AACD0 /* ATLBlockingQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3A5E9D2018CE3A000AACD0 /* ATLBlockingQueue.m */; }; + 6F84510E25B1B1110004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84510C25B1B1100004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE92024E421B200FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE91F24E421B200FEF3F1 /* ADJUrlStrategy.m */; }; 6FFCFE5F2007978300467F01 /* ATAAdjustCommandExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FFCFE5D2007978300467F01 /* ATAAdjustCommandExecutor.m */; }; 6FFCFE6D200797D100467F01 /* ATAAdjustDelegateAttribution.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FFCFE61200797D000467F01 /* ATAAdjustDelegateAttribution.m */; }; @@ -74,6 +75,7 @@ 9D1D8EA2219246EF0088E3CF /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D1D8EA1219246EF0088E3CF /* CoreTelephony.framework */; }; 9D2F24082447DDCB00B7CA90 /* ADJSubscription.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D2F24072447DDCA00B7CA90 /* ADJSubscription.m */; }; 9D75AFDB210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75AFDA210217FF0079A36C /* ATAAdjustDelegateDeferredDeeplink.m */; }; + 9DAA5C6A25B0F81200C718DD /* AdServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DAA5C6925B0F81100C718DD /* AdServices.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -188,6 +190,8 @@ 6F3A5E9B2018CE3A000AACD0 /* ATLUtilNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLUtilNetworking.m; sourceTree = ""; }; 6F3A5E9C2018CE3A000AACD0 /* ATLTestLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLTestLibrary.m; sourceTree = ""; }; 6F3A5E9D2018CE3A000AACD0 /* ATLBlockingQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATLBlockingQueue.m; sourceTree = ""; }; + 6F84510C25B1B1100004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 6F84510D25B1B1110004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; 6FBEE91E24E421B200FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FBEE91F24E421B200FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FFCFE5D2007978300467F01 /* ATAAdjustCommandExecutor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ATAAdjustCommandExecutor.m; sourceTree = ""; }; @@ -211,6 +215,7 @@ 9D2F24072447DDCA00B7CA90 /* ADJSubscription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSubscription.m; 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 = ""; }; + 9DAA5C6925B0F81100C718DD /* AdServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdServices.framework; path = System/Library/Frameworks/AdServices.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -219,6 +224,7 @@ buildActionMask = 2147483647; files = ( 9D1D8E9E219246E50088E3CF /* iAd.framework in Frameworks */, + 9DAA5C6A25B0F81200C718DD /* AdServices.framework in Frameworks */, 9D1D8EA0219246EA0088E3CF /* AdSupport.framework in Frameworks */, 9D1D8EA2219246EF0088E3CF /* CoreTelephony.framework in Frameworks */, ); @@ -334,6 +340,8 @@ 9D2F24072447DDCA00B7CA90 /* ADJSubscription.m */, 6FBEE91E24E421B200FEF3F1 /* ADJUrlStrategy.h */, 6FBEE91F24E421B200FEF3F1 /* ADJUrlStrategy.m */, + 6F84510D25B1B1110004C7C0 /* ADJThirdPartySharing.h */, + 6F84510C25B1B1100004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -418,6 +426,7 @@ 9D1D8E9C219246E50088E3CF /* Frameworks */ = { isa = PBXGroup; children = ( + 9DAA5C6925B0F81100C718DD /* AdServices.framework */, 9D1D8EA1219246EF0088E3CF /* CoreTelephony.framework */, 9D1D8E9F219246EA0088E3CF /* AdSupport.framework */, 9D1D8E9D219246E50088E3CF /* iAd.framework */, @@ -523,6 +532,7 @@ 524BACA6221C4EE800624F6C /* PSWebSocketServer.m in Sources */, 6F3A5E742018CE14000AACD0 /* ADJEvent.m in Sources */, 524BACA5221C4EE800624F6C /* PSWebSocket.m in Sources */, + 6F84510E25B1B1110004C7C0 /* ADJThirdPartySharing.m in Sources */, 6F3A5E822018CE14000AACD0 /* NSString+ADJAdditions.m in Sources */, 6F3A5E752018CE14000AACD0 /* ADJSessionSuccess.m in Sources */, 6FFCFE70200797D100467F01 /* ATAAdjustDelegate.m in Sources */, diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m b/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m index 59669ab87..94584236f 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ATAAdjustCommandExecutor.m @@ -91,6 +91,10 @@ - (void)executeCommand:(NSString *)className [self trackAdRevenue:parameters]; } else if ([methodName isEqualToString:@"disableThirdPartySharing"]) { [self disableThirdPartySharing:parameters]; + } else if ([methodName isEqualToString:@"thirdPartySharing"]) { + [self thirdPartySharing:parameters]; + } else if ([methodName isEqualToString:@"measurementConsent"]) { + [self measurementConsent:parameters]; } else if ([methodName isEqualToString:@"trackSubscription"]) { [self trackSubscription:parameters]; } @@ -135,6 +139,13 @@ - (void)testOptions:(NSDictionary *)parameters { testOptions.iAdFrameworkEnabled = YES; } } + testOptions.adServicesFrameworkEnabled = NO; // default value -> NO - AdServices will not be used in test app by default + if ([parameters objectForKey:@"adServicesFrameworkEnabled"]) { + NSString *adServicesFrameworkEnabledStr = [parameters objectForKey:@"adServicesFrameworkEnabled"][0]; + if ([adServicesFrameworkEnabledStr isEqualToString:@"true"]) { + testOptions.adServicesFrameworkEnabled = YES; + } + } if ([parameters objectForKey:@"enableSigning"]) { NSString *enableSigningStr = [parameters objectForKey:@"enableSigning"][0]; testOptions.enableSigning = NO; @@ -301,6 +312,11 @@ - (void)config:(NSDictionary *)parameters { [adjustConfig setAllowiAdInfoReading:[allowiAdInfoReadingS boolValue]]; } + if ([parameters objectForKey:@"allowAdServicesInfoReading"]) { + NSString *allowAdServicesInfoReadingS = [parameters objectForKey:@"allowAdServicesInfoReading"][0]; + [adjustConfig setAllowAdServicesInfoReading:[allowAdServicesInfoReadingS boolValue]]; + } + if ([parameters objectForKey:@"userAgent"]) { NSString *userAgent = [parameters objectForKey:@"userAgent"][0]; [adjustConfig setUserAgent:userAgent]; @@ -550,6 +566,38 @@ - (void)disableThirdPartySharing:(NSDictionary *)parameters { [Adjust disableThirdPartySharing]; } +- (void)thirdPartySharing:(NSDictionary *)parameters { + NSString *isEnabledS = [parameters objectForKey:@"isEnabled"][0]; + + NSNumber *isEnabled = nil; + if ([isEnabledS isEqualToString:@"true"]) { + isEnabled = [NSNumber numberWithBool:YES]; + } + if ([isEnabledS isEqualToString:@"false"]) { + isEnabled = [NSNumber numberWithBool:NO]; + } + + ADJThirdPartySharing *adjustThirdPartySharing = + [[ADJThirdPartySharing alloc] initWithIsEnabledNumberBool:isEnabled]; + + if ([parameters objectForKey:@"granularOptions"]) { + NSArray *granularOptions = [parameters objectForKey:@"granularOptions"]; + for (int i = 0; i < granularOptions.count; i = i + 3) { + NSString *partnerName = granularOptions[i]; + NSString *key = granularOptions[i + 1]; + NSString *value = granularOptions[i + 2]; + [adjustThirdPartySharing addGranularOption:partnerName key:key value:value]; + } + } + + [Adjust trackThirdPartySharing:adjustThirdPartySharing]; +} + +- (void)measurementConsent:(NSDictionary *)parameters { + NSString *isEnabledS = [parameters objectForKey:@"isEnabled"][0]; + [Adjust trackMeasurementConsent:[isEnabledS boolValue]]; +} + - (void)trackSubscription:(NSDictionary *)parameters { NSDecimalNumber *price; NSString *currency; diff --git a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.h b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.h index 8dcedac10..c1c06f9cc 100644 --- a/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.h +++ b/AdjustTests/AdjustTestApp/AdjustTestApp/ViewController.h @@ -8,10 +8,16 @@ #import +// simulator static NSString * baseUrl = @"http://127.0.0.1:8080"; static NSString * gdprUrl = @"http://127.0.0.1:8080"; static NSString * subscriptionUrl = @"http://127.0.0.1:8080"; static NSString * controlUrl = @"ws://127.0.0.1:1987"; +// device +// static NSString * baseUrl = @"http://192.168.86.37:8080"; +// static NSString * gdprUrl = @"http://192.168.86.37:8080"; +// static NSString * subscriptionUrl = @"http://192.168.86.37:8080"; +// static NSString * controlUrl = @"ws://192.168.86.37:1987"; @interface ViewController : UIViewController diff --git a/AdjustTests/AdjustUnitTests/ADJPackageFields.m b/AdjustTests/AdjustUnitTests/ADJPackageFields.m index 7ceeaaee2..8f0fa67d4 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.24.0"; + self.clientSdk = @"ios4.25.0"; self.suffix = @""; self.environment = @"sandbox"; diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj index 0ebc8f901..ccd3bbd99 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp.xcodeproj/project.pbxproj @@ -70,11 +70,13 @@ 6F7AF790211888B500F730B2 /* TestLibraryBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F7AF78F211888B500F730B2 /* TestLibraryBridge.m */; }; 6F7AF7B02118949C00F730B2 /* TestLibraryBridge.js in Resources */ = {isa = PBXBuildFile; fileRef = 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */; }; 6F7AF7BB2118992200F730B2 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F7AF7BA2118992200F730B2 /* WebKit.framework */; }; + 6F84513125B1B14E0004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84513025B1B14E0004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE92324E421C800FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE92224E421C800FEF3F1 /* ADJUrlStrategy.m */; }; 6FD0412C211C71D1008D42D0 /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD0412B211C71D1008D42D0 /* iAd.framework */; }; 6FD0412E211C71D9008D42D0 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD0412D211C71D9008D42D0 /* AdSupport.framework */; }; 6FD04130211C71E8008D42D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD0412F211C71E8008D42D0 /* Foundation.framework */; }; 6FD04132211C71EF008D42D0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FD04131211C71EE008D42D0 /* UIKit.framework */; }; + 9DAA5C6C25B0F81F00C718DD /* AdServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DAA5C6B25B0F81F00C718DD /* AdServices.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -203,12 +205,15 @@ 6F7AF78F211888B500F730B2 /* TestLibraryBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestLibraryBridge.m; sourceTree = ""; }; 6F7AF7AF2118949C00F730B2 /* TestLibraryBridge.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = TestLibraryBridge.js; sourceTree = ""; }; 6F7AF7BA2118992200F730B2 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 6F84512F25B1B14E0004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 6F84513025B1B14E0004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; 6FBEE92124E421C800FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FBEE92224E421C800FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FD0412B211C71D1008D42D0 /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; }; 6FD0412D211C71D9008D42D0 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; 6FD0412F211C71E8008D42D0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 6FD04131211C71EE008D42D0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 9DAA5C6B25B0F81F00C718DD /* AdServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdServices.framework; path = System/Library/Frameworks/AdServices.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -221,6 +226,7 @@ 6FD0412E211C71D9008D42D0 /* AdSupport.framework in Frameworks */, 6FD0412C211C71D1008D42D0 /* iAd.framework in Frameworks */, 6F7AF7BB2118992200F730B2 /* WebKit.framework in Frameworks */, + 9DAA5C6C25B0F81F00C718DD /* AdServices.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -409,6 +415,8 @@ 6F7AF73021187CFF00F730B2 /* ADJReachability.m */, 6FBEE92124E421C800FEF3F1 /* ADJUrlStrategy.h */, 6FBEE92224E421C800FEF3F1 /* ADJUrlStrategy.m */, + 6F84512F25B1B14E0004C7C0 /* ADJThirdPartySharing.h */, + 6F84513025B1B14E0004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -430,6 +438,7 @@ 6F7AF7B92118992200F730B2 /* Frameworks */ = { isa = PBXGroup; children = ( + 9DAA5C6B25B0F81F00C718DD /* AdServices.framework */, 6FD04131211C71EE008D42D0 /* UIKit.framework */, 6FD0412F211C71E8008D42D0 /* Foundation.framework */, 6FD0412D211C71D9008D42D0 /* AdSupport.framework */, @@ -527,6 +536,7 @@ 6F7AF74021187CFF00F730B2 /* ADJBackoffStrategy.m in Sources */, 6F6F75D92327C08B00F47E64 /* ATLBlockingQueue.m in Sources */, 6F7AF73421187CFF00F730B2 /* ADJRequestHandler.m in Sources */, + 6F84513125B1B14E0004C7C0 /* ADJThirdPartySharing.m in Sources */, 6F7AF73721187CFF00F730B2 /* ADJEvent.m in Sources */, 6F7AF74621187CFF00F730B2 /* NSData+ADJAdditions.m in Sources */, 6F6F75D82327C08B00F47E64 /* ATLTestLibrary.m in Sources */, diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h index 91120da56..50c579497 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.h @@ -10,9 +10,14 @@ #import "ATLTestLibrary.h" #import "AdjustBridgeRegister.h" +// simulator static NSString * baseUrl = @"http://127.0.0.1:8080"; static NSString * gdprUrl = @"http://127.0.0.1:8080"; static NSString * controlUrl = @"ws://127.0.0.1:1987"; +// device +// static NSString * baseUrl = @"http://192.168.86.37:8080"; +// static NSString * gdprUrl = @"http://192.168.86.37:8080"; +// static NSString * controlUrl = @"ws://192.168.86.37:1987"; @interface TestLibraryBridge : NSObject diff --git a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js index b713e92f2..d4de31602 100644 --- a/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js +++ b/AdjustTests/AdjustWebBridgeTestApp/AdjustWebBridgeTestApp/TestLibraryBridge.js @@ -1,5 +1,9 @@ +// simulator var localBaseUrl = 'http://127.0.0.1:8080'; var localGdprUrl = 'http://127.0.0.1:8080'; +// device +// var localBaseUrl = 'http://192.168.86.37:8080'; +// var localGdprUrl = 'http://192.168.86.37:8080'; // local reference of the command executor // originally it was this.adjustCommandExecutor of TestLibraryBridge var @@ -58,6 +62,7 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { this.deleteState = null; this.noBackoffWait = null; this.iAdFrameworkEnabled = null; + this.adServicesFrameworkEnabled = null; }; var testOptions = new TestOptions(); @@ -89,6 +94,12 @@ AdjustCommandExecutor.prototype.testOptions = function(params) { var iAdFrameworkEnabled = getFirstValue(params, 'iAdFrameworkEnabled'); testOptions.iAdFrameworkEnabled = iAdFrameworkEnabled == 'true'; } + // AdServices will not be used in test app by default + testOptions.adServicesFrameworkEnabled = false; + if ('adServicesFrameworkEnabled' in params) { + var adServicesFrameworkEnabled = getFirstValue(params, 'adServicesFrameworkEnabled'); + testOptions.adServicesFrameworkEnabled = adServicesFrameworkEnabled == 'true'; + } if ('teardown' in params) { console.log('TestLibraryBridge hasOwnProperty teardown: ' + params['teardown']); @@ -233,6 +244,12 @@ AdjustCommandExecutor.prototype.config = function(params) { adjustConfig.setAllowiAdInfoReading(allowiAdInfoReading); } + if ('allowAdServicesInfoReading' in params) { + var allowAdServicesInfoReadingS = getFirstValue(params, 'allowAdServicesInfoReading'); + var allowAdServicesInfoReading = allowAdServicesInfoReadingS == 'true'; + adjustConfig.setAllowAdServicesInfoReading(allowAdServicesInfoReading); + } + if ('allowIdfaReading' in params) { var allowIdfaReadingS = getFirstValue(params, 'allowIdfaReading'); var allowIdfaReading = allowIdfaReadingS == 'true'; @@ -544,6 +561,37 @@ AdjustCommandExecutor.prototype.disableThirdPartySharing = function(params) { Adjust.disableThirdPartySharing(); }; +AdjustCommandExecutor.prototype.thirdPartySharing = function(params) { + var isEnabledS = getFirstValue(params, 'isEnabled'); + + var isEnabled = null; + if (isEnabledS == 'true') { + isEnabled = true; + } + if (isEnabledS == 'false') { + isEnabled = false; + } + + var adjustThirdPartySharing = new AdjustThirdPartySharing(isEnabled); + + if ('granularOptions' in params) { + var granularOptions = getValues(params, 'granularOptions'); + for (var i = 0; i < granularOptions.length; i = i + 3) { + var partnerName = granularOptions[i]; + var key = granularOptions[i + 1]; + var value = granularOptions[i + 2]; + adjustThirdPartySharing.addGranularOption(partnerName, key, value); + } + } + + Adjust.trackThirdPartySharing(adjustThirdPartySharing); +}; + +AdjustCommandExecutor.prototype.measurementConsent = function(params) { + var consentMeasurement = getFirstValue(params, 'isEnabled') == 'true'; + Adjust.trackMeasurementConsent(consentMeasurement); +}; + // Util function getValues(params, key) { if (key in params) { diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ad6fb5b7..3c52d79ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +### Version 4.25.0 (16th January 2021) +#### Added +- Added support for Apple Search Ads attribution with usage of `AdServices.framework`. +- Added `appTrackingAuthorizationStatus` getter to `Adjust` instance to be able to get current app tracking status. +- Added improved measurement consent management and third party sharing system. + +--- + ### Version 4.24.0 (9th December 2020) #### Added - Added possibility to get cost data information in attribution callback. diff --git a/README.md b/README.md index f83e50fbf..c270f7834 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本 * [Additional features](#additional-features) * [AppTrackingTransparency framework](#att-framework) * [App-tracking authorisation wrapper](#ata-wrapper) + * [Get current authorisation status](#ata-getter) * [SKAdNetwork framework](#skadn-framework) * [Event tracking](#event-tracking) * [Revenue tracking](#revenue-tracking) @@ -78,13 +79,13 @@ We will describe the steps to integrate the Adjust SDK into your iOS project. We If you're using [CocoaPods][cocoapods], you can add the following line to your `Podfile` and continue from [this step](#sdk-integrate): ```ruby -pod 'Adjust', '~> 4.24.0' +pod 'Adjust', '~> 4.25.0' ``` or: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.24.0' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.25.0' ``` --- @@ -337,6 +338,17 @@ To use this wrapper, you can call it as such: }]; ``` +### Get current authorisation status + +To get the current app tracking authorization status you can call `[Adjust appTrackingAuthorizationStatus]` that will return one of the following possibilities: + +* `0`: The user hasn't been asked yet +* `1`: The user device is restricted +* `2`: The user denied access to IDFA +* `3`: The user authorized access to IDFA +* `-1`: The status is not available + + ### SKAdNetwork framework If you have implemented the Adjust iOS SDK v4.23.0 or above and your app is running on iOS 14, the communication with SKAdNetwork will be set on by default, although you can choose to turn it off. When set on, Adjust automatically registers for SKAdNetwork attribution when the SDK is initialized. If events are set up in the Adjust dashboard to receive conversion values, the Adjust backend sends the conversion value data to the SDK. The SDK then sets the conversion value. After Adjust receives the SKAdNetwork callback data, it is then displayed in the dashboard. diff --git a/VERSION b/VERSION index 252fdf2cb..4d9fbcf24 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.24.0 +4.25.0 diff --git a/doc/chinese/README.md b/doc/chinese/README.md index 64ab6048a..307cbdccd 100644 --- a/doc/chinese/README.md +++ b/doc/chinese/README.md @@ -76,13 +76,13 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本 如果您正在使用[CocoaPods][cocoapods],您可以将以下代码行添加至 `Podfile`,然后继续进行[此步骤](#sdk-integrate): ```ruby -pod 'Adjust', '~> 4.24.0' +pod 'Adjust', '~> 4.25.0' ``` 或: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.24.0' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.25.0' ``` --- diff --git a/doc/english/migrate.md b/doc/english/migrate.md index 173079b80..291526e29 100644 --- a/doc/english/migrate.md +++ b/doc/english/migrate.md @@ -1,4 +1,4 @@ -## Migrate your Adjust SDK for iOS to v4.24.0 from v3.4.0 +## Migrate your Adjust SDK for iOS to v4.25.0 from v3.4.0 ### Initial setup diff --git a/doc/english/web_views.md b/doc/english/web_views.md index e25679ba6..520d3ccab 100644 --- a/doc/english/web_views.md +++ b/doc/english/web_views.md @@ -64,7 +64,7 @@ We will describe the steps to integrate the Adjust SDK into your iOS project. We If you're using [CocoaPods][cocoapods], you can add the following line to your `Podfile` and continue from [this step](#sdk-integrate): ```ruby -pod 'Adjust/WebBridge', '~> 4.24.0' +pod 'Adjust/WebBridge', '~> 4.25.0' ``` --- diff --git a/doc/japanese/README.md b/doc/japanese/README.md index c9242521f..d87941a8d 100644 --- a/doc/japanese/README.md +++ b/doc/japanese/README.md @@ -25,13 +25,13 @@ adjust SDKをiOSプロジェクトに連携する手順を説明します。 [こちらの手順](#sdk-integrate)に進んでください。 ```ruby -pod 'Adjust', '~> 4.24.0' +pod 'Adjust', '~> 4.25.0' ``` または ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.24.0' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.25.0' ``` --- @@ -707,7 +707,7 @@ NSString *idfa = [Adjust idfa]; } ``` -#### プレインストールのトラッカー +#### プリインストールトラッカー すでにアプリをインストールしたことのあるユーザーをadjust SDKを使って識別したい場合は、次の手順で設定を行ってください。 @@ -773,7 +773,7 @@ iOS 8以前の端末でのディープリンキングはカスタムURLスキー これで、iOS 8以前の端末へのディープリンクの設定は完了です。 -##### iOS 9以前でのディープリンキング +##### iOS 9以降でのディープリンキング iOS 9以降の端末へディープリンクを対応させるためには、Appleのユニバーサルリンクを有効化させる必要があります。 ユニバーサルリンクについて、それらの設定については[こちら][universal-links]をご確認ください。 diff --git a/doc/korean/README.md b/doc/korean/README.md index f22f2ee0a..04e94a0d1 100644 --- a/doc/korean/README.md +++ b/doc/korean/README.md @@ -76,13 +76,13 @@ iOS 개발용 Xcode를 사용한다는 가정하에 iOS 프로젝트에 Adjust S [CocoaPods][cocoapods]를 사용하는 경우, 다음 내용을 `Podfile`에 추가한 후 [해당 단계](#sdk-integrate)를 완료하세요. ```ruby -pod 'Adjust', '~> 4.24.0' +pod 'Adjust', '~> 4.25.0' ``` 또는: ```ruby -pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.24.0' +pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.25.0' ``` --- diff --git a/doc/korean/web_views.md b/doc/korean/web_views.md index 51b5673fe..2d8658ecc 100644 --- a/doc/korean/web_views.md +++ b/doc/korean/web_views.md @@ -64,7 +64,7 @@ iOS 개발용 Xcode를 사용한다는 가정하에 iOS 프로젝트에 Adjust S [CocoaPods][cocoapods]를 사용하는 경우, 다음 내용을 'Podfile'에 추가한 후 [해당 단계](#sdk-integrate)를 완료하세요. ```ruby -pod 'Adjust/WebBridge', '~> 4.24.0' +pod 'Adjust/WebBridge', '~> 4.25.0' ``` --- diff --git a/doc/migrate.md b/doc/migrate.md index 173079b80..291526e29 100644 --- a/doc/migrate.md +++ b/doc/migrate.md @@ -1,4 +1,4 @@ -## Migrate your Adjust SDK for iOS to v4.24.0 from v3.4.0 +## Migrate your Adjust SDK for iOS to v4.25.0 from v3.4.0 ### Initial setup diff --git a/examples/AdjustExample-FbPixel/AdjustExample-FbPixel.xcodeproj/project.pbxproj b/examples/AdjustExample-FbPixel/AdjustExample-FbPixel.xcodeproj/project.pbxproj index b56430f7b..843da3d04 100644 --- a/examples/AdjustExample-FbPixel/AdjustExample-FbPixel.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-FbPixel/AdjustExample-FbPixel.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6F84514F25B1B2090004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84514E25B1B2090004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE91D24E4219E00FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE91B24E4219D00FEF3F1 /* ADJUrlStrategy.m */; }; 9D0F16A62193F96F00F5140E /* AdjustBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0F16542193F96F00F5140E /* AdjustBridge.m */; }; 9D0F16A72193F96F00F5140E /* WebViewJavascriptBridgeBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D0F16572193F96F00F5140E /* WebViewJavascriptBridgeBase.m */; }; @@ -62,6 +63,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 6F84514D25B1B2090004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 6F84514E25B1B2090004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; 6FBEE91B24E4219D00FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ADJUrlStrategy.m; path = ../../../Adjust/ADJUrlStrategy.m; sourceTree = ""; }; 6FBEE91C24E4219E00FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ADJUrlStrategy.h; path = ../../../Adjust/ADJUrlStrategy.h; sourceTree = ""; }; 9D0F16542193F96F00F5140E /* AdjustBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge.m; sourceTree = ""; }; @@ -283,6 +286,8 @@ 9D2F241B2447DE5A00B7CA90 /* ADJSubscription.m */, 6FBEE91C24E4219E00FEF3F1 /* ADJUrlStrategy.h */, 6FBEE91B24E4219D00FEF3F1 /* ADJUrlStrategy.m */, + 6F84514D25B1B2090004C7C0 /* ADJThirdPartySharing.h */, + 6F84514E25B1B2090004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../../Adjust; @@ -428,6 +433,7 @@ 9D0F16B12193F96F00F5140E /* ADJSdkClickHandler.m in Sources */, 6FBEE91D24E4219E00FEF3F1 /* ADJUrlStrategy.m in Sources */, 9D0F16C72193F96F00F5140E /* ADJAdjustFactory.m in Sources */, + 6F84514F25B1B2090004C7C0 /* ADJThirdPartySharing.m in Sources */, 9D0F16C42193F96F00F5140E /* ADJSystemProfile.m in Sources */, 9D0F16C32193F96F00F5140E /* ADJAttribution.m in Sources */, 9D0F16A62193F96F00F5140E /* AdjustBridge.m in Sources */, diff --git a/examples/AdjustExample-ObjC/AdjustExample-ObjC.xcodeproj/project.pbxproj b/examples/AdjustExample-ObjC/AdjustExample-ObjC.xcodeproj/project.pbxproj index f8d7387de..a2d19770e 100644 --- a/examples/AdjustExample-ObjC/AdjustExample-ObjC.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-ObjC/AdjustExample-ObjC.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6F84513525B1B1850004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84513425B1B1840004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE90B24E420FA00FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE90924E420FA00FEF3F1 /* ADJUrlStrategy.m */; }; 6FCC850C1F2794AB00D6A0ED /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FCC850A1F2794A300D6A0ED /* ADJReachability.m */; }; 963909411BCBFCF300A2E8A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 963909401BCBFCF300A2E8A4 /* main.m */; }; @@ -48,6 +49,7 @@ 9D449E2F1E6ED88F00E7E80B /* ADJSdkClickHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449E0B1E6ED88F00E7E80B /* ADJSdkClickHandler.m */; }; 9D449E301E6ED88F00E7E80B /* ADJKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449E0D1E6ED88F00E7E80B /* ADJKeychain.m */; }; 9D449E311E6ED88F00E7E80B /* ADJSessionParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D449E0F1E6ED88F00E7E80B /* ADJSessionParameters.m */; }; + 9DAA5C6725AFA4B600C718DD /* AdServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DAA5C6625AFA4B600C718DD /* AdServices.framework */; }; 9DC95F261C104CEF00138E4B /* ViewControllerObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DC95F251C104CEF00138E4B /* ViewControllerObjC.m */; }; 9DC95F2A1C10515300138E4B /* Constants.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DC95F291C10515300138E4B /* Constants.m */; }; 9DD0E9BE1F457EF800B2A759 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD0E9BD1F457EF800B2A759 /* ADJUserDefaults.m */; }; @@ -55,6 +57,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 6F84513325B1B1840004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 6F84513425B1B1840004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; 6FBEE90924E420FA00FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FBEE90A24E420FA00FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FCC850A1F2794A300D6A0ED /* ADJReachability.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; @@ -134,6 +138,7 @@ 9D449E0D1E6ED88F00E7E80B /* ADJKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJKeychain.m; sourceTree = ""; }; 9D449E0E1E6ED88F00E7E80B /* ADJSessionParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJSessionParameters.h; sourceTree = ""; }; 9D449E0F1E6ED88F00E7E80B /* ADJSessionParameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJSessionParameters.m; sourceTree = ""; }; + 9DAA5C6625AFA4B600C718DD /* AdServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/System/Library/Frameworks/AdServices.framework; sourceTree = DEVELOPER_DIR; }; 9DC95F241C104CEF00138E4B /* ViewControllerObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewControllerObjC.h; sourceTree = ""; }; 9DC95F251C104CEF00138E4B /* ViewControllerObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewControllerObjC.m; sourceTree = ""; }; 9DC95F281C10515300138E4B /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = ""; }; @@ -150,6 +155,7 @@ buildActionMask = 2147483647; files = ( D799022C24C093AA00C7D11C /* AppTrackingTransparency.framework in Frameworks */, + 9DAA5C6725AFA4B600C718DD /* AdServices.framework in Frameworks */, 9639095F1BCBFD3B00A2E8A4 /* iAd.framework in Frameworks */, 963909611BCBFD4200A2E8A4 /* AdSupport.framework in Frameworks */, ); @@ -285,6 +291,8 @@ 9D2F240A2447DDE100B7CA90 /* ADJSubscription.m */, 6FBEE90A24E420FA00FEF3F1 /* ADJUrlStrategy.h */, 6FBEE90924E420FA00FEF3F1 /* ADJUrlStrategy.m */, + 6F84513325B1B1840004C7C0 /* ADJThirdPartySharing.h */, + 6F84513425B1B1840004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -303,6 +311,7 @@ D799022A24C093AA00C7D11C /* Frameworks */ = { isa = PBXGroup; children = ( + 9DAA5C6625AFA4B600C718DD /* AdServices.framework */, D799022B24C093AA00C7D11C /* AppTrackingTransparency.framework */, ); name = Frameworks; @@ -392,6 +401,7 @@ 9D449E241E6ED88F00E7E80B /* ADJAttribution.m in Sources */, 9DC95F2A1C10515300138E4B /* Constants.m in Sources */, 9D2F240B2447DDE100B7CA90 /* ADJSubscription.m in Sources */, + 6F84513525B1B1850004C7C0 /* ADJThirdPartySharing.m in Sources */, 963909441BCBFCF300A2E8A4 /* AppDelegate.m in Sources */, 9D449E311E6ED88F00E7E80B /* ADJSessionParameters.m in Sources */, 9D449E171E6ED88F00E7E80B /* ADJActivityHandler.m in Sources */, diff --git a/examples/AdjustExample-ObjC/AdjustExample-ObjC/Info.plist b/examples/AdjustExample-ObjC/AdjustExample-ObjC/Info.plist index c90a93cf6..b702e0a95 100644 --- a/examples/AdjustExample-ObjC/AdjustExample-ObjC/Info.plist +++ b/examples/AdjustExample-ObjC/AdjustExample-ObjC/Info.plist @@ -2,6 +2,8 @@ + NSUserTrackingUsageDescription + We need your permission to retrieve IDFA. CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj b/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj index 7610e048e..9053b5e5f 100644 --- a/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6F84513925B1B19E0004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84513725B1B19E0004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE90E24E4212600FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE90D24E4212600FEF3F1 /* ADJUrlStrategy.m */; }; 6FCC850F1F2794C600D6A0ED /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FCC850E1F2794BE00D6A0ED /* ADJReachability.m */; }; 9D2F240E2447DDF600B7CA90 /* ADJSubscription.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D2F240C2447DDF600B7CA90 /* ADJSubscription.m */; }; @@ -51,9 +52,12 @@ 9DFB04C41D745B28006D48FC /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DFB04C31D745B28006D48FC /* AdSupport.framework */; }; D71BFB7024CAD74A00878F3E /* AppTrackingTransparency.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D71BFB6F24CAD74A00878F3E /* AppTrackingTransparency.framework */; }; D731B41524DAAB5C0036F619 /* LoadProductController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D731B41424DAAB5C0036F619 /* LoadProductController.swift */; }; + D758F83A2567BD3700F885BD /* AdServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D758F8392567BD3700F885BD /* AdServices.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 6F84513725B1B19E0004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 6F84513825B1B19E0004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; 6FBEE90C24E4212500FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FBEE90D24E4212600FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FCC850D1F2794BE00D6A0ED /* ADJReachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; @@ -137,6 +141,7 @@ 9DFB04C31D745B28006D48FC /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; D71BFB6F24CAD74A00878F3E /* AppTrackingTransparency.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppTrackingTransparency.framework; path = System/Library/Frameworks/AppTrackingTransparency.framework; sourceTree = SDKROOT; }; D731B41424DAAB5C0036F619 /* LoadProductController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadProductController.swift; sourceTree = ""; }; + D758F8392567BD3700F885BD /* AdServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdServices.framework; path = System/Library/Frameworks/AdServices.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -145,6 +150,7 @@ buildActionMask = 2147483647; files = ( D71BFB7024CAD74A00878F3E /* AppTrackingTransparency.framework in Frameworks */, + D758F83A2567BD3700F885BD /* AdServices.framework in Frameworks */, 9DFB04C21D745B22006D48FC /* iAd.framework in Frameworks */, 9DFB04C41D745B28006D48FC /* AdSupport.framework in Frameworks */, ); @@ -221,6 +227,8 @@ 9D2F240C2447DDF600B7CA90 /* ADJSubscription.m */, 6FBEE90C24E4212500FEF3F1 /* ADJUrlStrategy.h */, 6FBEE90D24E4212600FEF3F1 /* ADJUrlStrategy.m */, + 6F84513825B1B19E0004C7C0 /* ADJThirdPartySharing.h */, + 6F84513725B1B19E0004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -286,6 +294,7 @@ D71BFB6E24CAD74A00878F3E /* Frameworks */ = { isa = PBXGroup; children = ( + D758F8392567BD3700F885BD /* AdServices.framework */, D71BFB6F24CAD74A00878F3E /* AppTrackingTransparency.framework */, ); name = Frameworks; @@ -408,6 +417,7 @@ 9DF7A9C61CB4ECA600D3591F /* AppDelegate.swift in Sources */, 9D449E931E6EDC3D00E7E80B /* ADJTimerOnce.m in Sources */, 9D449E801E6EDC3D00E7E80B /* ADJBackoffStrategy.m in Sources */, + 6F84513925B1B19E0004C7C0 /* ADJThirdPartySharing.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/xcshareddata/xcschemes/AdjustExample-Swift.xcscheme b/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/xcshareddata/xcschemes/AdjustExample-Swift.xcscheme new file mode 100644 index 000000000..42c6d86f4 --- /dev/null +++ b/examples/AdjustExample-Swift/AdjustExample-Swift.xcodeproj/xcshareddata/xcschemes/AdjustExample-Swift.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView.xcodeproj/project.pbxproj b/examples/AdjustExample-WebView/AdjustExample-WebView.xcodeproj/project.pbxproj index d819ccab8..126c73896 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 */ + 6F84513D25B1B1B40004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84513B25B1B1B40004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE91124E4213900FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE91024E4213800FEF3F1 /* ADJUrlStrategy.m */; }; 6FCC85121F2794D900D6A0ED /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FCC85111F2794D600D6A0ED /* ADJReachability.m */; }; 968595F11D0B2E630011CA2B /* AdjustBridgeRegister.m in Sources */ = {isa = PBXBuildFile; fileRef = 968595F01D0B2E630011CA2B /* AdjustBridgeRegister.m */; }; @@ -59,9 +60,12 @@ 9D75F19A1D07463800E5D222 /* AdjustBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D75F1911D07463800E5D222 /* AdjustBridge.m */; }; 9D9A99DA1D0B699A0022FFCE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D9A99D91D0B699A0022FFCE /* AppDelegate.m */; }; 9DD0E9C41F4587C600B2A759 /* ADJUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD0E9C31F4587C600B2A759 /* ADJUserDefaults.m */; }; + D79970FA25B05A66008A17E1 /* AppTrackingTransparency.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D79970F925B05A66008A17E1 /* AppTrackingTransparency.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 6F84513B25B1B1B40004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 6F84513C25B1B1B40004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; 6FBEE90F24E4213800FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FBEE91024E4213800FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FCC85101F2794D600D6A0ED /* ADJReachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; @@ -160,6 +164,7 @@ 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 = ""; }; 9DD0E9C31F4587C600B2A759 /* ADJUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUserDefaults.m; sourceTree = ""; }; + D79970F925B05A66008A17E1 /* AppTrackingTransparency.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppTrackingTransparency.framework; path = System/Library/Frameworks/AppTrackingTransparency.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -172,6 +177,7 @@ 9D1082C81CFDAFF30050568B /* WebKit.framework in Frameworks */, 9D1082CC1CFDAFFB0050568B /* AdSupport.framework in Frameworks */, 9D1083431CFDE29A0050568B /* Foundation.framework in Frameworks */, + D79970FA25B05A66008A17E1 /* AppTrackingTransparency.framework in Frameworks */, 9D10833A1CFDBD9F0050568B /* CoreGraphics.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -184,6 +190,7 @@ children = ( 9D1082A61CFDAF8E0050568B /* AdjustExample-WebView */, 9D1082A51CFDAF8E0050568B /* Products */, + D79970F825B05A66008A17E1 /* Frameworks */, ); sourceTree = ""; }; @@ -303,6 +310,8 @@ 9D2F24102447DE0A00B7CA90 /* ADJSubscription.m */, 6FBEE90F24E4213800FEF3F1 /* ADJUrlStrategy.h */, 6FBEE91024E4213800FEF3F1 /* ADJUrlStrategy.m */, + 6F84513C25B1B1B40004C7C0 /* ADJThirdPartySharing.h */, + 6F84513B25B1B1B40004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -349,6 +358,14 @@ path = ../../../AdjustBridge; sourceTree = ""; }; + D79970F825B05A66008A17E1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D79970F925B05A66008A17E1 /* AppTrackingTransparency.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -435,6 +452,7 @@ 9D449EF51E6EDD4100E7E80B /* ADJSystemProfile.m in Sources */, 9D449EE01E6EDD4100E7E80B /* UIDevice+ADJAdditions.m in Sources */, 9D449EEA1E6EDD4100E7E80B /* ADJEventSuccess.m in Sources */, + 6F84513D25B1B1B40004C7C0 /* ADJThirdPartySharing.m in Sources */, 9DD0E9C41F4587C600B2A759 /* ADJUserDefaults.m in Sources */, 6FCC85121F2794D900D6A0ED /* ADJReachability.m in Sources */, 9D75F1991D07463800E5D222 /* WKWebViewJavascriptBridge.m in Sources */, diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html b/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html index e574eb5fb..16b25301c 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/AdjustExample-WebView.html @@ -138,7 +138,7 @@

Adjust Web View Demo

alert('Is SDK enabled? ' + isEnabled) }) } - + var btnGetIdfa = document.getElementById('btnGetIdfa') btnGetIdfa.onclick = function(e) { e.preventDefault() @@ -146,6 +146,15 @@

Adjust Web View Demo

alert('IDFA\n' + idfa) }) } + + var btnAskTrackingPermission = document.getElementById('btnAskTrackingPermission') + btnAskTrackingPermission.onclick = function(e) { + e.preventDefault() + Adjust.requestTrackingAuthorization(function(status) { + alert('Tracking permission status\n' + status) + }) + } + })
@@ -179,5 +188,8 @@

Adjust Web View Demo

+
+ +
diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist b/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist index 808e18c1f..66b8fc638 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/Info.plist @@ -2,6 +2,8 @@ + NSUserTrackingUsageDescription + We need your permission to retrieve IDFA CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.h b/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.h index 5ac43082b..5f025a877 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.h +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.h @@ -11,7 +11,7 @@ #import "AdjustBridge.h" -@interface WKWebViewController : UINavigationController +@interface WKWebViewController : UINavigationController @property AdjustBridge *adjustBridge; diff --git a/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.m b/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.m index 7dc840bbb..e01cdca9b 100644 --- a/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.m +++ b/examples/AdjustExample-WebView/AdjustExample-WebView/WKWebViewController.m @@ -29,6 +29,7 @@ - (void)didReceiveMemoryWarning { - (void)loadWKWebView { WKWebView *webView = [[NSClassFromString(@"WKWebView") alloc] initWithFrame:self.view.bounds]; webView.navigationDelegate = self; + webView.UIDelegate = self; [self.view addSubview:webView]; _adjustBridge = [[AdjustBridge alloc] init]; @@ -44,4 +45,16 @@ - (void)callWkHandler:(id)sender { } +- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message + message:nil + preferredStyle:UIAlertControllerStyleAlert]; + [alertController addAction:[UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleCancel + handler:^(UIAlertAction *action) { + completionHandler(); + }]]; + [self presentViewController:alertController animated:YES completion:^{}]; +} + @end diff --git a/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.pbxproj b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.pbxproj index f78957a65..0f3c90bb0 100644 --- a/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-iMessage/AdjustExample-iMessage.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6F84514A25B1B1F40004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84514825B1B1F40004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE91A24E4218C00FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE91824E4218B00FEF3F1 /* ADJUrlStrategy.m */; }; 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, ); }; }; @@ -75,6 +76,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 6F84514825B1B1F40004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 6F84514925B1B1F40004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; 6FBEE91824E4218B00FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FBEE91924E4218B00FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 9D01676520FF81280029CFFF /* AdjustExample-iMessage.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AdjustExample-iMessage.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -286,6 +289,8 @@ 9D2F24192447DE4700B7CA90 /* ADJSubscription.m */, 6FBEE91924E4218B00FEF3F1 /* ADJUrlStrategy.h */, 6FBEE91824E4218B00FEF3F1 /* ADJUrlStrategy.m */, + 6F84514925B1B1F40004C7C0 /* ADJThirdPartySharing.h */, + 6F84514825B1B1F40004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -420,6 +425,7 @@ 9D01685A20FF88F60029CFFF /* ADJKeychain.m in Sources */, 6FBEE91A24E4218C00FEF3F1 /* ADJUrlStrategy.m in Sources */, 9D01686A20FF88F60029CFFF /* NSString+ADJAdditions.m in Sources */, + 6F84514A25B1B1F40004C7C0 /* ADJThirdPartySharing.m in Sources */, 9D01687120FF88F60029CFFF /* ADJAdjustFactory.m in Sources */, 9D01687220FF88F60029CFFF /* ADJResponseData.m in Sources */, 9D01686020FF88F60029CFFF /* ADJActivityState.m in Sources */, diff --git a/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj b/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj index a48b6374e..9368c59dc 100644 --- a/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-iWatch/AdjustExample-iWatch.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6F84514425B1B1DB0004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84514325B1B1DB0004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE91724E4215E00FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE91624E4215E00FEF3F1 /* ADJUrlStrategy.m */; }; 6FCC85181F27950000D6A0ED /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FCC85171F2794F800D6A0ED /* ADJReachability.m */; }; 9D2F24172447DE3400B7CA90 /* ADJSubscription.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D2F24152447DE3400B7CA90 /* ADJSubscription.m */; }; @@ -107,6 +108,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 6F84514225B1B1DB0004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; + 6F84514325B1B1DB0004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; 6FBEE91524E4215E00FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FBEE91624E4215E00FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FCC85161F2794F800D6A0ED /* ADJReachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ADJReachability.h; sourceTree = ""; }; @@ -300,6 +303,8 @@ 9D2F24152447DE3400B7CA90 /* ADJSubscription.m */, 6FBEE91524E4215E00FEF3F1 /* ADJUrlStrategy.h */, 6FBEE91624E4215E00FEF3F1 /* ADJUrlStrategy.m */, + 6F84514225B1B1DB0004C7C0 /* ADJThirdPartySharing.h */, + 6F84514325B1B1DB0004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -569,6 +574,7 @@ 9D449FBE1E6EE72000E7E80B /* ADJSystemProfile.m in Sources */, 9D449FAD1E6EE72000E7E80B /* ADJBackoffStrategy.m in Sources */, 9D449FBC1E6EE72000E7E80B /* ADJSessionParameters.m in Sources */, + 6F84514425B1B1DB0004C7C0 /* ADJThirdPartySharing.m in Sources */, 9D449FB61E6EE72000E7E80B /* ADJPackageBuilder.m in Sources */, 9D449FBD1E6EE72000E7E80B /* ADJSessionSuccess.m in Sources */, 6FBEE91724E4215E00FEF3F1 /* ADJUrlStrategy.m in Sources */, diff --git a/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj b/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj index a4adc8fc2..672423b8c 100644 --- a/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj +++ b/examples/AdjustExample-tvOS/AdjustExample-tvOS.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6F84514125B1B1C80004C7C0 /* ADJThirdPartySharing.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F84513F25B1B1C70004C7C0 /* ADJThirdPartySharing.m */; }; 6FBEE91424E4214800FEF3F1 /* ADJUrlStrategy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FBEE91324E4214800FEF3F1 /* ADJUrlStrategy.m */; }; 6FCC85151F2794EC00D6A0ED /* ADJReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FCC85131F2794E800D6A0ED /* ADJReachability.m */; }; 963909B71BCC0D8300A2E8A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 963909B61BCC0D8300A2E8A4 /* main.m */; }; @@ -65,6 +66,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 6F84513F25B1B1C70004C7C0 /* ADJThirdPartySharing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJThirdPartySharing.m; sourceTree = ""; }; + 6F84514025B1B1C80004C7C0 /* ADJThirdPartySharing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJThirdPartySharing.h; sourceTree = ""; }; 6FBEE91224E4214800FEF3F1 /* ADJUrlStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ADJUrlStrategy.h; sourceTree = ""; }; 6FBEE91324E4214800FEF3F1 /* ADJUrlStrategy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ADJUrlStrategy.m; sourceTree = ""; }; 6FCC85131F2794E800D6A0ED /* ADJReachability.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ADJReachability.m; sourceTree = ""; }; @@ -272,6 +275,8 @@ 9D2F24122447DE1E00B7CA90 /* ADJSubscription.m */, 6FBEE91224E4214800FEF3F1 /* ADJUrlStrategy.h */, 6FBEE91324E4214800FEF3F1 /* ADJUrlStrategy.m */, + 6F84514025B1B1C80004C7C0 /* ADJThirdPartySharing.h */, + 6F84513F25B1B1C70004C7C0 /* ADJThirdPartySharing.m */, ); name = Adjust; path = ../../../Adjust; @@ -382,6 +387,7 @@ 9D449F5B1E6EE6C500E7E80B /* ADJTimerCycle.m in Sources */, 9D449F471E6EE6C500E7E80B /* ADJAttribution.m in Sources */, 9D2F24142447DE1F00B7CA90 /* ADJSubscription.m in Sources */, + 6F84514125B1B1C80004C7C0 /* ADJThirdPartySharing.m in Sources */, 9D449F421E6EE6C500E7E80B /* ADJActivityState.m in Sources */, 9DC95F2F1C10596500138E4B /* Constants.m in Sources */, 963909BD1BCC0D8300A2E8A4 /* ViewControllertvOS.m in Sources */,