diff --git a/AppNexusSDK.podspec b/AppNexusSDK.podspec index becfd90c..335c30f1 100644 --- a/AppNexusSDK.podspec +++ b/AppNexusSDK.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "AppNexusSDK" - s.version = "8.10.2" + s.version = "8.11.0" s.platform = :ios, "12.0" s.summary = "AppNexus iOS Mobile Advertising SDK" @@ -10,7 +10,7 @@ Our mobile advertising SDK gives developers a fast and convenient way to monetiz DESC s.homepage = "https://github.com/appnexus/mobile-sdk-ios" - s.source = { :git => "https://github.com/appnexus/mobile-sdk-ios.git", :tag => "#{s.version}" } + s.source = { :git => "https://github.com/appnexus/mobile-sdk-ios.git", :branch => "master" } s.author = { "AppNexus Mobile Engineering" => "sdk@appnexus.com" } s.license = { :type => "Apache License, Version 2.0", :file => "LICENSE" } diff --git a/README.md b/README.md index 446b8c79..54311cbd 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,22 @@ Appnexus iOS SDK ===================== +> [!CAUTION] +> We no longer release source code updates of iOS SDK to Github. This is not a deprecation of our SDK, only an open-source deprecation as we are taking our Android and iOS Mobile SDKs private. +> Future updates starting from SDK v9.0 will be released only as compiled .xcframework binary file and will be available for apps to download and integrate through CocoaPods, Swift Package Manager, Carthage and Direct download. +> Please contact your account managers or submit a ticket via the Customer Support Portal: https://help.xandr.com/ if you have any questions. + See the documentation on our wiki here: https://docs.xandr.com/bundle/mobile-sdk/page/xandr-mobile-sdks.html -Get the latest release notes here: https://github.com/appnexus/mobile-sdk-ios/releases +Get the latest release notes here: https://docs.xandr.com/bundle/mobile-sdk/page/ios-sdk-release-notes.html -**To file an issue or request an enhancement please visit the AppNexus Customer Support Portal (https://help.xandr.com). **We do not accept GitHub issues.** ## Use Cocoapods? Easily include the AppNexus SDK in your Podfile: ``` -platform :ios, '10.0' +platform :ios, '12.0' target 'MyAmazingApp' do pod 'AppNexusSDK' diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 803a331e..01a1c081 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,3 +1,14 @@ +## 8.11.0 + +### Announcements: +This is the last minor release in SDK v8.x. +The next major release will be SDK v9.0 and as already announced we will no longer release source code updates of iOS and Android Mobile SDKs to Github. This is not a deprecation of our SDKs, only an open-source deprecation as we are taking our Android and iOS Mobile SDKs private. +There will be no breaking changes from v8.x to v9.0 but keep in mind any new functional changes going forward will be developed only in version v9.x. + +### New Feature ++ 6273926 Support for Digital Services Act (DSA) [https://docs.xandr.com/bundle/mobile-sdk/page/ios-sdk-release-notes.html] + + ## 8.10.2 ### Improvement/Bug Fixes diff --git a/sdk/AppNexusNativeMacOSSDK/AppNexusNativeMacOSSDK.h b/sdk/AppNexusNativeMacOSSDK/AppNexusNativeMacOSSDK.h index 798b68e6..cd21d6d4 100644 --- a/sdk/AppNexusNativeMacOSSDK/AppNexusNativeMacOSSDK.h +++ b/sdk/AppNexusNativeMacOSSDK/AppNexusNativeMacOSSDK.h @@ -55,3 +55,6 @@ FOUNDATION_EXPORT const unsigned char AppNexusNativeSDKVersionString[]; #import #import #import +#import +#import +#import diff --git a/sdk/AppNexusNativeSDK/AppNexusNativeSDK.h b/sdk/AppNexusNativeSDK/AppNexusNativeSDK.h index 3c0522e6..2c18b406 100644 --- a/sdk/AppNexusNativeSDK/AppNexusNativeSDK.h +++ b/sdk/AppNexusNativeSDK/AppNexusNativeSDK.h @@ -52,3 +52,6 @@ FOUNDATION_EXPORT const unsigned char AppNexusNativeSDKVersionString[]; #import #import +#import +#import +#import diff --git a/sdk/AppNexusNativeSDK/SDK-Info.plist b/sdk/AppNexusNativeSDK/SDK-Info.plist index 631ec7ff..b66fcbb2 100644 --- a/sdk/AppNexusNativeSDK/SDK-Info.plist +++ b/sdk/AppNexusNativeSDK/SDK-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 8.10.2 + 8.11.0 LSApplicationCategoryType CFBundleVersion diff --git a/sdk/AppNexusNativeStaticSDK/AppNexusNativeStaticSDK.h b/sdk/AppNexusNativeStaticSDK/AppNexusNativeStaticSDK.h index d79db2e6..c9152cbc 100644 --- a/sdk/AppNexusNativeStaticSDK/AppNexusNativeStaticSDK.h +++ b/sdk/AppNexusNativeStaticSDK/AppNexusNativeStaticSDK.h @@ -52,3 +52,6 @@ FOUNDATION_EXPORT const unsigned char AppNexusNativeStaticSDKVersionString[]; #import #import +#import +#import +#import diff --git a/sdk/AppNexusNativeStaticSDK/SDK-Info.plist b/sdk/AppNexusNativeStaticSDK/SDK-Info.plist index a5314edf..4c0f934b 100644 --- a/sdk/AppNexusNativeStaticSDK/SDK-Info.plist +++ b/sdk/AppNexusNativeStaticSDK/SDK-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 8.10.2 + 8.11.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) diff --git a/sdk/AppNexusSDK.xcodeproj/project.pbxproj b/sdk/AppNexusSDK.xcodeproj/project.pbxproj index 57bebc53..171e1269 100644 --- a/sdk/AppNexusSDK.xcodeproj/project.pbxproj +++ b/sdk/AppNexusSDK.xcodeproj/project.pbxproj @@ -536,6 +536,30 @@ 97EC51EF2229782B00B740DF /* ANVerificationScriptResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 97EC51EC2229782B00B740DF /* ANVerificationScriptResource.m */; }; 9EEE4E50214FD2100056C5DD /* ANCarrierObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EEE4E4E214FD2100056C5DD /* ANCarrierObserver.h */; }; 9EEE4E52214FD2100056C5DD /* ANCarrierObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EEE4E4F214FD2100056C5DD /* ANCarrierObserver.m */; }; + E2B6E6FF2B62569A0017B7A7 /* ANDSASettings.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E6FE2B62569A0017B7A7 /* ANDSASettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E7042B6257650017B7A7 /* ANDSASettings.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E7032B6257650017B7A7 /* ANDSASettings.m */; }; + E2B6E7052B6257650017B7A7 /* ANDSASettings.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E7032B6257650017B7A7 /* ANDSASettings.m */; }; + E2B6E7062B6257650017B7A7 /* ANDSASettings.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E7032B6257650017B7A7 /* ANDSASettings.m */; }; + E2B6E7072B6257650017B7A7 /* ANDSASettings.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E7032B6257650017B7A7 /* ANDSASettings.m */; }; + E2B6E70A2B625DE70017B7A7 /* ANDSASettings.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E6FE2B62569A0017B7A7 /* ANDSASettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E70B2B625DE80017B7A7 /* ANDSASettings.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E6FE2B62569A0017B7A7 /* ANDSASettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E70C2B625DE80017B7A7 /* ANDSASettings.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E6FE2B62569A0017B7A7 /* ANDSASettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E7182B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E7172B6266CD0017B7A7 /* ANDSAResponseInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E7192B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E7172B6266CD0017B7A7 /* ANDSAResponseInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E71A2B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E7172B6266CD0017B7A7 /* ANDSAResponseInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E71B2B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B6E7172B6266CD0017B7A7 /* ANDSAResponseInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B6E71D2B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E71C2B6267150017B7A7 /* ANDSAResponseInfo.m */; }; + E2B6E71E2B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E71C2B6267150017B7A7 /* ANDSAResponseInfo.m */; }; + E2B6E71F2B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E71C2B6267150017B7A7 /* ANDSAResponseInfo.m */; }; + E2B6E7202B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B6E71C2B6267150017B7A7 /* ANDSAResponseInfo.m */; }; + E2B906012B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B906002B6BA2980033EFDF /* ANDSATransparencyInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B906022B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B906002B6BA2980033EFDF /* ANDSATransparencyInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B906032B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B906002B6BA2980033EFDF /* ANDSATransparencyInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B906042B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E2B906002B6BA2980033EFDF /* ANDSATransparencyInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2B906062B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B906052B6BA52E0033EFDF /* ANDSATransparencyInfo.m */; }; + E2B906072B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B906052B6BA52E0033EFDF /* ANDSATransparencyInfo.m */; }; + E2B906082B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B906052B6BA52E0033EFDF /* ANDSATransparencyInfo.m */; }; + E2B906092B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E2B906052B6BA52E0033EFDF /* ANDSATransparencyInfo.m */; }; F52B044122AECD6B00985B62 /* NSObject+ANCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 608E477B1F8EAB84009BB148 /* NSObject+ANCategory.h */; }; F52B044222AECD6F00985B62 /* NSObject+ANCategory.m in Sources */ = {isa = PBXBuildFile; fileRef = 608E477C1F8EAB84009BB148 /* NSObject+ANCategory.m */; }; F52F82EB2293362600F4578C /* NSObject+ANCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 608E477B1F8EAB84009BB148 /* NSObject+ANCategory.h */; }; @@ -859,6 +883,12 @@ 97EC51EC2229782B00B740DF /* ANVerificationScriptResource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANVerificationScriptResource.m; sourceTree = ""; }; 9EEE4E4E214FD2100056C5DD /* ANCarrierObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANCarrierObserver.h; sourceTree = ""; }; 9EEE4E4F214FD2100056C5DD /* ANCarrierObserver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANCarrierObserver.m; sourceTree = ""; }; + E2B6E6FE2B62569A0017B7A7 /* ANDSASettings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANDSASettings.h; sourceTree = ""; }; + E2B6E7032B6257650017B7A7 /* ANDSASettings.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANDSASettings.m; sourceTree = ""; }; + E2B6E7172B6266CD0017B7A7 /* ANDSAResponseInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANDSAResponseInfo.h; sourceTree = ""; }; + E2B6E71C2B6267150017B7A7 /* ANDSAResponseInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANDSAResponseInfo.m; sourceTree = ""; }; + E2B906002B6BA2980033EFDF /* ANDSATransparencyInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANDSATransparencyInfo.h; sourceTree = ""; }; + E2B906052B6BA52E0033EFDF /* ANDSATransparencyInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANDSATransparencyInfo.m; sourceTree = ""; }; ECE4EA8D194B768A0069D934 /* ANAdProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdProtocol.h; sourceTree = ""; }; ECE4EA8E194B768A0069D934 /* ANAdView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdView.h; sourceTree = ""; }; ECE4EA8F194B768A0069D934 /* ANBannerAdView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANBannerAdView.h; sourceTree = ""; }; @@ -1099,6 +1129,9 @@ isa = PBXGroup; children = ( 8A02D6F91D6CE946006831A3 /* ANBaseUrlConfig.h */, + E2B6E7032B6257650017B7A7 /* ANDSASettings.m */, + E2B6E71C2B6267150017B7A7 /* ANDSAResponseInfo.m */, + E2B906052B6BA52E0033EFDF /* ANDSATransparencyInfo.m */, 0E35D4AC2088F67E000A6C27 /* ANGDPRSettings.m */, 00CDBF8F29241DE200B1FB47 /* ANGPPSettings.h */, 00CDBF9329241EA000B1FB47 /* ANGPPSettings.m */, @@ -1373,6 +1406,9 @@ ECE4EA8F194B768A0069D934 /* ANBannerAdView.h */, 0E3E3E61241FB73500823D66 /* ANCSRNativeAdResponse.h */, ECE4EA90194B768A0069D934 /* ANCustomAdapter.h */, + E2B6E6FE2B62569A0017B7A7 /* ANDSASettings.h */, + E2B6E7172B6266CD0017B7A7 /* ANDSAResponseInfo.h */, + E2B906002B6BA2980033EFDF /* ANDSATransparencyInfo.h */, 0E35D4A92088F652000A6C27 /* ANGDPRSettings.h */, 609732B31E42E7910061EC0A /* ANInstreamVideoAd.h */, ECE4EA91194B768A0069D934 /* ANInterstitialAd.h */, @@ -1449,6 +1485,7 @@ 469A974D2A7AE0E300D6CFFE /* ANRTBVideoAd.h in Headers */, 469A974E2A7AE0E300D6CFFE /* ANSDKSettings+PrivateMethods.h in Headers */, 469A974F2A7AE0E300D6CFFE /* ANSDKSettings.h in Headers */, + E2B906042B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */, 469A97502A7AE0E300D6CFFE /* ANSSMStandardAd.h in Headers */, 469A97512A7AE0E300D6CFFE /* ANSSMVideoAd.h in Headers */, 469A97522A7AE0E300D6CFFE /* ANStandardAd.h in Headers */, @@ -1466,6 +1503,8 @@ 469A975F2A7AE0E300D6CFFE /* NSTimer+ANCategory.h in Headers */, 469A97602A7AE0E300D6CFFE /* UIView+ANCategory.h in Headers */, 469A97612A7AE0E300D6CFFE /* UIView+ANNativeAdCategory.h in Headers */, + E2B6E71B2B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */, + E2B6E70C2B625DE80017B7A7 /* ANDSASettings.h in Headers */, 469A97622A7AE0E300D6CFFE /* XandrAd.h in Headers */, 469A97632A7AE0E300D6CFFE /* XandrImage.h in Headers */, 469A97642A7AE0E300D6CFFE /* XandrView.h in Headers */, @@ -1505,7 +1544,9 @@ 880508E628AE6B420099C6C6 /* ANNativeAdRequest.h in Headers */, 880508E628AE6B420099C6C6 /* ANNativeAdRequest.h in Headers */, 880508E728AE6B4E0099C6C6 /* ANNativeAdResponse+PrivateMethods.h in Headers */, + E2B6E70B2B625DE80017B7A7 /* ANDSASettings.h in Headers */, 880508E928AE6B550099C6C6 /* ANNativeAdResponse.h in Headers */, + E2B906032B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */, 8860675B28B031E700139573 /* ANNativeAdStarRating.h in Headers */, 8860675B28B031E700139573 /* ANNativeAdStarRating.h in Headers */, 880508FE28AE7A3B0099C6C6 /* ANNativeStandardAdResponse.h in Headers */, @@ -1524,6 +1565,7 @@ 880508F128AE74680099C6C6 /* ANUniversalTagAdServerResponse.h in Headers */, 880508EF28AE74640099C6C6 /* ANUniversalTagRequestBuilder.h in Headers */, 88463F2728AEA74F00C7C801 /* ANUserId.h in Headers */, + E2B6E71A2B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */, 8805090928AE80420099C6C6 /* ANUSPrivacySettings.h in Headers */, 88D30CD428BE9D070091C735 /* NSPointerArray+ANCategory.h in Headers */, 8805091F28AEA1A60099C6C6 /* NSString+ANCategory.h in Headers */, @@ -1560,6 +1602,7 @@ 8A9AEDB41A1BE8C200C58BDA /* ANBannerAdView.h in Headers */, FCC5DA612034AD3E003DC7B2 /* ANBaseAdObject.h in Headers */, 8A02D7001D6CE946006831A3 /* ANBaseUrlConfig.h in Headers */, + E2B6E6FF2B62569A0017B7A7 /* ANDSASettings.h in Headers */, 8A9AEDD21A1BF88200C58BDA /* ANBrowserViewController.h in Headers */, 9EEE4E50214FD2100056C5DD /* ANCarrierObserver.h in Headers */, 8A9AEDD31A1BF88200C58BDA /* ANClickOverlayView.h in Headers */, @@ -1603,6 +1646,7 @@ 8A9AEDBF1A1BE8CE00C58BDA /* ANNativeCustomAdapter.h in Headers */, 8A9AEDE51A1BF88300C58BDA /* ANNativeMediatedAdController.h in Headers */, 0E9F613620FFDCD7009AECD8 /* ANNativeMediatedAdResponse+PrivateMethods.h in Headers */, + E2B6E7182B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */, 8A9AEDC01A1BE8CE00C58BDA /* ANNativeMediatedAdResponse.h in Headers */, 8A598F8B1A1EA061009BA879 /* ANNativeStandardAdResponse.h in Headers */, 00D6B04820D1BC9B007A3439 /* ANOMIDImplementation.h in Headers */, @@ -1632,6 +1676,7 @@ 60183FD52293482700CFDE33 /* ANWebView.h in Headers */, 0ECF336622D79A62007DB185 /* AppNexusSDK.h in Headers */, 609732B01E42E73D0061EC0A /* NSDictionary+ANCategory.h in Headers */, + E2B906012B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */, F52B044122AECD6B00985B62 /* NSObject+ANCategory.h in Headers */, 601D2CA826DD97400019EAAC /* NSPointerArray+ANCategory.h in Headers */, 8A9AEDC71A1BF88200C58BDA /* NSString+ANCategory.h in Headers */, @@ -1695,6 +1740,7 @@ F5731B6D228C8E470012B134 /* ANSDKSettings+PrivateMethods.h in Headers */, F5731BC1228C9A240012B134 /* ANSDKSettings.h in Headers */, F5731B65228C8E1D0012B134 /* ANSSMStandardAd.h in Headers */, + E2B906022B6BA2980033EFDF /* ANDSATransparencyInfo.h in Headers */, F5731B67228C8E230012B134 /* ANSSMVideoAd.h in Headers */, F5731B69228C8E2A0012B134 /* ANStandardAd.h in Headers */, F5731B6F228C8F680012B134 /* ANTargetingParameters.h in Headers */, @@ -1712,6 +1758,8 @@ 0099B485228CA18C004E80AB /* NSTimer+ANCategory.h in Headers */, 0099B483228CA0EB004E80AB /* UIView+ANCategory.h in Headers */, F5731B4B228C8D050012B134 /* UIView+ANNativeAdCategory.h in Headers */, + E2B6E7192B6266CD0017B7A7 /* ANDSAResponseInfo.h in Headers */, + E2B6E70A2B625DE70017B7A7 /* ANDSASettings.h in Headers */, 005D57F12860E60200EFE90D /* XandrAd.h in Headers */, 88375FA928B96FF800690416 /* XandrImage.h in Headers */, 88375F8C28B96B3800690416 /* XandrView.h in Headers */, @@ -1954,12 +2002,14 @@ 469A97692A7AE0E300D6CFFE /* ANAdResponseCode.m in Sources */, 469A976A2A7AE0E300D6CFFE /* ANAdResponseInfo.m in Sources */, 469A976B2A7AE0E300D6CFFE /* ANBaseAdObject.m in Sources */, + E2B6E7072B6257650017B7A7 /* ANDSASettings.m in Sources */, 469A976C2A7AE0E300D6CFFE /* ANBrowserViewController.m in Sources */, 469A976D2A7AE0E300D6CFFE /* ANCarrierObserver.m in Sources */, 469A976E2A7AE0E300D6CFFE /* ANCSMVideoAd.m in Sources */, 469A976F2A7AE0E300D6CFFE /* ANCSRAd.m in Sources */, 469A97702A7AE0E300D6CFFE /* ANCSRNativeAdController.m in Sources */, 469A97712A7AE0E300D6CFFE /* ANCSRNativeAdResponse.m in Sources */, + E2B906092B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */, 469A97722A7AE0E300D6CFFE /* ANGDPRSettings.m in Sources */, 469A97732A7AE0E300D6CFFE /* ANGlobal.m in Sources */, 469A97742A7AE0E300D6CFFE /* ANGPPSettings.m in Sources */, @@ -1995,6 +2045,7 @@ 469A97922A7AE0E300D6CFFE /* ANUserId.m in Sources */, 469A97932A7AE0E300D6CFFE /* ANUSPrivacySettings.m in Sources */, 469A97942A7AE0E300D6CFFE /* ANVerificationScriptResource.m in Sources */, + E2B6E7202B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */, 469A97952A7AE0E300D6CFFE /* ANWebView.m in Sources */, 469A97962A7AE0E300D6CFFE /* NSObject+ANCategory.m in Sources */, 469A97972A7AE0E300D6CFFE /* NSPointerArray+ANCategory.m in Sources */, @@ -2016,6 +2067,7 @@ files = ( 880508ED28AE74200099C6C6 /* ANAdFetcherBase.m in Sources */, 880508CA28AC15050099C6C6 /* ANAdFetcherResponse.m in Sources */, + E2B6E7062B6257650017B7A7 /* ANDSASettings.m in Sources */, 880508CA28AC15050099C6C6 /* ANAdFetcherResponse.m in Sources */, 880508CC28AE55BD0099C6C6 /* ANAdResponseCode.m in Sources */, 880508CE28AE55D10099C6C6 /* ANAdResponseInfo.m in Sources */, @@ -2030,6 +2082,7 @@ 00CDBF9629241EA000B1FB47 /* ANGPPSettings.m in Sources */, 880508E028AE68880099C6C6 /* ANHTTPNetworkSession.m in Sources */, 880508E028AE68880099C6C6 /* ANHTTPNetworkSession.m in Sources */, + E2B6E71F2B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */, 8860675828AEF9B000139573 /* ANLocation.m in Sources */, 880508D328AE56070099C6C6 /* ANLogging.m in Sources */, 880508D328AE56070099C6C6 /* ANLogging.m in Sources */, @@ -2067,6 +2120,7 @@ 88463F2828AEA75300C7C801 /* ANUserId.m in Sources */, 88463F2828AEA75300C7C801 /* ANUserId.m in Sources */, 8805090A28AE80460099C6C6 /* ANUSPrivacySettings.m in Sources */, + E2B906082B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */, 880508B528AC14A80099C6C6 /* AppNexusNativeMacOSSDK.docc in Sources */, 88D30CD328BE9D040091C735 /* NSPointerArray+ANCategory.m in Sources */, 88D30CD328BE9D040091C735 /* NSPointerArray+ANCategory.m in Sources */, @@ -2113,6 +2167,7 @@ 00CDBF9429241EA000B1FB47 /* ANGPPSettings.m in Sources */, 60165D262464823E00E8E07C /* ANHTTPNetworkSession.m in Sources */, 609733061E42EAFF0061EC0A /* ANInstreamVideoAd.m in Sources */, + E2B6E7042B6257650017B7A7 /* ANDSASettings.m in Sources */, 8A9AEDF71A1BF99D00C58BDA /* ANInterstitialAd.m in Sources */, 8A9AEDF81A1BF99D00C58BDA /* ANInterstitialAdViewController.m in Sources */, 8A9AEDF91A1BF99D00C58BDA /* ANLocation.m in Sources */, @@ -2136,6 +2191,7 @@ 8A9AEE061A1BF99D00C58BDA /* ANNativeAdImageCache.m in Sources */, 8A9AEE071A1BF99D00C58BDA /* ANNativeAdRequest.m in Sources */, 8A9AEE0A1A1BF99D00C58BDA /* ANNativeAdResponse.m in Sources */, + E2B906062B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */, 8A9AEE0B1A1BF99D00C58BDA /* ANNativeAdStarRating.m in Sources */, 8A9AEE0D1A1BF99D00C58BDA /* ANNativeMediatedAdController.m in Sources */, 8A9AEE0E1A1BF99D00C58BDA /* ANNativeMediatedAdResponse.m in Sources */, @@ -2165,6 +2221,7 @@ 609732D91E42E9860061EC0A /* ANVideoAdProcessor.m in Sources */, 60D39E1722570FE20029F741 /* ANVideoPlayerSettings.m in Sources */, 60183FD622934AB500CFDE33 /* ANWebView.m in Sources */, + E2B6E71D2B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */, 609732B21E42E73D0061EC0A /* NSDictionary+ANCategory.m in Sources */, F52B044222AECD6F00985B62 /* NSObject+ANCategory.m in Sources */, 601D2CAA26DD97400019EAAC /* NSPointerArray+ANCategory.m in Sources */, @@ -2189,12 +2246,14 @@ 3850566E24DAD12F00D4B54D /* ANAdResponseCode.m in Sources */, 97065552232B93A200D484D4 /* ANAdResponseInfo.m in Sources */, F5731B5E228C8DFA0012B134 /* ANBaseAdObject.m in Sources */, + E2B6E7052B6257650017B7A7 /* ANDSASettings.m in Sources */, F5731B82228C94CC0012B134 /* ANBrowserViewController.m in Sources */, F5731B56228C8DD50012B134 /* ANCarrierObserver.m in Sources */, F5731B60228C8E050012B134 /* ANCSMVideoAd.m in Sources */, 0E0C5E5D2437E2EF0030B813 /* ANCSRAd.m in Sources */, 0E02F07224336D680073A226 /* ANCSRNativeAdController.m in Sources */, 0E02F07024336D570073A226 /* ANCSRNativeAdResponse.m in Sources */, + E2B906072B6BA52E0033EFDF /* ANDSATransparencyInfo.m in Sources */, F5731B6C228C8E430012B134 /* ANGDPRSettings.m in Sources */, F5731B71228C8FD20012B134 /* ANGlobal.m in Sources */, 00CDBF9529241EA000B1FB47 /* ANGPPSettings.m in Sources */, @@ -2230,6 +2289,7 @@ 0086BCA127DB01A800BBDE61 /* ANUserId.m in Sources */, 973B23AE238D1E4C00717D67 /* ANUSPrivacySettings.m in Sources */, F5731B4E228C8D170012B134 /* ANVerificationScriptResource.m in Sources */, + E2B6E71E2B6267150017B7A7 /* ANDSAResponseInfo.m in Sources */, 006F6BA12295FFD0003D2DF0 /* ANWebView.m in Sources */, F52F82EC2293362900F4578C /* NSObject+ANCategory.m in Sources */, 601D2CAB26DD97400019EAAC /* NSPointerArray+ANCategory.m in Sources */, @@ -2289,7 +2349,7 @@ "\"$(SRCROOT)/sourcefiles/Viewability/static_framework/OMSDK_Microsoft.xcframework/ios-arm64_armv7/\"", ); MACH_O_TYPE = staticlib; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ( @@ -2346,7 +2406,7 @@ "\"$(SRCROOT)/sourcefiles/Viewability/static_framework/OMSDK_Microsoft.xcframework/ios-arm64_armv7/\"", ); MACH_O_TYPE = staticlib; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ( @@ -2396,7 +2456,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Xandr.AppNexusNativeMacOSSDK; @@ -2443,7 +2503,7 @@ "@loader_path/Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Xandr.AppNexusNativeMacOSSDK; @@ -2489,7 +2549,7 @@ "@loader_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "corp.appnexus.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2531,7 +2591,7 @@ "@loader_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "corp.appnexus.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2594,10 +2654,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - GENERATE_MASTER_OBJECT_FILE = YES; IBC_FLATTEN_NIBS = NO; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACH_O_TYPE = staticlib; + MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -2650,10 +2709,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - GENERATE_MASTER_OBJECT_FILE = YES; IBC_FLATTEN_NIBS = NO; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACH_O_TYPE = staticlib; + MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; @@ -2701,7 +2759,7 @@ "@loader_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = corp.appnexus.AppNexusSDK; @@ -2752,7 +2810,7 @@ "@loader_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 8.10.2; + MARKETING_VERSION = 8.11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = corp.appnexus.AppNexusSDK; diff --git a/sdk/AppNexusSDK/AppNexusSDK.h b/sdk/AppNexusSDK/AppNexusSDK.h index 6bb3bf6d..c019ce6a 100644 --- a/sdk/AppNexusSDK/AppNexusSDK.h +++ b/sdk/AppNexusSDK/AppNexusSDK.h @@ -50,6 +50,6 @@ FOUNDATION_EXPORT const unsigned char AppNexusSDKVersionString[]; #import #import #import - - - +#import +#import +#import diff --git a/sdk/AppNexusSDK/SDK-Info.plist b/sdk/AppNexusSDK/SDK-Info.plist index 12df92ea..50c97ea7 100644 --- a/sdk/AppNexusSDK/SDK-Info.plist +++ b/sdk/AppNexusSDK/SDK-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 8.10.2 + 8.11.0 CFBundleSignature ???? CFBundleVersion diff --git a/sdk/sourcefiles/internal/ANAdResponseInfo.m b/sdk/sourcefiles/internal/ANAdResponseInfo.m index a0424f4e..84f2bf4a 100644 --- a/sdk/sourcefiles/internal/ANAdResponseInfo.m +++ b/sdk/sourcefiles/internal/ANAdResponseInfo.m @@ -17,6 +17,6 @@ @implementation ANAdResponseInfo -@synthesize creativeId, adType, memberId, placementId, contentSource, networkName; +@synthesize creativeId, adType, memberId, placementId, contentSource, networkName, dsaResponseInfo; @end diff --git a/sdk/sourcefiles/internal/ANGlobal.h b/sdk/sourcefiles/internal/ANGlobal.h index b9a3c927..0296e860 100644 --- a/sdk/sourcefiles/internal/ANGlobal.h +++ b/sdk/sourcefiles/internal/ANGlobal.h @@ -29,9 +29,9 @@ #if !APPNEXUS_NATIVE_MACOS_SDK - #define AN_SDK_VERSION @"8.10.2" + #define AN_SDK_VERSION @"8.11.0" #else - #define AN_SDK_VERSION @"8.10.2-mac" + #define AN_SDK_VERSION @"8.11.0-mac" #endif diff --git a/sdk/sourcefiles/internal/ANUniversalTagAdServerResponse.m b/sdk/sourcefiles/internal/ANUniversalTagAdServerResponse.m index 1998a8eb..3dce776f 100644 --- a/sdk/sourcefiles/internal/ANUniversalTagAdServerResponse.m +++ b/sdk/sourcefiles/internal/ANUniversalTagAdServerResponse.m @@ -28,6 +28,7 @@ #import "ANAdResponseInfo.h" #import "ANGlobal.h" #import "ANAdConstants.h" +#import "ANDSAResponseInfo.h" #if !APPNEXUS_NATIVE_MACOS_SDK #import "ANCSRAd.h" @@ -63,6 +64,9 @@ static NSString *const kANUniversalTagAdServerResponseKeyAdsCPMPublisherCurrency = @"cpm_publisher_currency"; static NSString *const kANUniversalTagAdServerResponseKeyAdsPublisherCurrencyCode = @"publisher_currency_code"; +// DSA +static NSString *const kANUniversalTagAdServerResponseKeyAdsDSA = @"dsa"; + static NSString *const kANUniversalTagAdServerResponseKeyAdsCSMObject = @"csm"; static NSString *const kANUniversalTagAdServerResponseKeyAdsSSMObject = @"ssm"; static NSString *const kANUniversalTagAdServerResponseKeyAdsRTBObject = @"rtb"; @@ -295,6 +299,8 @@ + (nullable ANStandardAd *)generateStandardAdUnitFromHTMLContent: (nonnull NSStr { auctionId = [NSString stringWithFormat:@"%@",tag[kANUniversalTagAdServerResponseKeyAdsAuctionId]]; } + + NSDictionary *dsaObject = adObject[kANUniversalTagAdServerResponseKeyAdsDSA]; //Initialise AdResponse object to expose all the public facing APIs from the UTv3 response ANAdResponseInfo *adResponseInfo = [[ANAdResponseInfo alloc] init]; @@ -307,6 +313,9 @@ + (nullable ANStandardAd *)generateStandardAdUnitFromHTMLContent: (nonnull NSStr adResponseInfo.cpm = cpm; adResponseInfo.cpmPublisherCurrency = cpmPublisherCurrency; adResponseInfo.publisherCurrencyCode = publisherCurrencyCode; + adResponseInfo.publisherCurrencyCode = publisherCurrencyCode; + adResponseInfo.dsaResponseInfo = [ANDSAResponseInfo dsaObjectFromAdObject: dsaObject]; + #if !APPNEXUS_NATIVE_MACOS_SDK ANVerificationScriptResource *omidVerificationScriptResource; if([adType isEqualToString:kANUniversalTagAdServerResponseKeyNativeObject]){ @@ -468,7 +477,6 @@ + (nullable ANStandardAd *)generateStandardAdUnitFromHTMLContent: (nonnull NSStr return [arrayOfAdUnits mutableCopy]; } - + (NSArray *)adsArrayFromTag:(NSDictionary *)tag { if ([tag[kANUniversalTagAdServerResponseKeyTagAds] isKindOfClass:[NSArray class]]) { return tag[kANUniversalTagAdServerResponseKeyTagAds]; diff --git a/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m b/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m index be21ad44..89b552ee 100644 --- a/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m +++ b/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m @@ -25,6 +25,8 @@ #import "ANAdProtocol.h" #import "ANAdConstants.h" #import "ANGPPSettings.h" +#import "ANDSASettings.h" +#import "ANDSATransparencyInfo.h" #if !APPNEXUS_NATIVE_MACOS_SDK #import "ANOMIDImplementation.h" @@ -312,6 +314,12 @@ - (NSDictionary *)requestBody requestDict[@"privacy"] = gppPrivacyObject; } + // add DSA Privacy + NSDictionary *dsaPrivacyObject = [self getDSAPrivacyObject]; + if (dsaPrivacyObject.allKeys.count > 0) { + requestDict[@"dsa"] = dsaPrivacyObject; + } + // add Facebook bidder token if available NSArray *tpuids = [self appendFBToken]; if(tpuids != nil){ @@ -993,6 +1001,41 @@ - (NSDictionary *)contentLanguage } } +- (NSDictionary *)getDSAPrivacyObject { + NSMutableDictionary *dsaPrivacyObject = [NSMutableDictionary dictionary]; + if ([ANDSASettings.sharedInstance dsaRequired] > -1) { + dsaPrivacyObject[@"dsarequired"] = @([ANDSASettings.sharedInstance dsaRequired]); + } + if ([ANDSASettings.sharedInstance pubRender] > -1) { + dsaPrivacyObject[@"pubrender"] = @([ANDSASettings.sharedInstance pubRender]); + } + if ([ANDSASettings.sharedInstance dataToPub] > -1) { + dsaPrivacyObject[@"datatopub"] = @([ANDSASettings.sharedInstance dataToPub]); + } + + NSArray *transparencyList = [ANDSASettings.sharedInstance transparencyList]; + if (transparencyList && transparencyList.count > 0) { + NSMutableArray *transparencyArray = [NSMutableArray array]; + for (ANDSATransparencyInfo *transparency in transparencyList) { + NSString *domain = [transparency domain]; + if (domain.length != 0) { + NSMutableDictionary *transparencyObject = [NSMutableDictionary dictionary]; + transparencyObject[@"domain"] = domain; + + NSArray *dsaparams = [transparency dsaparams]; + if (dsaparams) { + transparencyObject[@"dsaparams"] = dsaparams; + } + + [transparencyArray addObject:transparencyObject]; + } + } + dsaPrivacyObject[@"transparency"] = transparencyArray; + } + + return dsaPrivacyObject; +} + #pragma mark - Class methods. + (NSNumberFormatter *)precisionNumberFormatter diff --git a/sdk/sourcefiles/internal/config/ANDSAResponseInfo.m b/sdk/sourcefiles/internal/config/ANDSAResponseInfo.m new file mode 100644 index 00000000..f2231d00 --- /dev/null +++ b/sdk/sourcefiles/internal/config/ANDSAResponseInfo.m @@ -0,0 +1,69 @@ +/* Copyright 2024 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "ANDSAResponseInfo.h" +#import "ANDSATransparencyInfo.h" + +@implementation ANDSAResponseInfo + +/** + * Process the DSA response from ad object. + * + * @param dsaObject NSDictionary that contains info of DSA. + * @return ANDSAResponseInfo if no issue happened during processing. + */ ++ (instancetype)dsaObjectFromAdObject:(NSDictionary *)dsaObject { + if (!dsaObject || ![dsaObject isKindOfClass:[NSDictionary class]]) { + return nil; + } + + ANDSAResponseInfo *dsaResponseInfo = [[ANDSAResponseInfo alloc] init]; + + NSString *behalf = dsaObject[@"behalf"]; + if (behalf && [behalf isKindOfClass:[NSString class]]) { + dsaResponseInfo.behalf = behalf; + } + + NSString *paid = dsaObject[@"paid"]; + if (paid && [paid isKindOfClass:[NSString class]]) { + dsaResponseInfo.paid = paid; + } + + NSArray *transparencyArray = dsaObject[@"transparency"]; + if (transparencyArray && [transparencyArray isKindOfClass:[NSArray class]]) { + NSMutableArray *transparencyList = [NSMutableArray array]; + + for (NSDictionary *transparencyObject in transparencyArray) { + if ([transparencyObject isKindOfClass:[NSDictionary class]]) { + NSString *domain = transparencyObject[@"domain"]; + NSArray *dsaparams = transparencyObject[@"dsaparams"]; + + ANDSATransparencyInfo *transparencyInfo = [[ANDSATransparencyInfo alloc] initWithDomain:domain andDSAParams:dsaparams]; + [transparencyList addObject:transparencyInfo]; + } + } + + dsaResponseInfo.transparencyList = transparencyList; + } + + NSInteger adRender = [dsaObject[@"adrender"] intValue]; + if (adRender >= 0) { + dsaResponseInfo.adRender = adRender; + } + + return dsaResponseInfo; +} + +@end diff --git a/sdk/sourcefiles/internal/config/ANDSASettings.m b/sdk/sourcefiles/internal/config/ANDSASettings.m new file mode 100644 index 00000000..cf4871a8 --- /dev/null +++ b/sdk/sourcefiles/internal/config/ANDSASettings.m @@ -0,0 +1,32 @@ +/* Copyright 2024 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "ANDSASettings.h" + +@implementation ANDSASettings + ++ (instancetype)sharedInstance { + static dispatch_once_t onceToken; + static ANDSASettings *dsaSettingsInstance; + dispatch_once(&onceToken, ^{ + dsaSettingsInstance = [[ANDSASettings alloc] init]; + dsaSettingsInstance.dsaRequired = -1; + dsaSettingsInstance.pubRender = -1; + dsaSettingsInstance.dataToPub = -1; + }); + return dsaSettingsInstance; +} + +@end diff --git a/sdk/sourcefiles/internal/config/ANDSATransparencyInfo.m b/sdk/sourcefiles/internal/config/ANDSATransparencyInfo.m new file mode 100644 index 00000000..d031f205 --- /dev/null +++ b/sdk/sourcefiles/internal/config/ANDSATransparencyInfo.m @@ -0,0 +1,32 @@ +/* Copyright 2024 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "ANDSATransparencyInfo.h" + +@implementation ANDSATransparencyInfo + +/** + * Initializes an ANDSATransparencyInfo instance with the specified domain and DSA params. +*/ +- (instancetype)initWithDomain:(NSString *)domain andDSAParams:(NSArray *)dsaparams { + self = [super init]; + if (self) { + _domain = domain; + _dsaparams = dsaparams; + } + return self; +} + +@end diff --git a/sdk/sourcefiles/public-headers/ANAdResponseInfo.h b/sdk/sourcefiles/public-headers/ANAdResponseInfo.h index 23afbe6c..135745ea 100644 --- a/sdk/sourcefiles/public-headers/ANAdResponseInfo.h +++ b/sdk/sourcefiles/public-headers/ANAdResponseInfo.h @@ -15,6 +15,7 @@ #import #import "ANAdConstants.h" +#import "ANDSAResponseInfo.h" @interface ANAdResponseInfo : NSObject /** @@ -72,5 +73,10 @@ */ @property (nonatomic, readwrite, strong, nullable) NSString *publisherCurrencyCode; -@end +/** + Retrieves the Digital Services Act (DSA) information associated with this ad response + containing details such as behalf, paid, ad render, and transparency + */ +@property (nonatomic, readwrite, strong, nullable) ANDSAResponseInfo *dsaResponseInfo; +@end diff --git a/sdk/sourcefiles/public-headers/ANDSAResponseInfo.h b/sdk/sourcefiles/public-headers/ANDSAResponseInfo.h new file mode 100644 index 00000000..4d4ea5c7 --- /dev/null +++ b/sdk/sourcefiles/public-headers/ANDSAResponseInfo.h @@ -0,0 +1,66 @@ +/* Copyright 2024 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import +#import "ANDSATransparencyInfo.h" + +/** + Represents the response information for Digital Services Act (DSA) related data and transparency information. + This class includes fields for information such as on whose behalf the ad is displayed, who paid for the ad, + ad rendering information, and a list of transparency information. + + @code + NSString *behalf = adResponseInfo.dsaResponseInfo.behalf; + NSString *paid = adResponseInfo.dsaResponseInfo.paid; + for (ANDSATransparencyInfo *transparencyInfo in adResponseInfo.dsaResponseInfo.transparencyList) { + NSString *domain = transparencyInfo.domain; + NSArray *params = transparencyInfo.dsaparams; + } + NSInteger adRender = adResponseInfo.dsaResponseInfo.adRender; + @endcode + */ +@interface ANDSAResponseInfo : NSObject + +/** + * Retrieve on whose behalf the ad is displayed. + */ +@property (nonatomic, readwrite, strong, nullable) NSString *behalf; + +/** + * Retrieve who paid for the ad. + */ +@property (nonatomic, readwrite, strong, nullable) NSString *paid; + +/** + * Retrieve indicating if the buyer/advertiser will render DSA transparency info. + * 0 = buyer/advertiser will not render + * 1 = buyer/advertiser will render + */ +@property (nonatomic, readwrite, assign) NSInteger adRender; + +/** + * Retrieve the transparency user parameters info + */ +@property (nonatomic, strong, nullable) NSMutableArray *transparencyList; + +/** + * Process the DSA response from ad object. + * + * @param dsaObject NSDictionary that contains info of DSA. + * @return ANDSAResponseInfo if no issue happened during processing. + */ ++ (nullable instancetype)dsaObjectFromAdObject:(nullable NSDictionary *)dsaObject; + +@end diff --git a/sdk/sourcefiles/public-headers/ANDSASettings.h b/sdk/sourcefiles/public-headers/ANDSASettings.h new file mode 100644 index 00000000..f256d624 --- /dev/null +++ b/sdk/sourcefiles/public-headers/ANDSASettings.h @@ -0,0 +1,75 @@ +/* Copyright 2024 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import +#import "ANDSATransparencyInfo.h" + +/** + Represents settings related to the Digital Services Act (DSA) and transparency information required for ad rendering. + + Example Usage: + @code + // Create an instance of ANDSASettings + [ANDSASettings.sharedInstance setDsaRequired:1]; + [ANDSASettings.sharedInstance setPubRender:0]; + // [ANDSASettings.sharedInstance setDataToPub:1]; + + // Create a list of transparency info + NSMutableArray *transparencyList = [NSMutableArray array]; + [transparencyList addObject:[[ANDSATransparencyInfo alloc] initWithDomain:@"example.com" andDSAParams:@[@1, @2, @3]]]; + [transparencyList addObject:[[ANDSATransparencyInfo alloc] initWithDomain:@"example.net" andDSAParams:@[@4, @5, @6]]]; + + // Set the transparency list in ANDSASettings + [ANDSASettings.sharedInstance setTransparencyList:transparencyList]; + @endcode +*/ +@interface ANDSASettings : NSObject + +/** + * Set the DSA information requirement. + * 0 = Not required + * 1 = Supported, bid responses with or without DSA object will be accepted + * 2 = Required, bid responses without DSA object will not be accepted + * 3 = Required, bid responses without DSA object will not be accepted, Publisher is an Online Platform + */ +@property (nonatomic, readwrite, assign) NSInteger dsaRequired; + +/** + * Set if the publisher renders the DSA transparency info. + * 0 = Publisher can't render + * 1 = Publisher could render depending on adrender + * 2 = Publisher will render + */ +@property (nonatomic, readwrite, assign) NSInteger pubRender; + + +// Publisher app should not be setting dataToPub value. This is not supported in /ut/v3 +// This is here only for Testing purpose +/** + * Set the transparency data if needed for audit purposes. + * 0 = do not send transparency data + * 1 = optional to send transparency data + * 2 = send transparency data + */ + @property (nonatomic, readwrite, assign) NSInteger dataToPub; + +/** + * Set the transparency list using the provided list of ANDSATransparencyInfo. + */ +@property (nonatomic, strong, nullable) NSArray *transparencyList; + ++ (nonnull instancetype)sharedInstance; + +@end diff --git a/sdk/sourcefiles/public-headers/ANDSATransparencyInfo.h b/sdk/sourcefiles/public-headers/ANDSATransparencyInfo.h new file mode 100644 index 00000000..3fe2964f --- /dev/null +++ b/sdk/sourcefiles/public-headers/ANDSATransparencyInfo.h @@ -0,0 +1,49 @@ +/* Copyright 2024 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +/** +Represents transparency information for Digital Services Act (DSA). +This class encapsulates an array of objects representing entities that applied user parameters along with the parameters they applied. + +Example Usage: +@code +// Create an instance of ANDSATransparencyInfo +ANDSATransparencyInfo *transparency = [[ANDSATransparencyInfo alloc] initWithDomain:@"example.com" andDSAParams:@[@1, @2, @3]]; + +// Retrieve transparency information +NSString *domain = transparency.domain; +NSArray *dsaparams = transparency.dsaparams; +@endcode +*/ +@interface ANDSATransparencyInfo : NSObject + +/** + * Retrieves the transparency user parameters, i.e., the domain of the entity that applied user parameters. + */ +@property (nonatomic, readonly, strong, nullable) NSString *domain; + +/** + * Retrieves the transparency user parameters, i.e., the list of user parameters used for the platform or sell-side. + */ +@property (nonatomic, readonly, strong, nullable) NSArray *dsaparams; + +/** + * Initializes an ANDSATransparencyInfo instance with the specified domain and DSA params. +*/ +- (nonnull instancetype)initWithDomain:(nonnull NSString *)domain andDSAParams:(nonnull NSArray *)dsaparams; + +@end diff --git a/tests/UnitTestApp/FunctionalTests/ANAdResponseTestCase.m b/tests/UnitTestApp/FunctionalTests/ANAdResponseTestCase.m index f6551fb3..5e920723 100644 --- a/tests/UnitTestApp/FunctionalTests/ANAdResponseTestCase.m +++ b/tests/UnitTestApp/FunctionalTests/ANAdResponseTestCase.m @@ -28,7 +28,9 @@ #import "ANInstreamVideoAd+Test.h" #import "ANVideoAdPlayer.h" #import "XandrAd.h" - +#import "ANAdResponseInfo.h" +#import "ANDSAResponseInfo.h" +#import "ANDSATransparencyInfo.h" @interface ANAdResponseTestCase : XCTestCase @@ -424,6 +426,29 @@ - (void) testAdResponseWithInstreamAdFailToLoadAd XCTAssertEqualObjects(self.instreamVideoAd.adResponseInfo.auctionId, @"6677786726688787883"); } +/** + Tests banner DSA response + */ +- (void)testAdResponseWithBannerDSA +{ + [self setupBannerAd]; + [self stubRequestWithResponse:@"ANDSAResponse_Banner"]; + [self.banner loadAd]; + + self.loadAdResponseReceivedExpectation = [self expectationWithDescription:@"Waiting for adDidReceiveAd to be received"]; + [self waitForExpectationsWithTimeout:2 * kAppNexusRequestTimeoutInterval + handler:^(NSError *error) { + + }]; + XCTAssertEqualObjects(self.banner.adResponseInfo.dsaResponseInfo.behalf, @"test"); + XCTAssertEqualObjects(self.banner.adResponseInfo.dsaResponseInfo.paid, @"testname"); + XCTAssertTrue(self.banner.adResponseInfo.dsaResponseInfo.adRender == 1); + NSArray *expectedParams = @[@1, @2, @3]; + for (ANDSATransparencyInfo *transparencyInfo in self.banner.adResponseInfo.dsaResponseInfo.transparencyList) { + XCTAssertEqualObjects(transparencyInfo.domain, @"test.com"); + XCTAssertEqualObjects(transparencyInfo.dsaparams, expectedParams); + } +} #pragma mark - Stubbing diff --git a/tests/UnitTestApp/FunctionalTests/ANUniversalTagRequestBuilderFunctionalTests.m b/tests/UnitTestApp/FunctionalTests/ANUniversalTagRequestBuilderFunctionalTests.m index b42bfbb8..3818986e 100644 --- a/tests/UnitTestApp/FunctionalTests/ANUniversalTagRequestBuilderFunctionalTests.m +++ b/tests/UnitTestApp/FunctionalTests/ANUniversalTagRequestBuilderFunctionalTests.m @@ -24,6 +24,8 @@ #import "ANGDPRSettings.h" #import "ANUSPrivacySettings.h" #import "ANOMIDImplementation.h" +#import "ANDSASettings.h" +#import "ANDSATransparencyInfo.h" #if __has_include() #import #endif @@ -1504,6 +1506,54 @@ - (void)testUTRequestDoNotTrackNO } +/** + Tests DSA Params + */ +- (void)testUTRequestForDSA +{ + [ANDSASettings.sharedInstance setDsaRequired: 1]; + [ANDSASettings.sharedInstance setPubRender: 0]; + [ANDSASettings.sharedInstance setDataToPub: 1]; + NSMutableArray *transparencyList = [NSMutableArray array]; + [transparencyList addObject:[[ANDSATransparencyInfo alloc] initWithDomain:@"example.com" andDSAParams:@[@1, @2, @3]]]; + [transparencyList addObject:[[ANDSATransparencyInfo alloc] initWithDomain:@"example.net" andDSAParams:@[@4, @5, @6]]]; + [ANDSASettings.sharedInstance setTransparencyList: transparencyList]; + TestANUniversalFetcher *adFetcher = [[TestANUniversalFetcher alloc] initWithPlacementId:placementID]; + NSURLRequest *request = [ANUniversalTagRequestBuilder buildRequestWithAdFetcherDelegate:adFetcher.delegate]; + XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]]; + + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), + ^{ + NSError *error; + + id jsonObject = [NSJSONSerialization JSONObjectWithData:request.HTTPBody + options:kNilOptions + error:&error]; + TESTTRACEM(@"jsonObject=%@", jsonObject); + XCTAssertNil(error); + XCTAssertNotNil(jsonObject); + XCTAssertTrue([jsonObject isKindOfClass:[NSDictionary class]]); + NSDictionary *jsonDict = (NSDictionary *)jsonObject; + NSDictionary *requestDSADict = jsonDict[@"dsa"]; + XCTAssertNotNil(requestDSADict); + XCTAssertEqual([requestDSADict[@"dsarequired"] intValue], 1); + XCTAssertEqual([requestDSADict[@"pubrender"] intValue], 0); + XCTAssertEqual([requestDSADict[@"datatopub"] intValue], 1); + NSArray *transparencyArray = requestDSADict[@"transparency"]; + NSMutableArray *expectedList = [NSMutableArray array]; + for (NSUInteger i = 0; i < transparencyList.count; i++) { + ANDSATransparencyInfo *transparencyInfo = transparencyList[i]; + NSDictionary *jsonObject = @{@"domain": transparencyInfo.domain, @"dsaparams": transparencyInfo.dsaparams}; + [expectedList addObject:jsonObject]; + } + XCTAssertEqualObjects(expectedList, transparencyArray); + + [expectation fulfill]; + }); + + [self waitForExpectationsWithTimeout:UTMODULETESTS_TIMEOUT handler:nil]; +} @end diff --git a/tests/UnitTestApp/UnitTestApp.xcodeproj/project.pbxproj b/tests/UnitTestApp/UnitTestApp.xcodeproj/project.pbxproj index b7f552e1..4ab753b8 100644 --- a/tests/UnitTestApp/UnitTestApp.xcodeproj/project.pbxproj +++ b/tests/UnitTestApp/UnitTestApp.xcodeproj/project.pbxproj @@ -482,6 +482,8 @@ C6E0448329522BAD00F1B32B /* ANGoogleMediationSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = C6E0448029522BAD00F1B32B /* ANGoogleMediationSettings.m */; }; E223F99C2B2B3DD500F686AD /* AppNexusSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0ECF333E22D798DB007DB185 /* AppNexusSDK.framework */; }; E223F99D2B2B3DD500F686AD /* AppNexusSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0ECF333E22D798DB007DB185 /* AppNexusSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E2B6E72D2B627AAF0017B7A7 /* ANDSAResponse_Banner.json in Resources */ = {isa = PBXBuildFile; fileRef = E2B6E7292B627AAF0017B7A7 /* ANDSAResponse_Banner.json */; }; + E2B6E72E2B627AAF0017B7A7 /* ANDSAResponse_Banner.json in Resources */ = {isa = PBXBuildFile; fileRef = E2B6E7292B627AAF0017B7A7 /* ANDSAResponse_Banner.json */; }; FC230DF6269371440081A488 /* NSURLProtocol+WebKitSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC230DB226936E000081A488 /* NSURLProtocol+WebKitSupport.swift */; }; FC230E02269371470081A488 /* WebKitURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC230DB326936E000081A488 /* WebKitURLProtocol.swift */; }; FC230E0D2693714B0081A488 /* AuthenticationChallengeSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC230DB426936E000081A488 /* AuthenticationChallengeSender.swift */; }; @@ -1475,6 +1477,7 @@ 97FFD0512372DA7900412B20 /* ANAdResponseRTB_Video.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = ANAdResponseRTB_Video.json; sourceTree = ""; }; C6E0448029522BAD00F1B32B /* ANGoogleMediationSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANGoogleMediationSettings.m; sourceTree = ""; }; C6E0448129522BAD00F1B32B /* ANGoogleMediationSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANGoogleMediationSettings.h; sourceTree = ""; }; + E2B6E7292B627AAF0017B7A7 /* ANDSAResponse_Banner.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = ANDSAResponse_Banner.json; sourceTree = ""; }; FC230DB226936E000081A488 /* NSURLProtocol+WebKitSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSURLProtocol+WebKitSupport.swift"; sourceTree = ""; }; FC230DB326936E000081A488 /* WebKitURLProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebKitURLProtocol.swift; sourceTree = ""; }; FC230DB426936E000081A488 /* AuthenticationChallengeSender.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationChallengeSender.swift; sourceTree = ""; }; @@ -2354,6 +2357,7 @@ 0EEFE10822005532002B5F5F /* StubResponse */ = { isa = PBXGroup; children = ( + E2B6E7292B627AAF0017B7A7 /* ANDSAResponse_Banner.json */, 0E8794F323C34D23008DA1D6 /* MARStubResponse */, 97FFD04E2372DA7700412B20 /* ANAdResponseCSM_Banner.json */, FC4C72D524FEFD8500379108 /* ANAdResponseCSM_BannerFail.json */, @@ -3000,6 +3004,7 @@ 0E3F32F223CE68E300CA830D /* bannerNative_native_mediation.json in Resources */, 0ED15A1D2236C03400D56022 /* BaseMediationSingleNetworkResponse.json in Resources */, 0ED15A1D2236C03400D56022 /* BaseMediationSingleNetworkResponse.json in Resources */, + E2B6E72D2B627AAF0017B7A7 /* ANDSAResponse_Banner.json in Resources */, FCE115CE26F0D18E0004D2D3 /* CpmPublisherCurrencyBannerObjectResponse.json in Resources */, 0E9441EC24476B6F00D266F9 /* CSR_Facebook_Banner_Native.json in Resources */, 0E9441EC24476B6F00D266F9 /* CSR_Facebook_Banner_Native.json in Resources */, @@ -3188,6 +3193,7 @@ FC54F66C27AC1B6D00354121 /* bannerNative_native_mediation.json in Resources */, FC54F66D27AC1B6D00354121 /* BaseMediationSingleNetworkResponse.json in Resources */, FC54F66D27AC1B6D00354121 /* BaseMediationSingleNetworkResponse.json in Resources */, + E2B6E72E2B627AAF0017B7A7 /* ANDSAResponse_Banner.json in Resources */, FC54F67427AC1B6D00354121 /* CpmPublisherCurrencyBannerObjectResponse.json in Resources */, FC54F66E27AC1B6D00354121 /* CSR_Facebook_Banner_Native.json in Resources */, FC54F66E27AC1B6D00354121 /* CSR_Facebook_Banner_Native.json in Resources */, diff --git a/tests/UnitTestApp/UnitTestApp/SharedMockFiles/StubResponse/ANDSAResponse_Banner.json b/tests/UnitTestApp/UnitTestApp/SharedMockFiles/StubResponse/ANDSAResponse_Banner.json new file mode 100644 index 00000000..73da23ea --- /dev/null +++ b/tests/UnitTestApp/UnitTestApp/SharedMockFiles/StubResponse/ANDSAResponse_Banner.json @@ -0,0 +1,65 @@ +{ + "version": "3.0.0", + "tags": [ + { + "uuid": "9C6BA052-A267-4B2E-AA33-0AEC9EDD0D5A", + "tag_id": 17058950, + "auction_id": "4138779500857841320", + "nobid": false, + "no_ad_url": "https://sin3-ib.adnxs.com/it?an_audit=0&e=wqT_3QLoCaDoBAAAAwDWAAUBCPj6yK0GEKits4LywPm3ORjGyt_hw6-mnG4qNgkAAAkCABEJBywAABkAAABA4XqEPyEREgApEQkAMREb9I4BMIaZkQg47k5A7k5IAFAAWJSaeGAAaO2RkQF4AIABAYoBAJIBA1VTRJgBrAKgAfoBqAEBsAEAuAEBwAEAyAEC0AEA2AEA4AEA8AEA-gENTW9iaWxlU0RLRGVtb4oCKnVmKCdhJywgMzk0NDk3MywgMCk7dWYoJ3InLCAxODI0MjQ1ODUsIDApO5IC_QMhTEZmRUVRam14NVVRRUltb19sWVlBQ0NVbW5nd0JEZ0FRQVJJN2s1UWhwbVJDRmdBWUlZQ2FBQndNbmlpQVlBQmlnR0lBYUlCa0FFQm1BRUJvQUVTcUFFRHNBRUF1UUd2cjBvMXR2amtQc0VCcjY5S05iYjQ1RDdKQVkyZDhDdDQwZFFfMlFFQUFBQUFBQUR3UC1BQkFQVUJBQUFBQUpnQ0FLQUNBTFVDQUFBQUFMMENBQUFBQU1BQ0FNZ0NBTkFDQU5nQ0FPQUNBT2dDQVBnQ0FJQURBWmdEQWJvRENWTkpUak02TlRReE5lQUR4RVdJQkFDUUJBQ1lCQUhCQkFBQUFBBVoMQXlRUQkJAQEYTmdFQVBFRQELCQEgQ0lCYWNxcVFVCQ8YQUR3UDdFRg0NAbgEQkIdPwB5FSgMQUFBTjIoAABaLigA8D40QVVCOEFXSTk4WUUtQVdONVBBQmdnWURWVk5FaUFZQWtBWUJtQVlBb1FieGFPT0l0ZmprUHFnR0FiSUdKQWsBXgkBAEIdqwRCawkUAQEAQx0YGExnR0NvRUkBFw0BOC6aApUBIXp4UUFXZ2pteF0BKGxKcDRJQVFvQURIGXlMam9KVTBsT016bzFOREUxUU1SRlMR9QxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYx0MEGVBQ0pBHRD0BQHYAgDgAsqoTYADAIgDAZADAJgDF6ADAaoDAMAD2ATIAwDYAwDgAwDoAwL4AwCABACSBAYvdXQvdjOYBACiBA0xNzEuNzYuODcuMTE2qASSqwOyBA4IABABGKwCIPoBMAA4ArgEAMAEAMgEANIEDzEwMDk0I1NJTjM6NTQxNdoEAggA4AQB8ASJqP5WggUbY29tLnhhbmRyLlNpbXBsZUludGVncmF0aW9uiAUBmAUAoAX___________8BwAUAyQUAAAAAAADwP9IFCQkAAAAAAAAAANgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgDBBgAAAAAAAPC_0AbWM9oGFgoQAAAAAAAAkTl8AAAQABgA4AYB8gYCCACABwGIBwCgBwHIB7XTBdIHDQkRKAEmDNoHBggFCZjgBwDqBwIIAPAHgL0LiggCEACVCAAAgD-YCALACADSCAYIABAAGAA.&s=8c8d7961d60d614dc13131808a67237f03a6b574", + "timeout_ms": 0, + "ad_profile_id": 1266762, + "rtb_video_fallback": false, + "ads": [ + { + "dsa": { + "behalf": "test", + "paid": "testname", + "transparency": [ + { + "domain": "test.com", + "dsaparams": [ + 1, + 2, + 3 + ] + } + ], + "adrender": 1 + }, + "cpm": 0.00001, + "cpm_publisher_currency": 0.00001, + "publisher_currency_code": "$", + "publisher_currency_codename": "USD", + "content_source": "rtb", + "ad_type": "banner", + "buyer_member_id": 10094, + "creative_id": 182424585, + "media_type_id": 1, + "media_subtype_id": 1, + "brand_category_id": 0, + "brand_id": 1, + "is_sov": false, + "is_roadblock": true, + "bidder_id": 2, + "client_initiated_ad_counting": true, + "rtb": { + "banner": { + "content": "
", + "width": 300, + "height": 250 + }, + "trackers": [ + { + "impression_urls": [ + "https://sin3-ib.adnxs.com/it?an_audit=0&e=wqT_3QL4CfBD-AQAAAMA1gAFAQj4-sitBhCorbOC8sD5tzkYxsrf4cOvppxuKjYJ8WjjiLX45D4R8WjjiLX45D4ZAAAAQOF6hD8h8WgJGwApESQAMREbqDCGmZEIOO5OQO5OSAJQiaj-VliUmnhgAGjtkZEBeLXTBYABAYoBA1VTRJIFBvD9mAGsAqAB-gGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQD6AQ1Nb2JpbGVTREtEZW1vigIqdWYoJ2EnLCAzOTQ0OTczLCAwKTt1ZigncicsIDE4MjQyNDU4NSwgMCk7kgL9AyFMRmZFRVFqbXg1VVFFSW1vX2xZWUFDQ1Vtbmd3QkRnQVFBUkk3azVRaHBtUkNGZ0FZSVlDYUFCd01uaWlBWUFCaWdHSUFhSUJrQUVCbUFFQm9BRVNxQUVEc0FFQXVRR3ZyMG8xdHZqa1BzRUJyNjlLTmJiNDVEN0pBWTJkOEN0NDBkUV8yUUVBQUFBQUFBRHdQLUFCQVBVQkEBEChKZ0NBS0FDQUxVQwEPCEFMMAkI8ElNQUNBTWdDQU5BQ0FOZ0NBT0FDQU9nQ0FQZ0NBSUFEQVpnREFib0RDVk5KVGpNNk5UUXhOZUFEeEVXSUJBQ1FCQUNZQkFIQkJBQQVXAQEIeVFRAQcJARhOZ0VBUEVFCQ0BASBDSUJhY3FxUVUBDSBBQUFEd1A3RUYBCgkBCERCQh0_AHkVKAxBQUFOMigAAFouKABsNEFVQjhBV0k5OFlFLUFXTjVQQUJnZ1lEVlZORSFdeGtBWUJtQVlBb1FieGFPT0l0ZmprUHFnR0FiSUdKQWsBXgkBAEIdqwRCawkUAQEAQx0YGExnR0NvRUkBFw0BOC6aApUBIXp4UUFXZ2pteF0BKGxKcDRJQVFvQURIGXlMam9KVTBsT016bzFOREUxUU1SRlMR9QxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYx0MEGVBQ0pBHRDwhtgCAOACyqhNgAMAiAMBkAMAmAMXoAMBqgMAwAPYBMgDANgDAOADAOgDAvgDAIAEAJIEBi91dC92M5gEAKIEDTE3MS43Ni44Ny4xMTaoBJKrA7IEDggAEAEYrAIg-gEwADgCuAQAwAQAyAQA0gQPMTAwOTQjU0lOMzo1NDE12gQCCAHgBAHwBGGjoIIFG2NvbS54YW5kci5TaW1wbGVJbnRlZ3JhdGlvbogFAZgFAKAF____CQIYAcAFAMkFAAUBFPA_0gUJCQULdAAAANgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgDBBgEfMAAA8D_QBtYz2gYWChAJERkBcBAAGADgBgHyBgIIAIAHAYgHAKAHAcgHtdMF0gcNFWIBJgjaBwYBXcAYAOAHAOoHAggA8AeAvQuKCAIQAJUIAACAP5gIAsAIANIIDgiBgoSIkKDAgAEQABgA&s=3e9a051d58ed9b7fa1ce008435443cdf7b959d39" + ], + "video_events": {} + } + ] + } + } + ] + } + ] +}