diff --git a/AppNexusSDK.podspec b/AppNexusSDK.podspec
index 90a7575fc..06bd6aaf4 100644
--- a/AppNexusSDK.podspec
+++ b/AppNexusSDK.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "AppNexusSDK"
- s.version = "7.10"
+ s.version = "7.11"
s.platform = :ios, "9.0"
s.summary = "AppNexus iOS Mobile Advertising SDK"
@@ -29,7 +29,7 @@ DESC
s.subspec 'GoogleAdapter' do |subspec|
subspec.dependency 'AppNexusSDK/AppNexusSDK', "#{s.version}"
- subspec.dependency 'Google-Mobile-Ads-SDK', '7.69.0'
+ subspec.dependency 'Google-Mobile-Ads-SDK', '8.0.0'
subspec.source_files = "mediation/mediatedviews/GoogleAdMob/*.{h,m}"
subspec.public_header_files = "mediation/mediatedviews/GoogleAdMob/ANAdAdapterNativeAdMob.h"
subspec.xcconfig = { 'FRAMEWORK_SEARCH_PATHS' => '${PODS_ROOT}/Google-Mobile-Ads-SDK/**' }
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 17dd260e4..12c68c400 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -1,3 +1,10 @@
+## 7.11
+### Improvements/Bug Fixes
++ MS-4714 Added improvement for Ad Expiry events for Native Ads.
++ MS-4685 Added API to disable tracking cookies during auction.
+### Mediation partner updates
++ MS-4656 Upgraded Google AdMob SDK from v7.69.0 to v8.0.0
+
## 7.10
### New Feature
+ MS-4659, MS-4674 Added support for User Id from external sources(Criteo, NetID, LiverRamp, The Trade Desk) (https://wiki.xandr.com/x/7IW1Bg)
diff --git a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/BannerAd/BannerAdViewController.m b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/BannerAd/BannerAdViewController.m
index 63043a30e..642784a39 100644
--- a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/BannerAd/BannerAdViewController.m
+++ b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/BannerAd/BannerAdViewController.m
@@ -36,12 +36,10 @@ - (void)viewDidLoad
int adWidth = 300;
int adHeight = 250;
- NSString *adID = @"15215010";
+ NSString *adID = @"17058950";
int adWidth1 = 320;
int adHeight1 = 50;
- NSString *inventoryCode = @"finanzen.net-app_ios_phone-home_index-banner";
- NSInteger memberID = 7823;
// We want to center our ad on the screen.
CGRect screenRect = [[UIScreen mainScreen] bounds];
diff --git a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/InterstitialAd/InterstitialAdViewController.m b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/InterstitialAd/InterstitialAdViewController.m
index b9f55e627..b21936aaf 100644
--- a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/InterstitialAd/InterstitialAdViewController.m
+++ b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/InterstitialAd/InterstitialAdViewController.m
@@ -29,7 +29,7 @@ @implementation InterstitialAdViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Interstitial Ad";
- self.interstitialAd = [[ANInterstitialAd alloc] initWithPlacementId:@"19212468"];
+ self.interstitialAd = [[ANInterstitialAd alloc] initWithPlacementId:@"17058950"];
self.interstitialAd.delegate = self;
self.interstitialAd.clickThroughAction = ANClickThroughActionReturnURL;
[self.interstitialAd loadAd];
diff --git a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/MultiAdRequest/MultiAdViewController.m b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/MultiAdRequest/MultiAdViewController.m
index 78ada6ba0..b6bf3925c 100644
--- a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/MultiAdRequest/MultiAdViewController.m
+++ b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/MultiAdRequest/MultiAdViewController.m
@@ -61,7 +61,7 @@ - (void)viewDidLoad {
// Create Banner Ad Object
- (ANBannerAdView *)createBannerAd:(UIView *) adView
{
- self.bannerAd = [[ANBannerAdView alloc] initWithFrame:CGRectMake(0, 0, 300, 250) placementId:@"15215010" adSize:CGSizeMake(300, 250)];
+ self.bannerAd = [[ANBannerAdView alloc] initWithFrame:CGRectMake(0, 0, 300, 250) placementId:@"17058950" adSize:CGSizeMake(300, 250)];
self.bannerAd.rootViewController =self;
self.bannerAd.delegate =self;
self.bannerAd.shouldResizeAdToFitContainer = YES;
@@ -73,7 +73,7 @@ - (ANBannerAdView *)createBannerAd:(UIView *) adView
// Create Interstitial Ad Object
- (ANInterstitialAd *)createInterstitialAd
{
- self.interstitialAd = [[ANInterstitialAd alloc] initWithPlacementId:@"19212468"];
+ self.interstitialAd = [[ANInterstitialAd alloc] initWithPlacementId:@"17058950"];
self.interstitialAd.delegate =self;
return self.interstitialAd;
@@ -83,7 +83,7 @@ - (ANInterstitialAd *)createInterstitialAd
// Create InstreamVideo Ad Object
- (ANInstreamVideoAd *)createVideoAd
{
- self.videoAd = [[ANInstreamVideoAd alloc] initWithPlacementId:@"19212468"];
+ self.videoAd = [[ANInstreamVideoAd alloc] initWithPlacementId:@"17058950"];
self.videoAd.loadDelegate =self;
return self.videoAd;
}
@@ -92,7 +92,7 @@ - (ANInstreamVideoAd *)createVideoAd
- (ANNativeAdRequest *)createNativeAd
{
self.nativeAdRequest = [[ANNativeAdRequest alloc] init];
- self.nativeAdRequest.placementId = @"19212468";
+ self.nativeAdRequest.placementId = @"17058950";
self.nativeAdRequest.shouldLoadIconImage = YES;
self.nativeAdRequest.shouldLoadMainImage = YES;
self.nativeAdRequest.delegate = self;
diff --git a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/VideoAd/VideoAdViewController.m b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/VideoAd/VideoAdViewController.m
index 786ed6fbc..158ef3ee4 100644
--- a/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/VideoAd/VideoAdViewController.m
+++ b/examples/ObjectiveC/SimpleIntegration/SimpleIntegrationObjC/VideoAd/VideoAdViewController.m
@@ -23,7 +23,7 @@
NSString *const videoContent = @"https://acdn.adnxs.com/mobile/video_test/content/Scenario.mp4";
-NSString *const placementId = @"19212468";
+NSString *const placementId = @"17058950";
@@ -74,7 +74,6 @@ - (void)viewDidLoad {
[self setupContentPlayer];
self.videoAd = [[ANInstreamVideoAd alloc] initWithPlacementId:placementId];
-// self.videoAd = [[ANInstreamVideoAd alloc] initWithMemberId:958 inventoryCode:@"trucksmash"];
[self.videoAd loadAdWithDelegate:self];
self.videoAd.clickThroughAction = ANClickThroughActionOpenSDKBrowser;
diff --git a/examples/SimpleMediation/Podfile b/examples/SimpleMediation/Podfile
new file mode 100644
index 000000000..5deec829d
--- /dev/null
+++ b/examples/SimpleMediation/Podfile
@@ -0,0 +1,25 @@
+
+# Define a global platform for your project.
+platform :ios, '9.0'
+
+
+
+
+
+target 'SimpleMediation' do
+ pod 'Google-Mobile-Ads-SDK', '~> 7.67.0'
+ pod 'FBAudienceNetwork', '~> 6.2.0'
+ pod 'Smart-Display-SDK', '~> 7.8.0'
+
+
+end
+
+
+target 'SimpleCSR' do
+ pod 'FBAudienceNetwork', '~> 6.2.0'
+
+end
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleCSR/CSRViewController/Facebook/FacebookCSRNativeBanner.storyboard b/examples/SimpleMediation/SimpleCSR/CSRViewController/Facebook/FacebookCSRNativeBanner.storyboard
new file mode 100644
index 000000000..f60f29b1d
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/CSRViewController/Facebook/FacebookCSRNativeBanner.storyboard
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleCSR/CSRViewController/Facebook/FacebookCSRNativeBanner.swift b/examples/SimpleMediation/SimpleCSR/CSRViewController/Facebook/FacebookCSRNativeBanner.swift
new file mode 100644
index 000000000..9ecfd3050
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/CSRViewController/Facebook/FacebookCSRNativeBanner.swift
@@ -0,0 +1,80 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+import FBAudienceNetwork
+class FacebookCSRNativeBanner: UIViewController , ANNativeAdRequestDelegate , ANNativeAdDelegate {
+
+ @IBOutlet var adCoverMediaView: FBMediaView!
+ @IBOutlet var adTitleLabel: UILabel!
+ @IBOutlet var adCallToActionButton: UIButton!
+ @IBOutlet var sponsoredLabel: UILabel!
+ @IBOutlet var adOptionsView: FBAdOptionsView!
+
+ @IBOutlet weak var adUIView: UIStackView!
+
+ var nativeAdRequest: ANNativeAdRequest?
+ var nativeAdResponse: ANNativeAdResponse?
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+
+ FBAdSettings.addTestDevice(FBAdSettings.testDeviceHash())
+
+ nativeAdRequest = ANNativeAdRequest()
+ nativeAdRequest!.placementId = "1906599"
+ nativeAdRequest!.shouldLoadIconImage = true
+ nativeAdRequest!.shouldLoadMainImage = true
+ nativeAdRequest!.delegate = self
+ nativeAdRequest!.loadAd()
+ }
+
+
+ func adRequest(_ request: ANNativeAdRequest, didReceive response: ANNativeAdResponse) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ adUIView.isHidden = false
+ self.nativeAdResponse = response
+
+
+ Toast.show(message: "Native ad was loaded, constructing native UI...", controller: self)
+
+ // Render native ads onto UIView
+ adTitleLabel.text = self.nativeAdResponse?.title
+ sponsoredLabel.text = self.nativeAdResponse?.sponsoredBy
+ self.adCallToActionButton.setTitle(self.nativeAdResponse?.callToAction, for: .normal)
+ if self.nativeAdResponse?.customElements![kANNativeCSRObject] != nil && self.nativeAdResponse?.customElements![kANNativeCSRObject] != nil {
+ print("Register CSR Ad for tracking...")
+
+ if let fbNativeBanner = self.nativeAdResponse?.customElements![kANNativeCSRObject] as? ANAdAdapterCSRNativeBannerFacebook {
+ fbNativeBanner.registerView( forTracking: adUIView, withRootViewController: self, iconView: self.adCoverMediaView, clickableViews: [self.adUIView!])
+ }
+ // CSR registerViewForTracking (see example below)
+ }else{
+ // Non CSR registerViewForTracking
+ // See native ad examples here: https://wiki.xandr.com/display/sdk/Show+Native+Ads+on+iOS
+ Toast.show(message: "Non CSR Native ad was loaded", controller: self)
+
+ }
+ }
+
+
+ func adRequest(_ request: ANNativeAdRequest, didFailToLoadWithError error: Error, with adResponseInfo: ANAdResponseInfo?) {
+ Toast.show(message: "ad requestFailedWithError \(error)", controller: self)
+ }
+
+}
+
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/AppDelegate.swift b/examples/SimpleMediation/SimpleCSR/SupportingFile/AppDelegate.swift
new file mode 100644
index 000000000..e97aa51f3
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/AppDelegate.swift
@@ -0,0 +1,34 @@
+/* Copyright 2020 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 UIKit
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+ var window: UIWindow?
+
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+
+
+
+}
+
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/SimpleMediation/SimpleCSR/SupportingFile/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..9221b9bb1
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,98 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "76x76"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "76x76"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "83.5x83.5"
+ },
+ {
+ "idiom" : "ios-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/Assets.xcassets/Contents.json b/examples/SimpleMediation/SimpleCSR/SupportingFile/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..73c00596a
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/Base.lproj/LaunchScreen.storyboard b/examples/SimpleMediation/SimpleCSR/SupportingFile/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 000000000..865e9329f
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/Base.lproj/Main.storyboard b/examples/SimpleMediation/SimpleCSR/SupportingFile/Base.lproj/Main.storyboard
new file mode 100644
index 000000000..fa5664c99
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/Base.lproj/Main.storyboard
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/Info.plist b/examples/SimpleMediation/SimpleCSR/SupportingFile/Info.plist
new file mode 100644
index 000000000..cdf50e41a
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/Info.plist
@@ -0,0 +1,50 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/SimpleCSR-Bridging-Header.h b/examples/SimpleMediation/SimpleCSR/SupportingFile/SimpleCSR-Bridging-Header.h
new file mode 100644
index 000000000..423a79239
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/SimpleCSR-Bridging-Header.h
@@ -0,0 +1,16 @@
+/* Copyright 2020 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 "ANAdAdapterCSRNativeBannerFacebook.h"
diff --git a/examples/SimpleMediation/SimpleCSR/SupportingFile/SimpleCSRAdTypeListViewController.swift b/examples/SimpleMediation/SimpleCSR/SupportingFile/SimpleCSRAdTypeListViewController.swift
new file mode 100644
index 000000000..dfc7a4f02
--- /dev/null
+++ b/examples/SimpleMediation/SimpleCSR/SupportingFile/SimpleCSRAdTypeListViewController.swift
@@ -0,0 +1,28 @@
+/* Copyright 2020 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 UIKit
+
+class SimpleCSRAdTypeListViewController: UITableViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+
+
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation.xcodeproj/project.pbxproj b/examples/SimpleMediation/SimpleMediation.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..cf6719446
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation.xcodeproj/project.pbxproj
@@ -0,0 +1,1016 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 51;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0E5660EA23BE39AF0088EB36 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5660E923BE39AF0088EB36 /* AppDelegate.swift */; };
+ 0E5660F123BE39AF0088EB36 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E5660EF23BE39AF0088EB36 /* Main.storyboard */; };
+ 0E5660F323BE39B10088EB36 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0E5660F223BE39B10088EB36 /* Assets.xcassets */; };
+ 0E5670A3240D04BB0006B158 /* FacebookBannerAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E5670A0240D04BB0006B158 /* FacebookBannerAd.storyboard */; };
+ 0E5670A4240D04BB0006B158 /* FacebookInterstitialAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E5670A1240D04BB0006B158 /* FacebookInterstitialAd.storyboard */; };
+ 0E5B043E23BF4EED00DEBACE /* VideoAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5B043D23BF4EED00DEBACE /* VideoAdViewController.swift */; };
+ 0E5B044023BF618800DEBACE /* SimpleMediationAdTypeListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5B043F23BF618800DEBACE /* SimpleMediationAdTypeListViewController.swift */; };
+ 0E82E4CF245CC33500EC19E1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E82E4CE245CC33500EC19E1 /* AppDelegate.swift */; };
+ 0E82E4D3245CC33500EC19E1 /* SimpleCSRAdTypeListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E82E4D2245CC33500EC19E1 /* SimpleCSRAdTypeListViewController.swift */; };
+ 0E82E4D6245CC33500EC19E1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E82E4D4245CC33500EC19E1 /* Main.storyboard */; };
+ 0E82E4D8245CC33600EC19E1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0E82E4D7245CC33600EC19E1 /* Assets.xcassets */; };
+ 0E82E4DB245CC33600EC19E1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E82E4D9245CC33600EC19E1 /* LaunchScreen.storyboard */; };
+ 0E82E4E0245CC34D00EC19E1 /* FacebookCSRNativeBanner.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E56709F240D04BB0006B158 /* FacebookCSRNativeBanner.storyboard */; };
+ 0E82E4E1245CC34D00EC19E1 /* FacebookCSRNativeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5B045023BF652C00DEBACE /* FacebookCSRNativeBanner.swift */; };
+ 0E82E4E4245CC6B600EC19E1 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D04323FD6EB300D0C060 /* Toast.swift */; };
+ 0E82E508245CD27C00EC19E1 /* ANAdAdapterCSRNativeBannerFacebook.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E82E504245CD27C00EC19E1 /* ANAdAdapterCSRNativeBannerFacebook.m */; };
+ 0E82E509245CD27C00EC19E1 /* ANFBSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E82E505245CD27C00EC19E1 /* ANFBSettings.m */; };
+ 0EE0D04023FD6D1D00D0C060 /* VideoAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D03E23FD6D1D00D0C060 /* VideoAd.storyboard */; };
+ 0EE0D04523FD6EB300D0C060 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D04323FD6EB300D0C060 /* Toast.swift */; };
+ 0EE0D04823FD6EEC00D0C060 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D04623FD6EEC00D0C060 /* LaunchScreen.storyboard */; };
+ 0EE0D04A23FD723800D0C060 /* AdmobDFPBannerAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D04923FD723800D0C060 /* AdmobDFPBannerAdViewController.swift */; };
+ 0EE0D04C23FD728200D0C060 /* AdmobDFPInterstitialAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D04B23FD728200D0C060 /* AdmobDFPInterstitialAdViewController.swift */; };
+ 0EE0D04F23FD728A00D0C060 /* FacebookInterstitialAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D04D23FD728A00D0C060 /* FacebookInterstitialAdViewController.swift */; };
+ 0EE0D05023FD728A00D0C060 /* FacebookBannerAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D04E23FD728A00D0C060 /* FacebookBannerAdViewController.swift */; };
+ 0EE0D05B23FD72A200D0C060 /* SmartAdBannerAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D05923FD72A100D0C060 /* SmartAdBannerAdViewController.swift */; };
+ 0EE0D05C23FD72A200D0C060 /* SmartAdInterstitialAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D05A23FD72A200D0C060 /* SmartAdInterstitialAdViewController.swift */; };
+ 0EE0D06423FD764800D0C060 /* AdMobDFPNativeAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D06023FD764800D0C060 /* AdMobDFPNativeAd.storyboard */; };
+ 0EE0D06523FD764800D0C060 /* AdmobDFPInterstitialAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D06123FD764800D0C060 /* AdmobDFPInterstitialAd.storyboard */; };
+ 0EE0D06623FD764800D0C060 /* AdMobDFPNativeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D06223FD764800D0C060 /* AdMobDFPNativeViewController.swift */; };
+ 0EE0D06723FD764800D0C060 /* AdmobDFPBannerAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D06323FD764800D0C060 /* AdmobDFPBannerAd.storyboard */; };
+ 0EE0D06A23FD7C1300D0C060 /* SmartAdInterstitialAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D06823FD7C1300D0C060 /* SmartAdInterstitialAd.storyboard */; };
+ 0EE0D06B23FD7C1300D0C060 /* SmartAdBannerAd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D06923FD7C1300D0C060 /* SmartAdBannerAd.storyboard */; };
+ 0EE0D0C323FD7E0100D0C060 /* ANAdAdapterBannerSmartAd.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09223FD7E0100D0C060 /* ANAdAdapterBannerSmartAd.m */; };
+ 0EE0D0C423FD7E0100D0C060 /* ANAdAdapterSmartAdBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09323FD7E0100D0C060 /* ANAdAdapterSmartAdBase.m */; };
+ 0EE0D0C523FD7E0100D0C060 /* ANAdAdapterInterstitialSmartAd.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09723FD7E0100D0C060 /* ANAdAdapterInterstitialSmartAd.m */; };
+ 0EE0D0C623FD7E0100D0C060 /* ANAdAdapterInterstitialDFP.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09A23FD7E0100D0C060 /* ANAdAdapterInterstitialDFP.m */; };
+ 0EE0D0C723FD7E0100D0C060 /* ANAdAdapterNativeAdMob.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09C23FD7E0100D0C060 /* ANAdAdapterNativeAdMob.m */; };
+ 0EE0D0C823FD7E0100D0C060 /* ANAdAdapterBannerDFP.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09D23FD7E0100D0C060 /* ANAdAdapterBannerDFP.m */; };
+ 0EE0D0C923FD7E0100D0C060 /* ANAdAdapterBaseDFP.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09E23FD7E0100D0C060 /* ANAdAdapterBaseDFP.m */; };
+ 0EE0D0CA23FD7E0100D0C060 /* ANAdAdapterBannerAdMob.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D09F23FD7E0100D0C060 /* ANAdAdapterBannerAdMob.m */; };
+ 0EE0D0CB23FD7E0100D0C060 /* ANAdAdapterInterstitialAdMob.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D0A023FD7E0100D0C060 /* ANAdAdapterInterstitialAdMob.m */; };
+ 0EE0D0CC23FD7E0100D0C060 /* ANAdAdapterInterstitialFacebook.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D0A623FD7E0100D0C060 /* ANAdAdapterInterstitialFacebook.m */; };
+ 0EE0D0CD23FD7E0100D0C060 /* ANAdAdapterNativeFacebook.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D0A823FD7E0100D0C060 /* ANAdAdapterNativeFacebook.m */; };
+ 0EE0D0CE23FD7E0100D0C060 /* ANAdAdapterBannerFacebook.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE0D0AA23FD7E0100D0C060 /* ANAdAdapterBannerFacebook.m */; };
+ 0EE0D0D423FD7ECE00D0C060 /* UnifiedNativeAdView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0EE0D0D323FD7ECE00D0C060 /* UnifiedNativeAdView.xib */; };
+ 5377DBB872736776143319CD /* libPods-SimpleMediation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DE667F379478A83D548F9F0D /* libPods-SimpleMediation.a */; };
+ FCC64C9425A7353F006E5A54 /* AppNexusSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E82E4F4245CCA5600EC19E1 /* AppNexusSDK.framework */; };
+ FCC64C9525A7353F006E5A54 /* AppNexusSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0E82E4F4245CCA5600EC19E1 /* AppNexusSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ FCC64C9625A7354C006E5A54 /* AppNexusNativeSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E82E4F6245CCA5600EC19E1 /* AppNexusNativeSDK.framework */; };
+ FCC64C9725A7354C006E5A54 /* AppNexusNativeSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0E82E4F6245CCA5600EC19E1 /* AppNexusNativeSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ FCC64CB225A739DE006E5A54 /* FacebookNative.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FCC64CAE25A739DE006E5A54 /* FacebookNative.storyboard */; };
+ FCC64CB325A739DE006E5A54 /* FacebookNativeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC64CB125A739DE006E5A54 /* FacebookNativeViewController.swift */; };
+ FD5B5E40BF0E1B733147D46F /* libPods-SimpleCSR.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E25579F2531BE4E0FECD662 /* libPods-SimpleCSR.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 0E82E4F3245CCA5600EC19E1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0E82E4EE245CCA5600EC19E1 /* AppNexusSDK.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 8A9AED8C1A1BE84F00C58BDA;
+ remoteInfo = AppNexusSDK;
+ };
+ 0E82E4F5245CCA5600EC19E1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0E82E4EE245CCA5600EC19E1 /* AppNexusSDK.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = F5731AFD228B43570012B134;
+ remoteInfo = AppNexusNativeSDK;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 0E56610923BE3A530088EB36 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ FCC64C9525A7353F006E5A54 /* AppNexusSDK.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ FCC64C9825A7354D006E5A54 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ FCC64C9725A7354C006E5A54 /* AppNexusNativeSDK.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 0E246167240E7B57004B9BC4 /* SimpleMediation-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SimpleMediation-Bridging-Header.h"; sourceTree = ""; };
+ 0E5660E623BE39AF0088EB36 /* SimpleMediation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleMediation.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0E5660E923BE39AF0088EB36 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 0E5660F023BE39AF0088EB36 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 0E5660F223BE39B10088EB36 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 0E5660F723BE39B10088EB36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 0E56709F240D04BB0006B158 /* FacebookCSRNativeBanner.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = FacebookCSRNativeBanner.storyboard; sourceTree = ""; };
+ 0E5670A0240D04BB0006B158 /* FacebookBannerAd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = FacebookBannerAd.storyboard; sourceTree = ""; };
+ 0E5670A1240D04BB0006B158 /* FacebookInterstitialAd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = FacebookInterstitialAd.storyboard; sourceTree = ""; };
+ 0E5B043D23BF4EED00DEBACE /* VideoAdViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoAdViewController.swift; sourceTree = ""; };
+ 0E5B043F23BF618800DEBACE /* SimpleMediationAdTypeListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleMediationAdTypeListViewController.swift; sourceTree = ""; };
+ 0E5B045023BF652C00DEBACE /* FacebookCSRNativeBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookCSRNativeBanner.swift; sourceTree = ""; };
+ 0E82E4CC245CC33500EC19E1 /* SimpleCSR.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleCSR.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0E82E4CE245CC33500EC19E1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 0E82E4D2245CC33500EC19E1 /* SimpleCSRAdTypeListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleCSRAdTypeListViewController.swift; sourceTree = ""; };
+ 0E82E4D5245CC33500EC19E1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 0E82E4D7245CC33600EC19E1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 0E82E4DA245CC33600EC19E1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 0E82E4DC245CC33600EC19E1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 0E82E4E7245CC74E00EC19E1 /* SimpleCSR-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SimpleCSR-Bridging-Header.h"; sourceTree = ""; };
+ 0E82E4EE245CCA5600EC19E1 /* AppNexusSDK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AppNexusSDK.xcodeproj; path = ../../sdk/AppNexusSDK.xcodeproj; sourceTree = ""; };
+ 0E82E504245CD27C00EC19E1 /* ANAdAdapterCSRNativeBannerFacebook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterCSRNativeBannerFacebook.m; sourceTree = ""; };
+ 0E82E505245CD27C00EC19E1 /* ANFBSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANFBSettings.m; sourceTree = ""; };
+ 0E82E506245CD27C00EC19E1 /* ANAdAdapterCSRNativeBannerFacebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterCSRNativeBannerFacebook.h; sourceTree = ""; };
+ 0E82E507245CD27C00EC19E1 /* ANFBSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANFBSettings.h; sourceTree = ""; };
+ 0EE0D03F23FD6D1D00D0C060 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = SimpleMediation/Base.lproj/VideoAd.storyboard; sourceTree = SOURCE_ROOT; };
+ 0EE0D04323FD6EB300D0C060 /* Toast.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Toast.swift; sourceTree = ""; };
+ 0EE0D04723FD6EEC00D0C060 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = SimpleMediation/Base.lproj/LaunchScreen.storyboard; sourceTree = SOURCE_ROOT; };
+ 0EE0D04923FD723800D0C060 /* AdmobDFPBannerAdViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdmobDFPBannerAdViewController.swift; sourceTree = ""; };
+ 0EE0D04B23FD728200D0C060 /* AdmobDFPInterstitialAdViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdmobDFPInterstitialAdViewController.swift; sourceTree = ""; };
+ 0EE0D04D23FD728A00D0C060 /* FacebookInterstitialAdViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookInterstitialAdViewController.swift; sourceTree = ""; };
+ 0EE0D04E23FD728A00D0C060 /* FacebookBannerAdViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookBannerAdViewController.swift; sourceTree = ""; };
+ 0EE0D05923FD72A100D0C060 /* SmartAdBannerAdViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SmartAdBannerAdViewController.swift; sourceTree = ""; };
+ 0EE0D05A23FD72A200D0C060 /* SmartAdInterstitialAdViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SmartAdInterstitialAdViewController.swift; sourceTree = ""; };
+ 0EE0D06023FD764800D0C060 /* AdMobDFPNativeAd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = AdMobDFPNativeAd.storyboard; sourceTree = ""; };
+ 0EE0D06123FD764800D0C060 /* AdmobDFPInterstitialAd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = AdmobDFPInterstitialAd.storyboard; sourceTree = ""; };
+ 0EE0D06223FD764800D0C060 /* AdMobDFPNativeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdMobDFPNativeViewController.swift; sourceTree = ""; };
+ 0EE0D06323FD764800D0C060 /* AdmobDFPBannerAd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = AdmobDFPBannerAd.storyboard; sourceTree = ""; };
+ 0EE0D06823FD7C1300D0C060 /* SmartAdInterstitialAd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SmartAdInterstitialAd.storyboard; sourceTree = ""; };
+ 0EE0D06923FD7C1300D0C060 /* SmartAdBannerAd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SmartAdBannerAd.storyboard; sourceTree = ""; };
+ 0EE0D09223FD7E0100D0C060 /* ANAdAdapterBannerSmartAd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterBannerSmartAd.m; sourceTree = ""; };
+ 0EE0D09323FD7E0100D0C060 /* ANAdAdapterSmartAdBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterSmartAdBase.m; sourceTree = ""; };
+ 0EE0D09423FD7E0100D0C060 /* ANAdAdapterInterstitialSmartAd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterInterstitialSmartAd.h; sourceTree = ""; };
+ 0EE0D09523FD7E0100D0C060 /* ANAdAdapterSmartAdBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterSmartAdBase.h; sourceTree = ""; };
+ 0EE0D09623FD7E0100D0C060 /* ANAdAdapterBannerSmartAd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterBannerSmartAd.h; sourceTree = ""; };
+ 0EE0D09723FD7E0100D0C060 /* ANAdAdapterInterstitialSmartAd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterInterstitialSmartAd.m; sourceTree = ""; };
+ 0EE0D09923FD7E0100D0C060 /* ANAdAdapterBannerAdMob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterBannerAdMob.h; sourceTree = ""; };
+ 0EE0D09A23FD7E0100D0C060 /* ANAdAdapterInterstitialDFP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterInterstitialDFP.m; sourceTree = ""; };
+ 0EE0D09B23FD7E0100D0C060 /* ANAdAdapterInterstitialAdMob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterInterstitialAdMob.h; sourceTree = ""; };
+ 0EE0D09C23FD7E0100D0C060 /* ANAdAdapterNativeAdMob.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterNativeAdMob.m; sourceTree = ""; };
+ 0EE0D09D23FD7E0100D0C060 /* ANAdAdapterBannerDFP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterBannerDFP.m; sourceTree = ""; };
+ 0EE0D09E23FD7E0100D0C060 /* ANAdAdapterBaseDFP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterBaseDFP.m; sourceTree = ""; };
+ 0EE0D09F23FD7E0100D0C060 /* ANAdAdapterBannerAdMob.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterBannerAdMob.m; sourceTree = ""; };
+ 0EE0D0A023FD7E0100D0C060 /* ANAdAdapterInterstitialAdMob.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterInterstitialAdMob.m; sourceTree = ""; };
+ 0EE0D0A123FD7E0100D0C060 /* ANAdAdapterInterstitialDFP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterInterstitialDFP.h; sourceTree = ""; };
+ 0EE0D0A223FD7E0100D0C060 /* ANAdAdapterNativeAdMob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterNativeAdMob.h; sourceTree = ""; };
+ 0EE0D0A323FD7E0100D0C060 /* ANAdAdapterBaseDFP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterBaseDFP.h; sourceTree = ""; };
+ 0EE0D0A423FD7E0100D0C060 /* ANAdAdapterBannerDFP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterBannerDFP.h; sourceTree = ""; };
+ 0EE0D0A623FD7E0100D0C060 /* ANAdAdapterInterstitialFacebook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterInterstitialFacebook.m; sourceTree = ""; };
+ 0EE0D0A723FD7E0100D0C060 /* ANAdAdapterBannerFacebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterBannerFacebook.h; sourceTree = ""; };
+ 0EE0D0A823FD7E0100D0C060 /* ANAdAdapterNativeFacebook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterNativeFacebook.m; sourceTree = ""; };
+ 0EE0D0A923FD7E0100D0C060 /* ANAdAdapterInterstitialFacebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterInterstitialFacebook.h; sourceTree = ""; };
+ 0EE0D0AA23FD7E0100D0C060 /* ANAdAdapterBannerFacebook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterBannerFacebook.m; sourceTree = ""; };
+ 0EE0D0AB23FD7E0100D0C060 /* ANAdAdapterNativeFacebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterNativeFacebook.h; sourceTree = ""; };
+ 0EE0D0D323FD7ECE00D0C060 /* UnifiedNativeAdView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UnifiedNativeAdView.xib; sourceTree = ""; };
+ 2E25579F2531BE4E0FECD662 /* libPods-SimpleCSR.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SimpleCSR.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7E9D464632CE623986E47C03 /* Pods-SimpleMediation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleMediation.release.xcconfig"; path = "Target Support Files/Pods-SimpleMediation/Pods-SimpleMediation.release.xcconfig"; sourceTree = ""; };
+ 92D9B61421003C0822F05D3F /* Pods-SimpleCSR.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleCSR.debug.xcconfig"; path = "Target Support Files/Pods-SimpleCSR/Pods-SimpleCSR.debug.xcconfig"; sourceTree = ""; };
+ 941E857F252A95374E5394AF /* Pods-SimpleMediation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleMediation.debug.xcconfig"; path = "Target Support Files/Pods-SimpleMediation/Pods-SimpleMediation.debug.xcconfig"; sourceTree = ""; };
+ DE667F379478A83D548F9F0D /* libPods-SimpleMediation.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SimpleMediation.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ F8136949A8662F8B5D433773 /* Pods-SimpleCSR.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleCSR.release.xcconfig"; path = "Target Support Files/Pods-SimpleCSR/Pods-SimpleCSR.release.xcconfig"; sourceTree = ""; };
+ FCC64CAE25A739DE006E5A54 /* FacebookNative.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = FacebookNative.storyboard; sourceTree = ""; };
+ FCC64CB125A739DE006E5A54 /* FacebookNativeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookNativeViewController.swift; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 0E5660E323BE39AF0088EB36 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ FCC64C9425A7353F006E5A54 /* AppNexusSDK.framework in Frameworks */,
+ 5377DBB872736776143319CD /* libPods-SimpleMediation.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 0E82E4C9245CC33500EC19E1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ FCC64C9625A7354C006E5A54 /* AppNexusNativeSDK.framework in Frameworks */,
+ FD5B5E40BF0E1B733147D46F /* libPods-SimpleCSR.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 0E5660DD23BE39AF0088EB36 = {
+ isa = PBXGroup;
+ children = (
+ 0E82E4EE245CCA5600EC19E1 /* AppNexusSDK.xcodeproj */,
+ 0E5660E823BE39AF0088EB36 /* SimpleMediation */,
+ 0E82E4CD245CC33500EC19E1 /* SimpleCSR */,
+ 0E5660E723BE39AF0088EB36 /* Products */,
+ D727BB3B00EB1882B9FF6E82 /* Pods */,
+ FCC64C9125A7353F006E5A54 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 0E5660E723BE39AF0088EB36 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 0E5660E623BE39AF0088EB36 /* SimpleMediation.app */,
+ 0E82E4CC245CC33500EC19E1 /* SimpleCSR.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 0E5660E823BE39AF0088EB36 /* SimpleMediation */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D03C23FD6CB400D0C060 /* MediationViewController */,
+ 0E5B044423BF641300DEBACE /* NavigationViewController */,
+ 0E56613B23BF2F120088EB36 /* SupportFiles */,
+ );
+ path = SimpleMediation;
+ sourceTree = "";
+ };
+ 0E56613B23BF2F120088EB36 /* SupportFiles */ = {
+ isa = PBXGroup;
+ children = (
+ 0E5660F723BE39B10088EB36 /* Info.plist */,
+ 0E5660F223BE39B10088EB36 /* Assets.xcassets */,
+ 0EE0D04123FD6EB300D0C060 /* SupportingFiles */,
+ );
+ name = SupportFiles;
+ sourceTree = "";
+ };
+ 0E5B044423BF641300DEBACE /* NavigationViewController */ = {
+ isa = PBXGroup;
+ children = (
+ 0E5660EF23BE39AF0088EB36 /* Main.storyboard */,
+ 0E5B043F23BF618800DEBACE /* SimpleMediationAdTypeListViewController.swift */,
+ );
+ path = NavigationViewController;
+ sourceTree = "";
+ };
+ 0E82E4CD245CC33500EC19E1 /* SimpleCSR */ = {
+ isa = PBXGroup;
+ children = (
+ 0E82E4E2245CC38000EC19E1 /* SupportingFile */,
+ 0EFC4C97245CC28C008FE3C6 /* CSRViewController */,
+ );
+ path = SimpleCSR;
+ sourceTree = "";
+ };
+ 0E82E4E2245CC38000EC19E1 /* SupportingFile */ = {
+ isa = PBXGroup;
+ children = (
+ 0E82E4D7245CC33600EC19E1 /* Assets.xcassets */,
+ 0E82E4DC245CC33600EC19E1 /* Info.plist */,
+ 0E82E4D9245CC33600EC19E1 /* LaunchScreen.storyboard */,
+ 0E82E4D4245CC33500EC19E1 /* Main.storyboard */,
+ 0E82E4CE245CC33500EC19E1 /* AppDelegate.swift */,
+ 0E82E4D2245CC33500EC19E1 /* SimpleCSRAdTypeListViewController.swift */,
+ 0E82E4E7245CC74E00EC19E1 /* SimpleCSR-Bridging-Header.h */,
+ 0E82E502245CD27C00EC19E1 /* csr */,
+ );
+ path = SupportingFile;
+ sourceTree = "";
+ };
+ 0E82E4EF245CCA5600EC19E1 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 0E82E4F4245CCA5600EC19E1 /* AppNexusSDK.framework */,
+ 0E82E4F6245CCA5600EC19E1 /* AppNexusNativeSDK.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 0E82E502245CD27C00EC19E1 /* csr */ = {
+ isa = PBXGroup;
+ children = (
+ 0E82E503245CD27C00EC19E1 /* Facebook */,
+ );
+ name = csr;
+ path = ../../../../csr;
+ sourceTree = "";
+ };
+ 0E82E503245CD27C00EC19E1 /* Facebook */ = {
+ isa = PBXGroup;
+ children = (
+ 0E82E504245CD27C00EC19E1 /* ANAdAdapterCSRNativeBannerFacebook.m */,
+ 0E82E505245CD27C00EC19E1 /* ANFBSettings.m */,
+ 0E82E506245CD27C00EC19E1 /* ANAdAdapterCSRNativeBannerFacebook.h */,
+ 0E82E507245CD27C00EC19E1 /* ANFBSettings.h */,
+ );
+ path = Facebook;
+ sourceTree = "";
+ };
+ 0EE0D03723FD6C8E00D0C060 /* SmartAd */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D05923FD72A100D0C060 /* SmartAdBannerAdViewController.swift */,
+ 0EE0D06923FD7C1300D0C060 /* SmartAdBannerAd.storyboard */,
+ 0EE0D05A23FD72A200D0C060 /* SmartAdInterstitialAdViewController.swift */,
+ 0EE0D06823FD7C1300D0C060 /* SmartAdInterstitialAd.storyboard */,
+ );
+ path = SmartAd;
+ sourceTree = "";
+ };
+ 0EE0D03923FD6C8E00D0C060 /* Admob */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D04923FD723800D0C060 /* AdmobDFPBannerAdViewController.swift */,
+ 0EE0D06323FD764800D0C060 /* AdmobDFPBannerAd.storyboard */,
+ 0EE0D04B23FD728200D0C060 /* AdmobDFPInterstitialAdViewController.swift */,
+ 0EE0D06123FD764800D0C060 /* AdmobDFPInterstitialAd.storyboard */,
+ 0EE0D06223FD764800D0C060 /* AdMobDFPNativeViewController.swift */,
+ 0EE0D06023FD764800D0C060 /* AdMobDFPNativeAd.storyboard */,
+ 0EE0D0D323FD7ECE00D0C060 /* UnifiedNativeAdView.xib */,
+ );
+ path = Admob;
+ sourceTree = "";
+ };
+ 0EE0D03A23FD6C8E00D0C060 /* Facebook */ = {
+ isa = PBXGroup;
+ children = (
+ FCC64CAE25A739DE006E5A54 /* FacebookNative.storyboard */,
+ FCC64CB125A739DE006E5A54 /* FacebookNativeViewController.swift */,
+ 0E5670A0240D04BB0006B158 /* FacebookBannerAd.storyboard */,
+ 0EE0D04E23FD728A00D0C060 /* FacebookBannerAdViewController.swift */,
+ 0E5670A1240D04BB0006B158 /* FacebookInterstitialAd.storyboard */,
+ 0EE0D04D23FD728A00D0C060 /* FacebookInterstitialAdViewController.swift */,
+ );
+ path = Facebook;
+ sourceTree = "";
+ };
+ 0EE0D03C23FD6CB400D0C060 /* MediationViewController */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D03923FD6C8E00D0C060 /* Admob */,
+ 0EE0D03A23FD6C8E00D0C060 /* Facebook */,
+ 0EE0D03723FD6C8E00D0C060 /* SmartAd */,
+ 0EE0D03D23FD6CE200D0C060 /* VideoAd */,
+ );
+ path = MediationViewController;
+ sourceTree = "";
+ };
+ 0EE0D03D23FD6CE200D0C060 /* VideoAd */ = {
+ isa = PBXGroup;
+ children = (
+ 0E5B043D23BF4EED00DEBACE /* VideoAdViewController.swift */,
+ 0EE0D03E23FD6D1D00D0C060 /* VideoAd.storyboard */,
+ );
+ path = VideoAd;
+ sourceTree = "";
+ };
+ 0EE0D04123FD6EB300D0C060 /* SupportingFiles */ = {
+ isa = PBXGroup;
+ children = (
+ 0E246167240E7B57004B9BC4 /* SimpleMediation-Bridging-Header.h */,
+ 0EE0D07123FD7E0100D0C060 /* mediatedviews */,
+ 0E5660E923BE39AF0088EB36 /* AppDelegate.swift */,
+ 0EE0D04623FD6EEC00D0C060 /* LaunchScreen.storyboard */,
+ 0EE0D04323FD6EB300D0C060 /* Toast.swift */,
+ );
+ path = SupportingFiles;
+ sourceTree = "";
+ };
+ 0EE0D07123FD7E0100D0C060 /* mediatedviews */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D09123FD7E0100D0C060 /* SmartAd */,
+ 0EE0D09823FD7E0100D0C060 /* GoogleAdMob */,
+ 0EE0D0A523FD7E0100D0C060 /* Facebook */,
+ );
+ name = mediatedviews;
+ path = ../../../../mediation/mediatedviews;
+ sourceTree = "";
+ };
+ 0EE0D09123FD7E0100D0C060 /* SmartAd */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D09223FD7E0100D0C060 /* ANAdAdapterBannerSmartAd.m */,
+ 0EE0D09323FD7E0100D0C060 /* ANAdAdapterSmartAdBase.m */,
+ 0EE0D09423FD7E0100D0C060 /* ANAdAdapterInterstitialSmartAd.h */,
+ 0EE0D09523FD7E0100D0C060 /* ANAdAdapterSmartAdBase.h */,
+ 0EE0D09623FD7E0100D0C060 /* ANAdAdapterBannerSmartAd.h */,
+ 0EE0D09723FD7E0100D0C060 /* ANAdAdapterInterstitialSmartAd.m */,
+ );
+ path = SmartAd;
+ sourceTree = "";
+ };
+ 0EE0D09823FD7E0100D0C060 /* GoogleAdMob */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D09923FD7E0100D0C060 /* ANAdAdapterBannerAdMob.h */,
+ 0EE0D09A23FD7E0100D0C060 /* ANAdAdapterInterstitialDFP.m */,
+ 0EE0D09B23FD7E0100D0C060 /* ANAdAdapterInterstitialAdMob.h */,
+ 0EE0D09C23FD7E0100D0C060 /* ANAdAdapterNativeAdMob.m */,
+ 0EE0D09D23FD7E0100D0C060 /* ANAdAdapterBannerDFP.m */,
+ 0EE0D09E23FD7E0100D0C060 /* ANAdAdapterBaseDFP.m */,
+ 0EE0D09F23FD7E0100D0C060 /* ANAdAdapterBannerAdMob.m */,
+ 0EE0D0A023FD7E0100D0C060 /* ANAdAdapterInterstitialAdMob.m */,
+ 0EE0D0A123FD7E0100D0C060 /* ANAdAdapterInterstitialDFP.h */,
+ 0EE0D0A223FD7E0100D0C060 /* ANAdAdapterNativeAdMob.h */,
+ 0EE0D0A323FD7E0100D0C060 /* ANAdAdapterBaseDFP.h */,
+ 0EE0D0A423FD7E0100D0C060 /* ANAdAdapterBannerDFP.h */,
+ );
+ path = GoogleAdMob;
+ sourceTree = "";
+ };
+ 0EE0D0A523FD7E0100D0C060 /* Facebook */ = {
+ isa = PBXGroup;
+ children = (
+ 0EE0D0A623FD7E0100D0C060 /* ANAdAdapterInterstitialFacebook.m */,
+ 0EE0D0A723FD7E0100D0C060 /* ANAdAdapterBannerFacebook.h */,
+ 0EE0D0A823FD7E0100D0C060 /* ANAdAdapterNativeFacebook.m */,
+ 0EE0D0A923FD7E0100D0C060 /* ANAdAdapterInterstitialFacebook.h */,
+ 0EE0D0AA23FD7E0100D0C060 /* ANAdAdapterBannerFacebook.m */,
+ 0EE0D0AB23FD7E0100D0C060 /* ANAdAdapterNativeFacebook.h */,
+ );
+ path = Facebook;
+ sourceTree = "";
+ };
+ 0EFC4C97245CC28C008FE3C6 /* CSRViewController */ = {
+ isa = PBXGroup;
+ children = (
+ 0EFC4C9A245CC29B008FE3C6 /* Facebook */,
+ );
+ path = CSRViewController;
+ sourceTree = "";
+ };
+ 0EFC4C9A245CC29B008FE3C6 /* Facebook */ = {
+ isa = PBXGroup;
+ children = (
+ 0E56709F240D04BB0006B158 /* FacebookCSRNativeBanner.storyboard */,
+ 0E5B045023BF652C00DEBACE /* FacebookCSRNativeBanner.swift */,
+ );
+ path = Facebook;
+ sourceTree = "";
+ };
+ D727BB3B00EB1882B9FF6E82 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 92D9B61421003C0822F05D3F /* Pods-SimpleCSR.debug.xcconfig */,
+ F8136949A8662F8B5D433773 /* Pods-SimpleCSR.release.xcconfig */,
+ 941E857F252A95374E5394AF /* Pods-SimpleMediation.debug.xcconfig */,
+ 7E9D464632CE623986E47C03 /* Pods-SimpleMediation.release.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ FCC64C9125A7353F006E5A54 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 2E25579F2531BE4E0FECD662 /* libPods-SimpleCSR.a */,
+ DE667F379478A83D548F9F0D /* libPods-SimpleMediation.a */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 0E5660E523BE39AF0088EB36 /* SimpleMediation */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 0E5660FA23BE39B10088EB36 /* Build configuration list for PBXNativeTarget "SimpleMediation" */;
+ buildPhases = (
+ E4427E3807B201AD8D491461 /* [CP] Check Pods Manifest.lock */,
+ 0E5660E223BE39AF0088EB36 /* Sources */,
+ 0E5660E323BE39AF0088EB36 /* Frameworks */,
+ 0E5660E423BE39AF0088EB36 /* Resources */,
+ 0E56610923BE3A530088EB36 /* Embed Frameworks */,
+ 52AAF64888926C19958E7F92 /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SimpleMediation;
+ productName = SimpleMediation;
+ productReference = 0E5660E623BE39AF0088EB36 /* SimpleMediation.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 0E82E4CB245CC33500EC19E1 /* SimpleCSR */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 0E82E4DD245CC33600EC19E1 /* Build configuration list for PBXNativeTarget "SimpleCSR" */;
+ buildPhases = (
+ 21D4B301EAB5EB374171B026 /* [CP] Check Pods Manifest.lock */,
+ 0E82E4C8245CC33500EC19E1 /* Sources */,
+ 0E82E4C9245CC33500EC19E1 /* Frameworks */,
+ 0E82E4CA245CC33500EC19E1 /* Resources */,
+ FCC64C9825A7354D006E5A54 /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SimpleCSR;
+ productName = SimpleCSR;
+ productReference = 0E82E4CC245CC33500EC19E1 /* SimpleCSR.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 0E5660DE23BE39AF0088EB36 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1140;
+ LastUpgradeCheck = 1130;
+ ORGANIZATIONNAME = Xandr;
+ TargetAttributes = {
+ 0E5660E523BE39AF0088EB36 = {
+ CreatedOnToolsVersion = 11.3;
+ };
+ 0E82E4CB245CC33500EC19E1 = {
+ CreatedOnToolsVersion = 11.4;
+ };
+ };
+ };
+ buildConfigurationList = 0E5660E123BE39AF0088EB36 /* Build configuration list for PBXProject "SimpleMediation" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 0E5660DD23BE39AF0088EB36;
+ productRefGroup = 0E5660E723BE39AF0088EB36 /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = 0E82E4EF245CCA5600EC19E1 /* Products */;
+ ProjectRef = 0E82E4EE245CCA5600EC19E1 /* AppNexusSDK.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 0E5660E523BE39AF0088EB36 /* SimpleMediation */,
+ 0E82E4CB245CC33500EC19E1 /* SimpleCSR */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ 0E82E4F4245CCA5600EC19E1 /* AppNexusSDK.framework */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.framework;
+ path = AppNexusSDK.framework;
+ remoteRef = 0E82E4F3245CCA5600EC19E1 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 0E82E4F6245CCA5600EC19E1 /* AppNexusNativeSDK.framework */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.framework;
+ path = AppNexusNativeSDK.framework;
+ remoteRef = 0E82E4F5245CCA5600EC19E1 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 0E5660E423BE39AF0088EB36 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0EE0D06B23FD7C1300D0C060 /* SmartAdBannerAd.storyboard in Resources */,
+ 0EE0D04823FD6EEC00D0C060 /* LaunchScreen.storyboard in Resources */,
+ 0EE0D06723FD764800D0C060 /* AdmobDFPBannerAd.storyboard in Resources */,
+ 0EE0D06A23FD7C1300D0C060 /* SmartAdInterstitialAd.storyboard in Resources */,
+ 0EE0D0D423FD7ECE00D0C060 /* UnifiedNativeAdView.xib in Resources */,
+ 0EE0D04023FD6D1D00D0C060 /* VideoAd.storyboard in Resources */,
+ 0EE0D06423FD764800D0C060 /* AdMobDFPNativeAd.storyboard in Resources */,
+ 0EE0D06523FD764800D0C060 /* AdmobDFPInterstitialAd.storyboard in Resources */,
+ 0E5670A4240D04BB0006B158 /* FacebookInterstitialAd.storyboard in Resources */,
+ 0E5670A3240D04BB0006B158 /* FacebookBannerAd.storyboard in Resources */,
+ 0E5660F323BE39B10088EB36 /* Assets.xcassets in Resources */,
+ FCC64CB225A739DE006E5A54 /* FacebookNative.storyboard in Resources */,
+ 0E5660F123BE39AF0088EB36 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 0E82E4CA245CC33500EC19E1 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0E82E4DB245CC33600EC19E1 /* LaunchScreen.storyboard in Resources */,
+ 0E82E4E0245CC34D00EC19E1 /* FacebookCSRNativeBanner.storyboard in Resources */,
+ 0E82E4D8245CC33600EC19E1 /* Assets.xcassets in Resources */,
+ 0E82E4D6245CC33500EC19E1 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 21D4B301EAB5EB374171B026 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-SimpleCSR-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 52AAF64888926C19958E7F92 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-SimpleMediation/Pods-SimpleMediation-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-SimpleMediation/Pods-SimpleMediation-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SimpleMediation/Pods-SimpleMediation-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ E4427E3807B201AD8D491461 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-SimpleMediation-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 0E5660E223BE39AF0088EB36 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0EE0D0C723FD7E0100D0C060 /* ANAdAdapterNativeAdMob.m in Sources */,
+ FCC64CB325A739DE006E5A54 /* FacebookNativeViewController.swift in Sources */,
+ 0EE0D0CA23FD7E0100D0C060 /* ANAdAdapterBannerAdMob.m in Sources */,
+ 0EE0D05C23FD72A200D0C060 /* SmartAdInterstitialAdViewController.swift in Sources */,
+ 0EE0D0C623FD7E0100D0C060 /* ANAdAdapterInterstitialDFP.m in Sources */,
+ 0EE0D0C323FD7E0100D0C060 /* ANAdAdapterBannerSmartAd.m in Sources */,
+ 0EE0D0CB23FD7E0100D0C060 /* ANAdAdapterInterstitialAdMob.m in Sources */,
+ 0EE0D0C523FD7E0100D0C060 /* ANAdAdapterInterstitialSmartAd.m in Sources */,
+ 0EE0D0CC23FD7E0100D0C060 /* ANAdAdapterInterstitialFacebook.m in Sources */,
+ 0E5B043E23BF4EED00DEBACE /* VideoAdViewController.swift in Sources */,
+ 0EE0D0C423FD7E0100D0C060 /* ANAdAdapterSmartAdBase.m in Sources */,
+ 0EE0D05023FD728A00D0C060 /* FacebookBannerAdViewController.swift in Sources */,
+ 0EE0D06623FD764800D0C060 /* AdMobDFPNativeViewController.swift in Sources */,
+ 0EE0D05B23FD72A200D0C060 /* SmartAdBannerAdViewController.swift in Sources */,
+ 0EE0D04F23FD728A00D0C060 /* FacebookInterstitialAdViewController.swift in Sources */,
+ 0EE0D0CD23FD7E0100D0C060 /* ANAdAdapterNativeFacebook.m in Sources */,
+ 0E5B044023BF618800DEBACE /* SimpleMediationAdTypeListViewController.swift in Sources */,
+ 0EE0D04523FD6EB300D0C060 /* Toast.swift in Sources */,
+ 0EE0D0C923FD7E0100D0C060 /* ANAdAdapterBaseDFP.m in Sources */,
+ 0EE0D0C823FD7E0100D0C060 /* ANAdAdapterBannerDFP.m in Sources */,
+ 0E5660EA23BE39AF0088EB36 /* AppDelegate.swift in Sources */,
+ 0EE0D0CE23FD7E0100D0C060 /* ANAdAdapterBannerFacebook.m in Sources */,
+ 0EE0D04C23FD728200D0C060 /* AdmobDFPInterstitialAdViewController.swift in Sources */,
+ 0EE0D04A23FD723800D0C060 /* AdmobDFPBannerAdViewController.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 0E82E4C8245CC33500EC19E1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0E82E4D3245CC33500EC19E1 /* SimpleCSRAdTypeListViewController.swift in Sources */,
+ 0E82E508245CD27C00EC19E1 /* ANAdAdapterCSRNativeBannerFacebook.m in Sources */,
+ 0E82E509245CD27C00EC19E1 /* ANFBSettings.m in Sources */,
+ 0E82E4E1245CC34D00EC19E1 /* FacebookCSRNativeBanner.swift in Sources */,
+ 0E82E4E4245CC6B600EC19E1 /* Toast.swift in Sources */,
+ 0E82E4CF245CC33500EC19E1 /* AppDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 0E5660EF23BE39AF0088EB36 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 0E5660F023BE39AF0088EB36 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 0E82E4D4245CC33500EC19E1 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 0E82E4D5245CC33500EC19E1 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 0E82E4D9245CC33600EC19E1 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 0E82E4DA245CC33600EC19E1 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+ 0EE0D03E23FD6D1D00D0C060 /* VideoAd.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 0EE0D03F23FD6D1D00D0C060 /* Base */,
+ );
+ name = VideoAd.storyboard;
+ sourceTree = "";
+ };
+ 0EE0D04623FD6EEC00D0C060 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 0EE0D04723FD6EEC00D0C060 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 0E5660F823BE39B10088EB36 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_BITCODE = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 0E5660F923BE39B10088EB36 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_BITCODE = NO;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 0E5660FB23BE39B10088EB36 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 941E857F252A95374E5394AF /* Pods-SimpleMediation.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ DEVELOPMENT_TEAM = 9TBTYSQH6V;
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/SimpleMediation/SupportingFiles/mediatedsdk\"/**",
+ "\"$(SRCROOT)/SimpleMediation/SupportingFiles/mediatedsdk/FacebookSDK\"/**",
+ );
+ INFOPLIST_FILE = SimpleMediation/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.xandr.SimpleMediation;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OBJC_BRIDGING_HEADER = "SimpleMediation/SupportingFiles/SimpleMediation-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 0E5660FC23BE39B10088EB36 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7E9D464632CE623986E47C03 /* Pods-SimpleMediation.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ DEVELOPMENT_TEAM = 9TBTYSQH6V;
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/SimpleMediation/SupportingFiles/mediatedsdk\"/**",
+ "\"$(SRCROOT)/SimpleMediation/SupportingFiles/mediatedsdk/FacebookSDK\"/**",
+ );
+ INFOPLIST_FILE = SimpleMediation/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.xandr.SimpleMediation;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OBJC_BRIDGING_HEADER = "SimpleMediation/SupportingFiles/SimpleMediation-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 0E82E4DE245CC33600EC19E1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 92D9B61421003C0822F05D3F /* Pods-SimpleCSR.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = HR94J6TSB3;
+ INFOPLIST_FILE = SimpleCSR/SupportingFile/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xandr.SimpleCSR;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "SimpleCSR/SupportingFile/SimpleCSR-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 0E82E4DF245CC33600EC19E1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = F8136949A8662F8B5D433773 /* Pods-SimpleCSR.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = HR94J6TSB3;
+ INFOPLIST_FILE = SimpleCSR/SupportingFile/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xandr.SimpleCSR;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "SimpleCSR/SupportingFile/SimpleCSR-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 0E5660E123BE39AF0088EB36 /* Build configuration list for PBXProject "SimpleMediation" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 0E5660F823BE39B10088EB36 /* Debug */,
+ 0E5660F923BE39B10088EB36 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 0E5660FA23BE39B10088EB36 /* Build configuration list for PBXNativeTarget "SimpleMediation" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 0E5660FB23BE39B10088EB36 /* Debug */,
+ 0E5660FC23BE39B10088EB36 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 0E82E4DD245CC33600EC19E1 /* Build configuration list for PBXNativeTarget "SimpleCSR" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 0E82E4DE245CC33600EC19E1 /* Debug */,
+ 0E82E4DF245CC33600EC19E1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 0E5660DE23BE39AF0088EB36 /* Project object */;
+}
diff --git a/examples/SimpleMediation/SimpleMediation.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/SimpleMediation/SimpleMediation.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..97c70a06b
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/SimpleMediation/SimpleMediation/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d8db8d65f
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,98 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "29x29",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "29x29",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "40x40",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "40x40",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "60x60",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "60x60",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "29x29",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "29x29",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "40x40",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "40x40",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "76x76",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "76x76",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "83.5x83.5",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ios-marketing",
+ "size" : "1024x1024",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/examples/SimpleMediation/SimpleMediation/Assets.xcassets/Contents.json b/examples/SimpleMediation/SimpleMediation/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..da4a164c9
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/examples/SimpleMediation/SimpleMediation/Base.lproj/LaunchScreen.storyboard b/examples/SimpleMediation/SimpleMediation/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 000000000..865e9329f
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/Base.lproj/VideoAd.storyboard b/examples/SimpleMediation/SimpleMediation/Base.lproj/VideoAd.storyboard
new file mode 100644
index 000000000..9bc09ba4b
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/Base.lproj/VideoAd.storyboard
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/Info.plist b/examples/SimpleMediation/SimpleMediation/Info.plist
new file mode 100644
index 000000000..72f73ac71
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ GADIsAdManagerApp
+
+ LSApplicationQueriesSchemes
+
+ tel
+ appnexuspb
+
+ LSRequiresIPhoneOS
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdMobDFPNativeAd.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdMobDFPNativeAd.storyboard
new file mode 100644
index 000000000..52f4c23c9
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdMobDFPNativeAd.storyboard
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdMobDFPNativeViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdMobDFPNativeViewController.swift
new file mode 100644
index 000000000..1a63b9338
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdMobDFPNativeViewController.swift
@@ -0,0 +1,88 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+import GoogleMobileAds
+class AdMobDFPNativeViewController: UIViewController , ANNativeAdRequestDelegate , ANNativeAdDelegate {
+
+ var gadNativeAdView: GADUnifiedNativeAdView?
+ var nativeAdRequest: ANNativeAdRequest?
+ var nativeAdResponse: ANNativeAdResponse?
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+
+ nativeAdRequest = ANNativeAdRequest()
+ nativeAdRequest!.placementId = "18144598"
+ nativeAdRequest!.shouldLoadIconImage = true
+ nativeAdRequest!.shouldLoadMainImage = true
+ nativeAdRequest!.delegate = self
+ nativeAdRequest!.loadAd()
+ Toast.show(message: "Loading Ad...!! Please wait", controller: self)
+
+ }
+
+ // MARK: - ANNativeAdRequestDelegate & ANNativeAdDelegate
+
+ func adRequest(_ request: ANNativeAdRequest, didReceive response: ANNativeAdResponse) {
+ self.nativeAdResponse = response
+ self.nativeAdResponse?.delegate = self
+ self.nativeAdResponse?.clickThroughAction = ANClickThroughAction.openSDKBrowser
+ createGADNativeAdView()
+ populateGADUnifiedNativeViewWithResponse()
+ Toast.show(message:"Ad did receive ad", controller: self)
+ }
+ func createGADNativeAdView() {
+ let adNib = UINib(nibName: "UnifiedNativeAdView", bundle: Bundle(for: type(of: self)))
+ let array = adNib.instantiate(withOwner: self, options: nil)
+ gadNativeAdView = (array.first as! GADUnifiedNativeAdView)
+ }
+
+ func populateGADUnifiedNativeViewWithResponse() {
+ let nativeAdView = gadNativeAdView
+ (nativeAdView?.headlineView as? UILabel)?.text = self.nativeAdResponse?.title
+
+ (nativeAdView?.bodyView as? UILabel)?.text = self.nativeAdResponse?.body
+
+
+ (nativeAdView?.callToActionView as? UIButton)?.setTitle(self.nativeAdResponse?.callToAction, for: .normal)
+
+ (nativeAdView?.iconView as? UIImageView)?.image = self.nativeAdResponse?.iconImage
+
+ // Main Image is automatically added by GoogleSDK in the MediaView
+
+ (nativeAdView?.advertiserView as? UILabel)?.text = self.nativeAdResponse?.sponsoredBy
+
+
+ self.view.addSubview(self.gadNativeAdView!)
+
+ do {
+ let rvc = (UIApplication.shared.keyWindow?.rootViewController)!
+
+ try nativeAdResponse!.registerView(forTracking: self.gadNativeAdView!, withRootViewController: rvc, clickableViews: [(nativeAdView?.callToActionView) as Any])
+ } catch {
+ Toast.show(message: "Failed to registerView for Tracking", controller: self)
+ }
+ }
+
+ func adRequest(_ request: ANNativeAdRequest, didFailToLoadWithError error: Error, with adResponseInfo: ANAdResponseInfo?) {
+ Toast.show(message: "ad requestFailedWithError \(error)", controller: self)
+ }
+
+}
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPBannerAd.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPBannerAd.storyboard
new file mode 100644
index 000000000..ecf376eff
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPBannerAd.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPBannerAdViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPBannerAdViewController.swift
new file mode 100644
index 000000000..71545b183
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPBannerAdViewController.swift
@@ -0,0 +1,66 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+
+class AdmobDFPBannerAdViewController: UIViewController , ANBannerAdViewDelegate{
+ var banner: ANBannerAdView?
+
+ let kPlacementId = "18144580"
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+
+ let adWidth: Int = 320
+ let adHeight: Int = 50
+
+ // We want to center our ad on the screen.
+ let screenRect: CGRect = UIScreen.main.bounds
+ let originX: CGFloat = (screenRect.size.width / 2) - CGFloat((adWidth / 2))
+ let originY: CGFloat = (screenRect.size.height / 2) - CGFloat((adHeight / 2))
+ // Needed for when we create our ad view.
+
+ let rect = CGRect(origin: CGPoint(x: originX,y :originY), size: CGSize(width: adWidth, height: adHeight))
+
+ let size = CGSize(width: adWidth, height: adHeight)
+
+ // Make a banner ad view.
+ let banner = ANBannerAdView(frame: rect, placementId: kPlacementId, adSize: size)
+ banner.rootViewController = self
+ banner.delegate = self
+ banner.clickThroughAction = ANClickThroughAction.openSDKBrowser
+
+ // Since this example is for testing, we'll turn on PSAs and verbose logging.
+ banner.shouldServePublicServiceAnnouncements = false
+ // Load an ad.
+ banner.loadAd()
+ view.addSubview(banner)
+
+ Toast.show(message: "Loading Ad...!! Please wait", controller: self)
+
+ }
+
+ // MARK: - ANBannerAdViewDelegate
+ func adDidReceiveAd(_ ad: Any) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ }
+
+ func ad(_ ad: Any, requestFailedWithError error: Error) {
+ Toast.show(message: "adFailed", controller: self)
+ }
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPInterstitialAd.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPInterstitialAd.storyboard
new file mode 100644
index 000000000..b91634c21
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPInterstitialAd.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPInterstitialAdViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPInterstitialAdViewController.swift
new file mode 100644
index 000000000..bd3558d76
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/AdmobDFPInterstitialAdViewController.swift
@@ -0,0 +1,45 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+
+class AdmobDFPInterstitialAdViewController: UIViewController , ANInterstitialAdDelegate {
+
+ var interstitialAd: ANInterstitialAd?
+ let kPlacementId = "18144585"
+
+
+ override func viewDidLoad() {
+
+ super.viewDidLoad()
+ interstitialAd = ANInterstitialAd(placementId: kPlacementId)
+ interstitialAd!.delegate = self
+ interstitialAd!.clickThroughAction = ANClickThroughAction.openSDKBrowser
+ interstitialAd!.load()
+
+ Toast.show(message: "Loading Ad...!! Please wait", controller: self)
+ }
+
+ // MARK: - ANInterstitialAdDelegate
+ func adDidReceiveAd(_ ad: Any) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ interstitialAd!.display(from: self)
+ }
+
+ func ad(_ ad: Any, requestFailedWithError error: Error) {
+ Toast.show(message: "adFailed", controller: self)
+ }
+}
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/UnifiedNativeAdView.xib b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/UnifiedNativeAdView.xib
new file mode 100644
index 000000000..e917fe323
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Admob/UnifiedNativeAdView.xib
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookBannerAd.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookBannerAd.storyboard
new file mode 100644
index 000000000..0a8c941d3
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookBannerAd.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookBannerAdViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookBannerAdViewController.swift
new file mode 100644
index 000000000..881e5c17b
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookBannerAdViewController.swift
@@ -0,0 +1,68 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+
+class FacebookBannerAdViewController: UIViewController , ANBannerAdViewDelegate{
+ var banner: ANBannerAdView?
+
+ let kPlacementId = "18596931"
+
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+
+ let adWidth: Int = 320
+ let adHeight: Int = 50
+
+ // We want to center our ad on the screen.
+ let screenRect: CGRect = UIScreen.main.bounds
+ let originX: CGFloat = (screenRect.size.width / 2) - CGFloat((adWidth / 2))
+ let originY: CGFloat = (screenRect.size.height / 2) - CGFloat((adHeight / 2))
+ // Needed for when we create our ad view.
+
+ let rect = CGRect(origin: CGPoint(x: originX,y :originY), size: CGSize(width: adWidth, height: adHeight))
+
+ let size = CGSize(width: adWidth, height: adHeight)
+
+ // Make a banner ad view.
+ let banner = ANBannerAdView(frame: rect, placementId: kPlacementId, adSize: size)
+ banner.rootViewController = self
+ banner.delegate = self
+ banner.clickThroughAction = ANClickThroughAction.openSDKBrowser
+
+ // Since this example is for testing, we'll turn on PSAs and verbose logging.
+ banner.shouldServePublicServiceAnnouncements = false
+ // Load an ad.
+ banner.loadAd()
+ view.addSubview(banner)
+
+ Toast.show(message: "Loading Ad...!! Please wait", controller: self)
+
+ }
+
+
+
+ // MARK: - ANBannerAdViewDelegate
+ func adDidReceiveAd(_ ad: Any) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ }
+ func ad(_ ad: Any, requestFailedWithError error: Error) {
+ Toast.show(message: "adFailed", controller: self)
+ }
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookInterstitialAd.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookInterstitialAd.storyboard
new file mode 100644
index 000000000..bbce62328
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookInterstitialAd.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookInterstitialAdViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookInterstitialAdViewController.swift
new file mode 100644
index 000000000..e85558a45
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookInterstitialAdViewController.swift
@@ -0,0 +1,45 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+
+class FacebookInterstitialAdViewController: UIViewController , ANInterstitialAdDelegate {
+
+ var interstitialAd: ANInterstitialAd?
+ let kPlacementId = "18596931"
+
+
+ override func viewDidLoad() {
+
+ super.viewDidLoad()
+ interstitialAd = ANInterstitialAd(placementId: kPlacementId)
+ interstitialAd!.delegate = self
+ interstitialAd!.clickThroughAction = ANClickThroughAction.openSDKBrowser
+ interstitialAd!.load()
+
+ Toast.show(message: "Loading Ad...!! Please wait", controller: self)
+ }
+
+ // MARK: - ANInterstitialAdDelegate
+ func adDidReceiveAd(_ ad: Any) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ interstitialAd!.display(from: self)
+ }
+
+ func ad(_ ad: Any, requestFailedWithError error: Error) {
+ Toast.show(message: "adFailed", controller: self)
+ }
+}
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookNative.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookNative.storyboard
new file mode 100644
index 000000000..f3eceb07f
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookNative.storyboard
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookNativeViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookNativeViewController.swift
new file mode 100644
index 000000000..da4537c90
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/Facebook/FacebookNativeViewController.swift
@@ -0,0 +1,108 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+import FBAudienceNetwork
+class FacebookNativeViewController: UIViewController , ANNativeAdRequestDelegate , ANNativeAdDelegate {
+
+ @IBOutlet var adIconView: FBMediaView!
+ @IBOutlet var adCoverMediaView: FBMediaView!
+ @IBOutlet var adTitleLabel: UILabel!
+ @IBOutlet var adBodyLabel: UILabel!
+ @IBOutlet var adCallToActionButton: UIButton!
+ @IBOutlet var adSocialContextLabel: UILabel!
+ @IBOutlet var sponsoredLabel: UILabel!
+ @IBOutlet var adOptionsView: FBAdOptionsView!
+ @IBOutlet var adUIView: UIView!
+ var nativeAd: FBNativeAd?
+
+
+ var nativeAdRequest: ANNativeAdRequest?
+ var nativeAdResponse: ANNativeAdResponse?
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+
+ ANSDKSettings.sharedInstance().httpsEnabled = true
+
+ FBAdSettings.addTestDevice(FBAdSettings.testDeviceHash())
+
+ nativeAdRequest = ANNativeAdRequest()
+ nativeAdRequest!.placementId = "18596931"
+ nativeAdRequest!.shouldLoadIconImage = true
+ nativeAdRequest!.shouldLoadMainImage = true
+ nativeAdRequest!.delegate = self
+ nativeAdRequest!.loadAd()
+ }
+
+
+ func adRequest(_ request: ANNativeAdRequest, didReceive response: ANNativeAdResponse) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ adUIView.isHidden = false
+ self.nativeAdResponse = response
+ let nativeAd = response.customElements![kANNativeElementObject] as? FBNativeAd
+ facebookNativeAdDidLoad(nativeAd)
+ }
+
+ func facebookNativeAdDidLoad(_ nativeAd: FBNativeAd?) {
+
+ Toast.show(message: "Native ad was loaded, constructing native UI...", controller: self)
+
+ if (nativeAd != nil) {
+ nativeAd!.unregisterView()
+ }
+
+ // Render native ads onto UIView
+ adTitleLabel.text = nativeAd?.advertiserName
+ adBodyLabel.text = nativeAd?.bodyText
+ adSocialContextLabel.text = nativeAd?.socialContext
+ sponsoredLabel.text = nativeAd?.sponsoredTranslation
+
+ self.adCallToActionButton.titleLabel?.text = nativeAd?.callToAction
+ // set the frame of the adBodyLabel depending on whether to show to call to action button
+ let gapToBorder: CGFloat = 9.0
+ let gapToCTAButton: CGFloat = 8.0
+ var adBodyLabelFrame = adBodyLabel.frame
+ if !(nativeAd!.callToAction != nil) {
+ adBodyLabelFrame.size.width = adCoverMediaView.bounds.size.width - gapToBorder * 2
+ } else {
+ adBodyLabelFrame.size.width = adCoverMediaView.bounds.size.width - gapToCTAButton - gapToBorder - (adCoverMediaView.bounds.size.width - adCallToActionButton.frame.origin.x)
+ }
+ adBodyLabel.frame = adBodyLabelFrame
+ print("Register UIView for impression and click...")
+ // Specify the clickable areas. Views you were using to set ad view tags should be clickable.
+ let clickableViews = [
+ adIconView,
+ adTitleLabel,
+ adBodyLabel,
+ adSocialContextLabel,
+ adCallToActionButton,
+ adCoverMediaView
+ ]
+ do {
+ try nativeAdResponse!.registerView(forTracking: adUIView, withRootViewController: self, clickableViews: clickableViews as [Any])
+ } catch let registerError {
+ print(registerError)
+ }
+
+ }
+ func adRequest(_ request: ANNativeAdRequest, didFailToLoadWithError error: Error, with adResponseInfo: ANAdResponseInfo?) {
+ Toast.show(message: "ad requestFailedWithError \(error)", controller: self)
+ }
+
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdBannerAd.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdBannerAd.storyboard
new file mode 100644
index 000000000..2a4c3f281
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdBannerAd.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdBannerAdViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdBannerAdViewController.swift
new file mode 100644
index 000000000..ad45297e9
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdBannerAdViewController.swift
@@ -0,0 +1,68 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+
+class SmartAdBannerAdViewController: UIViewController , ANBannerAdViewDelegate{
+ var banner: ANBannerAdView?
+
+ let kPlacementId = "10263964"
+
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+
+ let adWidth: Int = 320
+ let adHeight: Int = 50
+
+ // We want to center our ad on the screen.
+ let screenRect: CGRect = UIScreen.main.bounds
+ let originX: CGFloat = (screenRect.size.width / 2) - CGFloat((adWidth / 2))
+ let originY: CGFloat = (screenRect.size.height / 2) - CGFloat((adHeight / 2))
+ // Needed for when we create our ad view.
+
+ let rect = CGRect(origin: CGPoint(x: originX,y :originY), size: CGSize(width: adWidth, height: adHeight))
+
+ let size = CGSize(width: adWidth, height: adHeight)
+
+ // Make a banner ad view.
+ let banner = ANBannerAdView(frame: rect, placementId: kPlacementId, adSize: size)
+ banner.rootViewController = self
+ banner.delegate = self
+ banner.clickThroughAction = ANClickThroughAction.openSDKBrowser
+
+ // Since this example is for testing, we'll turn on PSAs and verbose logging.
+ banner.shouldServePublicServiceAnnouncements = false
+ // Load an ad.
+ banner.loadAd()
+ view.addSubview(banner)
+
+ Toast.show(message: "Loading Ad...!! Please wait", controller: self)
+
+ }
+
+
+
+ // MARK: - ANBannerAdViewDelegate
+ func adDidReceiveAd(_ ad: Any) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ }
+ func ad(_ ad: Any, requestFailedWithError error: Error) {
+ Toast.show(message: "adFailed", controller: self)
+ }
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdInterstitialAd.storyboard b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdInterstitialAd.storyboard
new file mode 100644
index 000000000..f4fef123c
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdInterstitialAd.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdInterstitialAdViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdInterstitialAdViewController.swift
new file mode 100644
index 000000000..59cd5f48b
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/SmartAd/SmartAdInterstitialAdViewController.swift
@@ -0,0 +1,45 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+
+class SmartAdInterstitialAdViewController: UIViewController , ANInterstitialAdDelegate {
+
+ var interstitialAd: ANInterstitialAd?
+ let kPlacementId = "10263953"
+
+
+ override func viewDidLoad() {
+
+ super.viewDidLoad()
+ interstitialAd = ANInterstitialAd(placementId: kPlacementId)
+ interstitialAd!.delegate = self
+ interstitialAd!.clickThroughAction = ANClickThroughAction.openSDKBrowser
+ interstitialAd!.load()
+
+ Toast.show(message: "Loading Ad...!! Please wait", controller: self)
+ }
+
+ // MARK: - ANInterstitialAdDelegate
+ func adDidReceiveAd(_ ad: Any) {
+ Toast.show(message: "adDidReceiveAd", controller: self)
+ interstitialAd!.display(from: self)
+ }
+
+ func ad(_ ad: Any, requestFailedWithError error: Error) {
+ Toast.show(message: "adFailed", controller: self)
+ }
+}
diff --git a/examples/SimpleMediation/SimpleMediation/MediationViewController/VideoAd/VideoAdViewController.swift b/examples/SimpleMediation/SimpleMediation/MediationViewController/VideoAd/VideoAdViewController.swift
new file mode 100644
index 000000000..89e56c3e4
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/MediationViewController/VideoAd/VideoAdViewController.swift
@@ -0,0 +1,221 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+
+class VideoAdViewController: UIViewController , ANInstreamVideoAdLoadDelegate, ANInstreamVideoAdPlayDelegate {
+
+
+ var placementId = "14790206"
+
+
+ @IBOutlet weak var videoView: UIView!
+ @IBOutlet weak var logTextView: UITextView!
+ /// Frame for video view in portrait mode.
+ var portraitVideoViewFrame = CGRect.zero
+ /// Frame for video player in fullscreen mode.
+ var fullscreenVideoFrame = CGRect.zero
+ var videoAd: ANInstreamVideoAd?
+ var videoContentPlayer: AVPlayer?
+ @IBOutlet weak var playButton: UIButton!
+ var isvideoAdAvailable = false
+
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ ANSDKSettings.sharedInstance().httpsEnabled = true
+ playButton.layer.zPosition = CGFloat(MAXFLOAT)
+ isvideoAdAvailable = false
+ ANSDKSettings.sharedInstance().httpsEnabled = false
+ // Fix iPhone issue of log text starting in the middle of the UITextView
+ automaticallyAdjustsScrollViewInsets = false
+ portraitVideoViewFrame = videoView.frame
+
+
+ if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight {
+ viewDidEnterLandscape()
+ }
+
+ setupContentPlayer()
+ videoAd = ANInstreamVideoAd(placementId: placementId)
+ videoAd?.clickThroughAction = ANClickThroughAction.openSDKBrowser
+ videoAd?.load(with: self)
+
+ // Do any additional setup after loading the view.
+ }
+
+ @IBAction func playButton_Touch(_ sender: Any) {
+ playButton.isHidden = true
+ if isvideoAdAvailable == false {
+ videoContentPlayer!.play()
+ } else {
+ videoContentPlayer!.pause()
+ videoAd?.play(withContainer: videoView, with: self)
+ isvideoAdAvailable = false
+ }
+ }
+ override func didRotate(from interfaceOrientation: UIInterfaceOrientation) {
+ switch interfaceOrientation {
+ case .landscapeLeft, .landscapeRight:
+ viewDidEnterPortrait()
+ case .portrait, .portraitUpsideDown:
+ viewDidEnterLandscape()
+ case .unknown:
+ break
+ @unknown default:
+ break
+ }
+ }
+
+ func setupContentPlayer() {
+ let contentURL = URL(string: "https://acdn.adnxs.com/mobile/video_test/content/Scenario.mp4")
+ if let contentURL = contentURL {
+ videoContentPlayer = AVPlayer(url: contentURL)
+ }
+ if let contentURL = contentURL {
+ videoContentPlayer = AVPlayer(url: contentURL)
+ }
+ let playerLayer = AVPlayerLayer(player: videoContentPlayer)
+ playerLayer.frame = videoView.bounds
+ videoView.layer.addSublayer(playerLayer)
+ videoView.setNeedsLayout()
+ videoView.translatesAutoresizingMaskIntoConstraints = true
+ NotificationCenter.default.addObserver(self, selector: #selector(self.itemDidFinishPlaying(_:)), name: .AVPlayerItemDidPlayToEndTime, object: videoContentPlayer?.currentItem)
+ }
+
+ func viewDidEnterLandscape() {
+ let screenRect: CGRect = UIScreen.main.bounds
+ fullscreenVideoFrame = CGRect(x: 0, y: 0, width: screenRect.size.width, height: screenRect.size.height)
+ videoView.frame = fullscreenVideoFrame
+ }
+
+ func viewDidEnterPortrait() {
+ videoView.frame = portraitVideoViewFrame
+ }
+
+
+ override func viewDidDisappear(_ animated: Bool) {
+ super.viewWillDisappear(animated)
+ }
+
+ @objc func itemDidFinishPlaying(_ notification: Notification?) {
+ print("finished playing content")
+ //cleanup the player & start again
+ videoContentPlayer = nil
+ setupContentPlayer()
+ playButton.isHidden = false
+ isvideoAdAvailable = false
+ }
+
+ func getAdPlayElapsedTime() {
+ // To get AdPlayElapsedTime
+ let getAdPlayElapsedTime = videoAd!.getPlayElapsedTime()
+ logMessage("getAdPlayElapsedTime \(getAdPlayElapsedTime)")
+
+ }
+
+ // MARK: - ANInstreamVideoAdDelegate.
+ func adDidReceiveAd(_ ad: Any) {
+ // To get AdDuration
+ let getAdDuration = videoAd!.getDuration()
+ logMessage("getAdDuration \(getAdDuration)")
+
+ // To get CreativeURL
+ let getCreativeURL = videoAd!.getCreativeURL()
+ logMessage("getCreativeURL \(String(describing: getCreativeURL))")
+
+ // To get VastURL
+ let getVastURL = videoAd!.getVastURL()
+ logMessage("getVastURL \(String(describing: getVastURL))")
+
+ // To get VastXML
+ let getVastXML = videoAd!.getVastXML()
+ logMessage("getVastXML \(String(describing: getVastXML))")
+
+ // To get AdPlayElapsedTime
+ getAdPlayElapsedTime()
+ isvideoAdAvailable = true
+
+ logMessage("adDidReceiveAd")
+
+ }
+
+ func ad(_ ad: ANAdProtocol, requestFailedWithError error: Error) {
+
+ }
+ func ad(_ ad: ANAdProtocol?) throws {
+ isvideoAdAvailable = false
+ }
+
+ //----------------------------- -o-
+ func adCompletedFirstQuartile(_ ad: ANAdProtocol) {
+ getAdPlayElapsedTime()
+ }
+
+ func adCompletedMidQuartile(_ ad: ANAdProtocol) {
+ getAdPlayElapsedTime()
+
+ }
+ //----------------------------- -o-
+ func adPlayStarted(_ ad: ANAdProtocol) {
+ getAdPlayElapsedTime()
+
+ }
+
+ func adCompletedThirdQuartile(_ ad: ANAdProtocol) {
+ getAdPlayElapsedTime()
+ }
+
+
+ func adWasClicked(_ ad: ANAdProtocol) {
+
+ }
+
+ func adMute(_ ad: ANAdProtocol, withStatus muteStatus: Bool) {
+ if muteStatus == true {
+ logMessage("adMuteOn")
+ } else {
+ logMessage("adMuteOff")
+ }
+ }
+
+ func adDidComplete(_ ad: ANAdProtocol, with state: ANInstreamVideoPlaybackStateType) {
+ if state == ANInstreamVideoPlaybackStateType.skipped {
+ logMessage("adWasSkipped")
+ } else if state == ANInstreamVideoPlaybackStateType.error {
+ logMessage("adplaybackFailedWithError")
+ } else if state == ANInstreamVideoPlaybackStateType.completed {
+ logMessage("adPlayCompleted")
+ getAdPlayElapsedTime()
+ }
+ isvideoAdAvailable = false
+ videoContentPlayer!.play()
+
+ }
+
+
+ func logMessage(_ log: String?) {
+ let logString = "\(log ?? "")\n"
+ logTextView.text = logTextView.text + (logString)
+ if logTextView.text.count > 0 {
+ let bottom = NSRange(location: logTextView.text.count - 1, length: 1)
+ logTextView.scrollRangeToVisible(bottom)
+ }
+ }
+
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation/NavigationViewController/Base.lproj/Main.storyboard b/examples/SimpleMediation/SimpleMediation/NavigationViewController/Base.lproj/Main.storyboard
new file mode 100644
index 000000000..08c710bce
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/NavigationViewController/Base.lproj/Main.storyboard
@@ -0,0 +1,513 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SimpleMediation/SimpleMediation/NavigationViewController/SimpleMediationAdTypeListViewController.swift b/examples/SimpleMediation/SimpleMediation/NavigationViewController/SimpleMediationAdTypeListViewController.swift
new file mode 100644
index 000000000..5fc99b4ad
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/NavigationViewController/SimpleMediationAdTypeListViewController.swift
@@ -0,0 +1,27 @@
+/* Copyright 2020 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 Foundation
+import UIKit
+
+class SimpleMediationAdTypeListViewController: UITableViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation/SupportingFiles/AppDelegate.swift b/examples/SimpleMediation/SimpleMediation/SupportingFiles/AppDelegate.swift
new file mode 100644
index 000000000..b5edbb647
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/SupportingFiles/AppDelegate.swift
@@ -0,0 +1,31 @@
+/* Copyright 2020 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 UIKit
+import AppNexusSDK
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+ var window: UIWindow?
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+
+ return true
+ }
+}
+
diff --git a/examples/SimpleMediation/SimpleMediation/SupportingFiles/SimpleMediation-Bridging-Header.h b/examples/SimpleMediation/SimpleMediation/SupportingFiles/SimpleMediation-Bridging-Header.h
new file mode 100644
index 000000000..f38a2bff9
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/SupportingFiles/SimpleMediation-Bridging-Header.h
@@ -0,0 +1,15 @@
+/* Copyright 2020 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.
+*/
+
diff --git a/examples/SimpleMediation/SimpleMediation/SupportingFiles/Toast.swift b/examples/SimpleMediation/SimpleMediation/SupportingFiles/Toast.swift
new file mode 100644
index 000000000..ab86e0ddb
--- /dev/null
+++ b/examples/SimpleMediation/SimpleMediation/SupportingFiles/Toast.swift
@@ -0,0 +1,65 @@
+/* Copyright 2020 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 UIKit
+import Foundation
+
+class Toast {
+ static func show(message: String, controller: UIViewController) {
+ let toastView = UIView(frame: CGRect())
+ toastView.backgroundColor = UIColor.black.withAlphaComponent(0.6)
+ toastView.alpha = 0.0
+ toastView.layer.cornerRadius = 25;
+ toastView.clipsToBounds = true
+
+ let toastTitle = UILabel(frame: CGRect())
+ toastTitle.textColor = UIColor.white
+ toastTitle.textAlignment = .center;
+ toastTitle.font.withSize(12.0)
+ toastTitle.text = message
+ toastTitle.clipsToBounds = true
+ toastTitle.numberOfLines = 0
+
+ toastView.addSubview(toastTitle)
+ controller.view.addSubview(toastView)
+
+ toastTitle.translatesAutoresizingMaskIntoConstraints = false
+ toastView.translatesAutoresizingMaskIntoConstraints = false
+
+ let a1 = NSLayoutConstraint(item: toastTitle, attribute: .leading, relatedBy: .equal, toItem: toastView, attribute: .leading, multiplier: 1, constant: 15)
+ let a2 = NSLayoutConstraint(item: toastTitle, attribute: .trailing, relatedBy: .equal, toItem: toastView, attribute: .trailing, multiplier: 1, constant: -15)
+ let a3 = NSLayoutConstraint(item: toastTitle, attribute: .bottom, relatedBy: .equal, toItem: toastView, attribute: .bottom, multiplier: 1, constant: -15)
+ let a4 = NSLayoutConstraint(item: toastTitle, attribute: .top, relatedBy: .equal, toItem: toastView, attribute: .top, multiplier: 1, constant: 15)
+ toastView.addConstraints([a1, a2, a3, a4])
+
+ let c1 = NSLayoutConstraint(item: toastView, attribute: .leading, relatedBy: .equal, toItem: controller.view, attribute: .leading, multiplier: 1, constant: 65)
+ let c2 = NSLayoutConstraint(item: toastView, attribute: .trailing, relatedBy: .equal, toItem: controller.view, attribute: .trailing, multiplier: 1, constant: -65)
+ let c3 = NSLayoutConstraint(item: toastView, attribute: .bottom, relatedBy: .equal, toItem: controller.view, attribute: .bottom, multiplier: 1, constant: -75)
+ controller.view.addConstraints([c1, c2, c3])
+
+ UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseIn, animations: {
+ toastView.alpha = 1.0
+ }, completion: { _ in
+ UIView.animate(withDuration: 0.5, delay: 1.5, options: .curveEaseOut, animations: {
+ toastView.alpha = 0.0
+ }, completion: {_ in
+ toastView.removeFromSuperview()
+ })
+ })
+ }
+}
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerAdMob.m b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerAdMob.m
index ee30d6853..c6b2420dc 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerAdMob.m
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerAdMob.m
@@ -15,7 +15,6 @@
#import "ANAdAdapterBannerAdMob.h"
#import "ANAdAdapterBaseDFP.h"
-
@interface ANAdAdapterBannerAdMob ()
@property (nonatomic, readwrite, strong) GADBannerView *bannerView;
@end
@@ -56,20 +55,19 @@ - (void)requestBannerAdWithSize:(CGSize)size
UIApplication *application = [UIApplication sharedApplication];
BOOL orientationIsPortrait = UIInterfaceOrientationIsPortrait([application statusBarOrientation]);
if(orientationIsPortrait) {
- gadAdSize = kGADAdSizeSmartBannerPortrait;
+ gadAdSize = GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth(size.width);
} else {
- gadAdSize = kGADAdSizeSmartBannerLandscape;
+ gadAdSize = GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(size.height);
}
} else {
gadAdSize = GADAdSizeFromCGSize(size);
}
self.bannerView = [[GADBannerView alloc] initWithAdSize:gadAdSize];
- self.bannerView.adUnitID = idString;
-
- self.bannerView.rootViewController = rootViewController;
- self.bannerView.delegate = self;
- [self.bannerView loadRequest:[self createRequestFromTargetingParameters:targetingParameters]];
+ self.bannerView.adUnitID = idString;
+ self.bannerView.rootViewController = rootViewController;
+ self.bannerView.delegate = self;
+ [self.bannerView loadRequest:[self createRequestFromTargetingParameters:targetingParameters]];
}
- (GADRequest *)createRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters {
@@ -95,83 +93,34 @@ - (AdMobBannerServerSideParameters*) parseServerSide:(NSString*) serverSideParam
#pragma mark GADBannerViewDelegate
-- (void)adViewDidReceiveAd:(GADBannerView *)view
+- (void)bannerViewDidReceiveAd:(nonnull GADBannerView *)bannerView
{
ANLogDebug(@"AdMob banner did load");
- [self.delegate didLoadBannerAd:view];
+ [self.delegate didLoadBannerAd:bannerView];
}
-
-- (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error
+- (void)bannerView:(nonnull GADBannerView *)bannerView didFailToReceiveAdWithError:(nonnull NSError *)error
{
ANLogDebug(@"AdMob banner failed to load with error: %@", error);
- ANAdResponseCode *code = ANAdResponseCode.INTERNAL_ERROR;
-
- switch (error.code) {
- case kGADErrorInvalidRequest:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorNoFill:
- code = ANAdResponseCode.UNABLE_TO_FILL;
- break;
- case kGADErrorNetworkError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorServerError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorOSVersionTooLow:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorTimeout:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorAdAlreadyUsed:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationDataError:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorMediationAdapterError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationInvalidAdSize:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorInternalError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorInvalidArgument:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- default:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- }
-
- [self.delegate didFailToLoadAd:code];
+ [self.delegate didFailToLoadAd:[ANAdAdapterBaseDFP responseCodeFromRequestError:error]];
}
-- (void)adViewWillPresentScreen:(GADBannerView *)adView {
+- (void)bannerViewWillPresentScreen:(nonnull GADBannerView *)bannerView{
[self.delegate willPresentAd];
}
-- (void)adViewWillDismissScreen:(GADBannerView *)adView {
+- (void)bannerViewWillDismissScreen:(nonnull GADBannerView *)bannerView {
[self.delegate willCloseAd];
}
-- (void)adViewDidDismissScreen:(GADBannerView *)adView {
+- (void)bannerViewDidDismissScreen:(nonnull GADBannerView *)bannerView {
[self.delegate didCloseAd];
}
-- (void)adViewWillLeaveApplication:(GADBannerView *)adView {
- [self.delegate willLeaveApplication];
-}
-
- (void)dealloc
{
ANLogDebug(@"AdMob banner being destroyed");
- self.bannerView.delegate = nil;
- self.bannerView = nil;
+ self.bannerView.delegate = nil;
+ self.bannerView = nil;
}
@end
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerDFP.m b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerDFP.m
index 56eaaf420..cd3a601f8 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerDFP.m
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBannerDFP.m
@@ -45,8 +45,8 @@ @implementation DFPBannerServerSideParameters
@interface ANAdAdapterBannerDFP ()
-@property (nonatomic, readwrite, strong) DFPBannerView *dfpBanner;
-@property (nonatomic, readwrite, strong) DFPRequest *dfpRequest;
+@property (nonatomic, readwrite, strong) GAMBannerView *dfpBanner;
+@property (nonatomic, readwrite, strong) GAMRequest *dfpRequest;
@property (nonatomic, readwrite) BOOL secondPriceIsHigher;
@property (nonatomic, readwrite) BOOL secondPriceAvailable;
@property (nonatomic, retain) NSTimer *timer;
@@ -79,16 +79,14 @@ - (void)requestBannerAdWithSize:(CGSize)size
UIApplication *application = [UIApplication sharedApplication];
BOOL orientationIsPortrait = UIInterfaceOrientationIsPortrait([application statusBarOrientation]);
if(orientationIsPortrait) {
- gadAdSize = kGADAdSizeSmartBannerPortrait;
+ gadAdSize = GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth(size.width);
} else {
- gadAdSize = kGADAdSizeSmartBannerLandscape;
+ gadAdSize = GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(size.height);
}
} else {
gadAdSize = GADAdSizeFromCGSize(size);
}
-
- //
self.dfpRequest = [ANAdAdapterBaseDFP dfpRequestFromTargetingParameters:targetingParameters ];
self.secondPriceAvailable = NO;
if (ssparam.secondPrice) {
@@ -103,9 +101,7 @@ - (void)requestBannerAdWithSize:(CGSize)size
}
}
-
- //
- self.dfpBanner = [[DFPBannerView alloc] initWithAdSize:gadAdSize];
+ self.dfpBanner = [[GAMBannerView alloc] initWithAdSize:gadAdSize];
self.dfpBanner.adUnitID = idString;
self.dfpBanner.rootViewController = rootViewController;
self.dfpBanner.delegate = self;
@@ -154,8 +150,7 @@ -(void)adReceiveAd{
}
#pragma mark - GADBannerViewDelegate
-
-- (void)adViewDidReceiveAd:(DFPBannerView *)view
+- (void)bannerViewDidReceiveAd:(GAMBannerView *)bannerView
{
ANLogDebug(@"DFP banner did load");
if (!self.secondPriceAvailable) {
@@ -165,69 +160,29 @@ - (void)adViewDidReceiveAd:(DFPBannerView *)view
}
}
-- (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error
-{
+- (void)bannerView:(nonnull GADBannerView *)bannerView didFailToReceiveAdWithError:(nonnull NSError *)error{
ANLogDebug(@"DFP banner failed to load with error: %@", [error localizedDescription]);
- ANAdResponseCode *code = ANAdResponseCode.INTERNAL_ERROR;
-
- switch (error.code) {
- case kGADErrorInvalidRequest:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorNoFill:
- code = ANAdResponseCode.UNABLE_TO_FILL;
- break;
- case kGADErrorNetworkError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorServerError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorOSVersionTooLow:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorTimeout:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorAdAlreadyUsed:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationDataError:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorMediationAdapterError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationInvalidAdSize:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorInternalError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorInvalidArgument:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- default:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- }
[self.timer invalidate];
- [self.delegate didFailToLoadAd:code];
+ [self.delegate didFailToLoadAd:[ANAdAdapterBaseDFP responseCodeFromRequestError:error]];
+}
+
+- (void)bannerViewDidRecordImpression:(nonnull GADBannerView *)bannerView{
+ ANLogDebug(@"DFP banner impression recorded");
}
-- (void)adViewWillPresentScreen:(DFPBannerView *)adView {
+- (void)bannerViewWillPresentScreen:(GAMBannerView *)adView {
[self.delegate willPresentAd];
}
-- (void)adViewWillDismissScreen:(DFPBannerView *)adView {
+- (void)bannerViewWillDismissScreen:(nonnull GADBannerView *)bannerView {
[self.delegate willCloseAd];
}
-- (void)adViewDidDismissScreen:(DFPBannerView *)adView {
+- (void)bannerViewDidDismissScreen:(nonnull GADBannerView *)bannerView {
[self.delegate didCloseAd];
}
-- (void)adViewWillLeaveApplication:(DFPBannerView *)adView {
+- (void)adViewWillLeaveApplication:(GAMBannerView *)adView {
[self.delegate willLeaveApplication];
}
@@ -238,12 +193,9 @@ - (void)dealloc
self.dfpBanner = nil;
}
-
-
-
#pragma mark - GADAppEventDelegate
-- (void) adView: (DFPBannerView *)banner
+- (void) adView: (GAMBannerView *)banner
didReceiveAppEvent: (NSString *)name
withInfo: (NSString *)info
{
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.h b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.h
index 73c0f7a4c..e36848fc0 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.h
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.h
@@ -29,8 +29,7 @@
@interface ANAdAdapterBaseDFP : NSObject
+ (GADRequest *)googleAdRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters;
-+ (DFPRequest *)dfpRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters;
-
-+ (ANAdResponseCode *)responseCodeFromRequestError:(GADRequestError *)error;
++ (GAMRequest *)dfpRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters;
++ (ANAdResponseCode *)responseCodeFromRequestError:(NSError *)error;
@end
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.m b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.m
index fb7b5c492..078d4969d 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.m
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterBaseDFP.m
@@ -24,10 +24,10 @@ + (GADRequest *)googleAdRequestFromTargetingParameters:(ANTargetingParameters *)
return [[self class] completeAdRequest:request fromTargetingParameters:targetingParameters];
}
-+ (DFPRequest *)dfpRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters
++ (GAMRequest *)dfpRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters
{
- DFPRequest *dfpRequest = [DFPRequest request];
- return (DFPRequest *)[[self class] completeAdRequest:dfpRequest fromTargetingParameters:targetingParameters];
+ GAMRequest *dfpRequest = [GAMRequest request];
+ return (GAMRequest *)[[self class] completeAdRequest:dfpRequest fromTargetingParameters:targetingParameters];
}
+ (GADRequest *)completeAdRequest: (GADRequest *)gadRequest
@@ -67,44 +67,53 @@ + (GADRequest *)completeAdRequest: (GADRequest *)gadRequest
}
-+ (ANAdResponseCode *)responseCodeFromRequestError:(GADRequestError *)error {
++ (ANAdResponseCode *)responseCodeFromRequestError:(NSError *)error {
ANAdResponseCode *code = ANAdResponseCode.INTERNAL_ERROR;
switch (error.code) {
- case kGADErrorInvalidRequest:
+ case GADErrorInvalidRequest:
code = ANAdResponseCode.INVALID_REQUEST;
break;
- case kGADErrorNoFill:
+ case GADErrorNoFill:
code = ANAdResponseCode.UNABLE_TO_FILL;
break;
- case kGADErrorNetworkError:
+ case GADErrorNetworkError:
code = ANAdResponseCode.NETWORK_ERROR;
break;
- case kGADErrorServerError:
+ case GADErrorServerError:
code = ANAdResponseCode.NETWORK_ERROR;
break;
- case kGADErrorOSVersionTooLow:
+ case GADErrorOSVersionTooLow:
code = ANAdResponseCode.INTERNAL_ERROR;
break;
- case kGADErrorTimeout:
+ case GADErrorTimeout:
code = ANAdResponseCode.NETWORK_ERROR;
break;
- case kGADErrorAdAlreadyUsed:
+ case GADErrorAdAlreadyUsed:
code = ANAdResponseCode.INTERNAL_ERROR;
break;
- case kGADErrorMediationDataError:
+ case GADErrorMediationDataError:
code = ANAdResponseCode.INVALID_REQUEST;
break;
- case kGADErrorMediationAdapterError:
+ case GADErrorMediationAdapterError:
code = ANAdResponseCode.INTERNAL_ERROR;
break;
- case kGADErrorMediationInvalidAdSize:
+ case GADErrorMediationInvalidAdSize:
code = ANAdResponseCode.INVALID_REQUEST;
break;
- case kGADErrorInternalError:
+ case GADErrorInternalError:
code = ANAdResponseCode.INTERNAL_ERROR;
break;
- case kGADErrorInvalidArgument:
+ case GADErrorInvalidArgument:
+ code = ANAdResponseCode.INTERNAL_ERROR;
+ break;
+ case GADErrorReceivedInvalidResponse:
+ code = ANAdResponseCode.INTERNAL_ERROR;
+ break;
+ case GADErrorMediationNoFill:
+ code = ANAdResponseCode.INTERNAL_ERROR;
+ break;
+ case GADErrorApplicationIdentifierMissing:
code = ANAdResponseCode.INVALID_REQUEST;
break;
default:
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.h b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.h
index 1b39ebd6e..b4eb598c3 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.h
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.h
@@ -21,6 +21,6 @@
#endif
#import
-@interface ANAdAdapterInterstitialAdMob : NSObject
+@interface ANAdAdapterInterstitialAdMob : NSObject
@end
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.m b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.m
index ad16bf274..a655e2181 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.m
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialAdMob.m
@@ -18,7 +18,8 @@
@interface ANAdAdapterInterstitialAdMob ()
-@property (nonatomic, readwrite, strong) GADInterstitial *interstitialAd;
+//@property (nonatomic, readwrite, strong) GADInterstitial *interstitialAd;
+@property(nonatomic, strong) GADInterstitialAd *interstitialAd;
@end
@@ -32,108 +33,59 @@ - (void)requestInterstitialAdWithParameter:(nullable NSString *)parameterString
targetingParameters:(nullable ANTargetingParameters *)targetingParameters
{
ANLogDebug(@"Requesting AdMob interstitial");
- self.interstitialAd = [[GADInterstitial alloc] initWithAdUnitID:idString];
- self.interstitialAd.delegate = self;
- [self.interstitialAd loadRequest:
- [self createRequestFromTargetingParameters:targetingParameters]];
+ GADRequest *request = [GADRequest request];
+ [GADInterstitialAd loadWithAdUnitID:idString
+ request:request
+ completionHandler:^(GADInterstitialAd *ad, NSError *error) {
+ if (error) {
+ ANLogError(@"Failed to load interstitial ad with error: %@", [error localizedDescription]);
+ [self.delegate didFailToLoadAd:[ANAdAdapterBaseDFP responseCodeFromRequestError:error]];
+ return;
+ }
+ ANLogDebug(@"AdMob interstitial did load");
+ [self.delegate didLoadInterstitialAd:self];
+ self.interstitialAd = ad;
+ self.interstitialAd.fullScreenContentDelegate = self;
+ }];
+ [self createRequestFromTargetingParameters:targetingParameters];
}
- (void)presentFromViewController:(UIViewController *)viewController
{
- if (!self.interstitialAd.isReady || self.interstitialAd.hasBeenUsed) {
+ if (self.interstitialAd && [self.interstitialAd
+ canPresentFromRootViewController:viewController
+ error:nil]) {
+ ANLogDebug(@"Showing AdMob interstitial");
+ [self.interstitialAd presentFromRootViewController:viewController];
+ } else {
ANLogDebug(@"AdMob interstitial was unavailable");
[self.delegate failedToDisplayAd];
return;
}
-
- ANLogDebug(@"Showing AdMob interstitial");
- [self.interstitialAd presentFromRootViewController:viewController];
-}
-
-- (BOOL)isReady {
- return self.interstitialAd.isReady;
}
- (GADRequest *)createRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters {
return [ANAdAdapterBaseDFP googleAdRequestFromTargetingParameters:targetingParameters];
}
-#pragma mark GADInterstitialDelegate
+#pragma mark GADFullScreenContentDelegate
-- (void)interstitialDidReceiveAd:(GADInterstitial *)ad
-{
- ANLogDebug(@"AdMob interstitial did load");
- [self.delegate didLoadInterstitialAd:self];
-}
-
-- (void)interstitial:(GADInterstitial *)ad didFailToReceiveAdWithError:(GADRequestError *)error
-{
- ANLogDebug(@"AdMob interstitial failed to load with error: %@", error);
- ANAdResponseCode *code = ANAdResponseCode.INTERNAL_ERROR;
-
- switch (error.code) {
- case kGADErrorInvalidRequest:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorNoFill:
- code = ANAdResponseCode.UNABLE_TO_FILL;
- break;
- case kGADErrorNetworkError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorServerError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorOSVersionTooLow:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorTimeout:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorAdAlreadyUsed:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationDataError:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorMediationAdapterError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationInvalidAdSize:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorInternalError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorInvalidArgument:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- default:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- }
-
- [self.delegate didFailToLoadAd:code];
+- (void)ad:(nonnull id)ad didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
+ [self.delegate failedToDisplayAd];
}
-- (void)interstitialWillPresentScreen:(GADInterstitial *)ad {
+- (void)adDidPresentFullScreenContent:(nonnull id)ad {
[self.delegate willPresentAd];
}
-- (void)interstitialDidFailToPresentScreen:(nonnull GADInterstitial *)ad{
- [self.delegate failedToDisplayAd];
-}
-
-- (void)interstitialWillDismissScreen:(GADInterstitial *)ad {
+- (void)adDidDismissFullScreenContent:(nonnull id)ad {
[self.delegate willCloseAd];
-}
-
-- (void)interstitialDidDismissScreen:(GADInterstitial *)ad {
+ ANLogDebug(@"AdMob interstitial did close");
[self.delegate didCloseAd];
}
-- (void)interstitialWillLeaveApplication:(GADInterstitial *)ad {
- [self.delegate willLeaveApplication];
+- (void)adDidRecordImpression:(nonnull id)ad{
+ ANLogDebug(@"AdMob interstitial impression recorded");
}
@end
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.h b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.h
index ef08a92ff..0120b377e 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.h
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.h
@@ -21,6 +21,6 @@
#endif
#import
-@interface ANAdAdapterInterstitialDFP : NSObject
+@interface ANAdAdapterInterstitialDFP : NSObject
@end
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.m b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.m
index 752f818cf..f11a28b67 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.m
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterInterstitialDFP.m
@@ -18,7 +18,7 @@
@interface ANAdAdapterInterstitialDFP ()
-@property (nonatomic, readwrite, strong) DFPInterstitial *interstitialAd;
+@property (nonatomic, readwrite, strong) GAMInterstitialAd *interstitialAd;
@end
@@ -31,105 +31,59 @@ - (void)requestInterstitialAdWithParameter:(nullable NSString *)parameterString
adUnitId:(nullable NSString *)idString
targetingParameters:(nullable ANTargetingParameters *)targetingParameters
{
- ANLogDebug(@"Requesting DFP interstitial");
- self.interstitialAd = [[DFPInterstitial alloc] initWithAdUnitID:idString];
- self.interstitialAd.delegate = self;
- [self.interstitialAd loadRequest:
- [self createRequestFromTargetingParameters:targetingParameters]];
+ ANLogDebug(@"Requesting DFP interstitial");
+ [GAMInterstitialAd loadWithAdManagerAdUnitID:idString
+ request:nil completionHandler:^(GAMInterstitialAd * _Nullable interstitialAd, NSError * _Nullable error) {
+ if (error) {
+ ANLogDebug(@"DFP interstitial failed to load with error: %@", error);
+ [self.delegate didFailToLoadAd:[ANAdAdapterBaseDFP responseCodeFromRequestError:error]];
+ return;
+ }
+ ANLogDebug(@"AdMob interstitial did load");
+ [self.delegate didLoadInterstitialAd:self];
+ self.interstitialAd = interstitialAd;
+ self.interstitialAd.fullScreenContentDelegate = self;
+ }];
+ [self createRequestFromTargetingParameters:targetingParameters];
}
- (void)presentFromViewController:(UIViewController *)viewController
{
- if (!self.interstitialAd.isReady || self.interstitialAd.hasBeenUsed) {
+ if (self.interstitialAd && [self.interstitialAd
+ canPresentFromRootViewController:viewController
+ error:nil]) {
+ ANLogDebug(@"Showing DFP interstitial");
+ [self.interstitialAd presentFromRootViewController:viewController];
+ } else {
ANLogDebug(@"DFP interstitial was unavailable");
[self.delegate failedToDisplayAd];
return;
}
-
- ANLogDebug(@"Showing DFP interstitial");
- [self.interstitialAd presentFromRootViewController:viewController];
-}
-
-- (BOOL)isReady {
- return self.interstitialAd.isReady;
}
- (GADRequest *)createRequestFromTargetingParameters:(ANTargetingParameters *)targetingParameters {
return [ANAdAdapterBaseDFP googleAdRequestFromTargetingParameters:targetingParameters];
}
-#pragma mark GADInterstitialDelegate
-- (void)interstitialDidReceiveAd:(DFPInterstitial *)ad
-{
- ANLogDebug(@"DFP interstitial did load");
- [self.delegate didLoadInterstitialAd:self];
-}
+#pragma mark GADFullScreenContentDelegate
-- (void)interstitial:(GADInterstitial *)ad didFailToReceiveAdWithError:(GADRequestError *)error
-{
- ANLogDebug(@"DFP interstitial failed to load with error: %@", error);
- ANAdResponseCode *code = ANAdResponseCode.INTERNAL_ERROR;
-
- switch (error.code) {
- case kGADErrorInvalidRequest:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorNoFill:
- code = ANAdResponseCode.UNABLE_TO_FILL;
- break;
- case kGADErrorNetworkError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorServerError:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorOSVersionTooLow:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorTimeout:
- code = ANAdResponseCode.NETWORK_ERROR;
- break;
- case kGADErrorAdAlreadyUsed:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationDataError:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorMediationAdapterError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorMediationInvalidAdSize:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- case kGADErrorInternalError:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- case kGADErrorInvalidArgument:
- code = ANAdResponseCode.INVALID_REQUEST;
- break;
- default:
- code = ANAdResponseCode.INTERNAL_ERROR;
- break;
- }
-
- [self.delegate didFailToLoadAd:code];
+- (void)ad:(nonnull id)ad didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
+ [self.delegate failedToDisplayAd];
}
-- (void)interstitialWillPresentScreen:(DFPInterstitial *)ad {
+- (void)adDidPresentFullScreenContent:(nonnull id)ad {
[self.delegate willPresentAd];
}
-- (void)interstitialWillDismissScreen:(DFPInterstitial *)ad {
+- (void)adDidDismissFullScreenContent:(nonnull id)ad {
[self.delegate willCloseAd];
-}
-
-- (void)interstitialDidDismissScreen:(DFPInterstitial *)ad {
+ ANLogDebug(@"AdMob interstitial did close");
[self.delegate didCloseAd];
}
-- (void)interstitialWillLeaveApplication:(DFPInterstitial *)ad {
- [self.delegate willLeaveApplication];
+- (void)adDidRecordImpression:(nonnull id)ad{
+ ANLogDebug(@"AdMob interstitial impression recorded");
}
@end
diff --git a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterNativeAdMob.m b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterNativeAdMob.m
index ca7011c2d..f14b28a6a 100644
--- a/mediation/mediatedviews/GoogleAdMob/ANAdAdapterNativeAdMob.m
+++ b/mediation/mediatedviews/GoogleAdMob/ANAdAdapterNativeAdMob.m
@@ -22,11 +22,11 @@
#import "ANProxyViewController.h"
#endif
-@interface ANAdAdapterNativeAdMob ()
+@interface ANAdAdapterNativeAdMob ()
@property (nonatomic) GADAdLoader *nativeAdLoader;
@property (nonatomic) ANProxyViewController *proxyViewController;
-@property (nonatomic) GADUnifiedNativeAd *nativeAd;
+@property (nonatomic) GADNativeAd *nativeAd;
@end
@@ -54,7 +54,7 @@ - (void)requestNativeAdWithServerParameter:(nullable NSString *)parameterString
ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
self.nativeAdLoader = [[GADAdLoader alloc] initWithAdUnitID:adUnitId
rootViewController:(UIViewController *)self.proxyViewController
- adTypes:@[kGADAdLoaderAdTypeUnifiedNative]
+ adTypes:@[kGADAdLoaderAdTypeNative]
options:@[]];
self.nativeAdLoader.delegate = self;
[self.nativeAdLoader loadRequest:[ANAdAdapterBaseDFP googleAdRequestFromTargetingParameters:targetingParameters]];
@@ -67,11 +67,11 @@ - (void)registerViewForImpressionTrackingAndClickHandling:(nonnull UIView *)view
self.proxyViewController.rootViewController = rvc;
self.proxyViewController.adView = view;
if (self.nativeAd) {
- if ([view isKindOfClass:[GADUnifiedNativeAdView class]]) {
- GADUnifiedNativeAdView *nativeContentAdView = (GADUnifiedNativeAdView *)view;
+ if ([view isKindOfClass:[GADNativeAdView class]]) {
+ GADNativeAdView *nativeContentAdView = (GADNativeAdView *)view;
[nativeContentAdView setNativeAd:self.nativeAd];
} else {
- ANLogError(@"Could not register native ad view––expected a view which is a subclass of GADUnifiedNativeAdView");
+ ANLogError(@"Could not register native ad view––expected a view which is a subclass of GADNativeAdView");
}
return;
}
@@ -79,16 +79,15 @@ - (void)registerViewForImpressionTrackingAndClickHandling:(nonnull UIView *)view
#pragma mark - GADAdLoaderDelegate
-- (void)adLoader:(GADAdLoader *)adLoader didFailToReceiveAdWithError:(GADRequestError *)error {
+- (void)adLoader:(GADAdLoader *)adLoader didFailToReceiveAdWithError:(NSError *)error {
ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
ANLogError(@"Error loading Google native ad: %@", error);
- ANAdResponseCode *code = [ANAdAdapterBaseDFP responseCodeFromRequestError:error];
- [self.requestDelegate didFailToLoadNativeAd:code];
+ [self.requestDelegate didFailToLoadNativeAd:[ANAdAdapterBaseDFP responseCodeFromRequestError:error]];
}
#pragma mark - GADNativeAppInstallAdLoaderDelegate
-- (void)adLoader:(GADAdLoader *)adLoader didReceiveUnifiedNativeAd:(GADUnifiedNativeAd *)nativeAd
+- (void)adLoader:(GADAdLoader *)adLoader didReceiveNativeAd:(GADNativeAd *)nativeAd
{
ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
self.nativeAd = nativeAd;
diff --git a/sdk/AppNexusNativeSDK/SDK-Info.plist b/sdk/AppNexusNativeSDK/SDK-Info.plist
index 7f5488338..3ea230113 100644
--- a/sdk/AppNexusNativeSDK/SDK-Info.plist
+++ b/sdk/AppNexusNativeSDK/SDK-Info.plist
@@ -15,7 +15,7 @@
CFBundlePackageType
FMWK
CFBundleShortVersionString
- 7.10
+ 7.11
CFBundleVersion
$(CURRENT_PROJECT_VERSION)
diff --git a/sdk/AppNexusSDK.xcodeproj/project.pbxproj b/sdk/AppNexusSDK.xcodeproj/project.pbxproj
index a85cfb926..12a922885 100644
--- a/sdk/AppNexusSDK.xcodeproj/project.pbxproj
+++ b/sdk/AppNexusSDK.xcodeproj/project.pbxproj
@@ -148,6 +148,10 @@
609733061E42EAFF0061EC0A /* ANInstreamVideoAd.m in Sources */ = {isa = PBXBuildFile; fileRef = 609732FC1E42EAFF0061EC0A /* ANInstreamVideoAd.m */; };
609733071E42EAFF0061EC0A /* ANVideoAdPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 609732FD1E42EAFF0061EC0A /* ANVideoAdPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
609733091E42EAFF0061EC0A /* ANVideoAdPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 609732FE1E42EAFF0061EC0A /* ANVideoAdPlayer.m */; };
+ 60C4CB0225DD76B400A744CC /* ANRealTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 60C4CB0025DD76B300A744CC /* ANRealTimer.h */; };
+ 60C4CB0325DD76B500A744CC /* ANRealTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 60C4CB0025DD76B300A744CC /* ANRealTimer.h */; };
+ 60C4CB0425DD76B500A744CC /* ANRealTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 60C4CB0125DD76B300A744CC /* ANRealTimer.m */; };
+ 60C4CB0525DD76B500A744CC /* ANRealTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 60C4CB0125DD76B300A744CC /* ANRealTimer.m */; };
60D39E1522570FE20029F741 /* ANVideoPlayerSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 60D39E1322570FE20029F741 /* ANVideoPlayerSettings.h */; settings = {ATTRIBUTES = (Public, ); }; };
60D39E1722570FE20029F741 /* ANVideoPlayerSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 60D39E1422570FE20029F741 /* ANVideoPlayerSettings.m */; };
60D39E2922679E480029F741 /* ANVideoPlayerSettings+ANCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 60D39E26226798D50029F741 /* ANVideoPlayerSettings+ANCategory.h */; };
@@ -449,6 +453,8 @@
609732FE1E42EAFF0061EC0A /* ANVideoAdPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANVideoAdPlayer.m; sourceTree = ""; };
609733001E42EAFF0061EC0A /* ASTMediationManager.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = ASTMediationManager.js; sourceTree = ""; };
60AB32891E521FE500429ED7 /* MobileVastPlayer.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = MobileVastPlayer.js; sourceTree = ""; };
+ 60C4CB0025DD76B300A744CC /* ANRealTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANRealTimer.h; sourceTree = ""; };
+ 60C4CB0125DD76B300A744CC /* ANRealTimer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANRealTimer.m; sourceTree = ""; };
60D39E0F2256EE420029F741 /* optionsparser.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = optionsparser.js; sourceTree = ""; };
60D39E1322570FE20029F741 /* ANVideoPlayerSettings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ANVideoPlayerSettings.h; sourceTree = ""; };
60D39E1422570FE20029F741 /* ANVideoPlayerSettings.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANVideoPlayerSettings.m; sourceTree = ""; };
@@ -902,6 +908,8 @@
60D39E1422570FE20029F741 /* ANVideoPlayerSettings.m */,
60183FD222933E9500CFDE33 /* ANWebView.h */,
60183FD322933E9500CFDE33 /* ANWebView.m */,
+ 60C4CB0025DD76B300A744CC /* ANRealTimer.h */,
+ 60C4CB0125DD76B300A744CC /* ANRealTimer.m */,
00C491C025DF15AB00609E49 /* ANExternalUserId.m */,
);
path = internal;
@@ -1076,6 +1084,7 @@
8AC65F691A40DE74006BCF39 /* ANMRAIDOrientationProperties.h in Headers */,
8AC65F6B1A40DE74006BCF39 /* ANMRAIDResizeProperties.h in Headers */,
8AC65F6D1A40DE74006BCF39 /* ANMRAIDResizeView.h in Headers */,
+ 60C4CB0225DD76B400A744CC /* ANRealTimer.h in Headers */,
8AC65F6F1A40DE74006BCF39 /* ANMRAIDResizeViewManager.h in Headers */,
8AC65F711A40DE74006BCF39 /* ANMRAIDUtil.h in Headers */,
4F8EBCD4235E2F6200256BFB /* ANMultiAdRequest+PrivateMethods.h in Headers */,
@@ -1187,6 +1196,7 @@
0ECF336322D79A62007DB185 /* AppNexusNativeSDK.h in Headers */,
F52F82EB2293362600F4578C /* NSObject+ANCategory.h in Headers */,
F52F82EE2293367A00F4578C /* NSString+ANCategory.h in Headers */,
+ 60C4CB0325DD76B500A744CC /* ANRealTimer.h in Headers */,
0099B485228CA18C004E80AB /* NSTimer+ANCategory.h in Headers */,
00C4919425DF043100609E49 /* ANExternalUserId.h in Headers */,
0099B483228CA0EB004E80AB /* UIView+ANCategory.h in Headers */,
@@ -1419,6 +1429,7 @@
97EC51EF2229782B00B740DF /* ANVerificationScriptResource.m in Sources */,
609733091E42EAFF0061EC0A /* ANVideoAdPlayer.m in Sources */,
609732D91E42E9860061EC0A /* ANVideoAdProcessor.m in Sources */,
+ 60C4CB0425DD76B500A744CC /* ANRealTimer.m in Sources */,
60D39E1722570FE20029F741 /* ANVideoPlayerSettings.m in Sources */,
60183FD622934AB500CFDE33 /* ANWebView.m in Sources */,
609732B21E42E73D0061EC0A /* NSDictionary+ANCategory.m in Sources */,
@@ -1466,6 +1477,7 @@
F5731B87228C951D0012B134 /* ANOMIDImplementation.m in Sources */,
F5731B84228C94EE0012B134 /* ANOpenInExternalBrowserActivity.m in Sources */,
F52F82F1229338F100F4578C /* ANProxyViewController.m in Sources */,
+ 60C4CB0525DD76B500A744CC /* ANRealTimer.m in Sources */,
F5731B7C228C948C0012B134 /* ANReachability.m in Sources */,
F5731B64228C8E190012B134 /* ANRTBVideoAd.m in Sources */,
F5731B6E228C8E4A0012B134 /* ANSDKSettings.m in Sources */,
diff --git a/sdk/AppNexusSDK/SDK-Info.plist b/sdk/AppNexusSDK/SDK-Info.plist
index 1dfe1b686..de26bccf7 100644
--- a/sdk/AppNexusSDK/SDK-Info.plist
+++ b/sdk/AppNexusSDK/SDK-Info.plist
@@ -15,7 +15,7 @@
CFBundlePackageType
FMWK
CFBundleShortVersionString
- 7.10
+ 7.11
CFBundleSignature
????
CFBundleVersion
diff --git a/sdk/sourcefiles/ANCustomAdapter.h b/sdk/sourcefiles/ANCustomAdapter.h
index e9b98743c..10608ebd9 100644
--- a/sdk/sourcefiles/ANCustomAdapter.h
+++ b/sdk/sourcefiles/ANCustomAdapter.h
@@ -65,6 +65,8 @@
adUnitId:(nullable NSString *)idString
targetingParameters:(nullable ANTargetingParameters *)targetingParameters;
- (void)presentFromViewController:(nullable UIViewController *)viewController;
+
+@optional
- (BOOL)isReady;
@property (nonatomic, readwrite, weak, nullable) id delegate;
diff --git a/sdk/sourcefiles/ANSDKSettings.h b/sdk/sourcefiles/ANSDKSettings.h
index 45f18848d..29006e153 100644
--- a/sdk/sourcefiles/ANSDKSettings.h
+++ b/sdk/sourcefiles/ANSDKSettings.h
@@ -97,6 +97,19 @@ An AppNexus disableIDFAUsage is a boolean value which exclude the IDFA field in
*/
@property (nonatomic, readwrite) BOOL disableIDFAUsage;
+/**
+ Specify if impression should be counted when the creative is loaded & viewable on screen.
+ This feature is disabled by default.
+ */
+@property (nonatomic, readwrite, assign) BOOL countImpressionOn1PxRendering;
+
+
+/**
+ Do not track flag. Set this to YES if you have information in the app about user opt out and want to disable tracking cookies for this auction.
+ Default value is set to NO.
+*/
+@property (nonatomic, readwrite) BOOL doNotTrack;
+
/**
Specifies a string that corresponds to the Publishers User ID for current application user.
diff --git a/sdk/sourcefiles/Categories/UIView+ANCategory.h b/sdk/sourcefiles/Categories/UIView+ANCategory.h
index d1959b345..c340a6529 100644
--- a/sdk/sourcefiles/Categories/UIView+ANCategory.h
+++ b/sdk/sourcefiles/Categories/UIView+ANCategory.h
@@ -29,6 +29,7 @@
- (BOOL)an_isAtLeastHalfViewable;
- (CGFloat)an_exposedPercentage;
- (CGRect)an_visibleRectangle;
+- (CGRect)an_visibleInViewRectangle;
- (UIViewController *)an_parentViewController;
diff --git a/sdk/sourcefiles/Categories/UIView+ANCategory.m b/sdk/sourcefiles/Categories/UIView+ANCategory.m
index e8d40519e..03829aa40 100644
--- a/sdk/sourcefiles/Categories/UIView+ANCategory.m
+++ b/sdk/sourcefiles/Categories/UIView+ANCategory.m
@@ -141,6 +141,23 @@ - (CGFloat)an_exposedPercentage{
return exposedPrecentage;
}
+//Provide a visible rectangle in more of the position within the view along with the width & height.eg (81.0,430.0,300.0,250.0)
+- (CGRect)an_visibleInViewRectangle{
+ CGRect visibleRectangle = CGRectMake(0,0,0,0);
+ if(self.an_isViewable){
+
+ UIWindow *parentWindow = self.window;
+
+ // We need to call convertRect:toView: on this view's superview rather than on this view itself.
+ CGRect viewFrameInWindowCoordinates = [self.superview convertRect:self.frame toView:parentWindow];
+ visibleRectangle = CGRectIntersection(viewFrameInWindowCoordinates, parentWindow.frame);
+
+ }
+
+ return visibleRectangle;
+
+}
+
- (CGRect)an_visibleRectangle{
CGRect visibleRectangle = CGRectMake(0,0,0,0);
if(self.an_isViewable){
diff --git a/sdk/sourcefiles/internal/ANAdFetcherBase.m b/sdk/sourcefiles/internal/ANAdFetcherBase.m
index 6640aa329..6768a132f 100644
--- a/sdk/sourcefiles/internal/ANAdFetcherBase.m
+++ b/sdk/sourcefiles/internal/ANAdFetcherBase.m
@@ -80,7 +80,7 @@ - (nonnull instancetype)initWithMultiAdRequestManager: (nonnull ANMultiAdRequest
- (void)cookieSync:(NSHTTPURLResponse *)response
{
- if([ANGDPRSettings canAccessDeviceData]){
+ if([ANGDPRSettings canAccessDeviceData] && !ANSDKSettings.sharedInstance.doNotTrack){
NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[response URL]];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[response URL] mainDocumentURL:nil];
}
@@ -126,7 +126,7 @@ - (void)requestAd
}
- if([ANGDPRSettings canAccessDeviceData]){
+ if([ANGDPRSettings canAccessDeviceData] && !ANSDKSettings.sharedInstance.doNotTrack){
NSString *urlString = [[[ANSDKSettings sharedInstance] baseUrlConfig] webViewBaseUrl];
NSURL *URL = [NSURL URLWithString:urlString];
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:URL];
diff --git a/sdk/sourcefiles/internal/ANAdViewInternalDelegate.h b/sdk/sourcefiles/internal/ANAdViewInternalDelegate.h
index 0273b6635..4927aa120 100644
--- a/sdk/sourcefiles/internal/ANAdViewInternalDelegate.h
+++ b/sdk/sourcefiles/internal/ANAdViewInternalDelegate.h
@@ -19,7 +19,12 @@
#import "ANAdProtocol.h"
#import "ANAdFetcherResponse.h"
-
+typedef NS_ENUM(NSUInteger, ANImpressionFiring) {
+ ANAdReceived,
+ AN1PxViewed,
+ ANLazyLoad,
+ ANAdRendered
+};
// NB Native does not use ANAdViewInternalDelegate, but instead has its own specific delegates for the
// request and response halves of Native entry point.
@@ -38,7 +43,7 @@
- (BOOL)valueOfEnableLazyLoad;
- (BOOL)valueOfIsLazySecondPassThroughAdUnit;
-- (BOOL) valueOfCountImpressionOnAdReceived;
+- (ANImpressionFiring) valueOfHowImpressionBeFired;
@required
- (void)adRequestFailedWithError:(NSError *)error andAdResponseInfo:(ANAdResponseInfo *)adResponseInfo;
diff --git a/sdk/sourcefiles/internal/ANBannerAdView.m b/sdk/sourcefiles/internal/ANBannerAdView.m
index dd6d1941a..cc7df519e 100644
--- a/sdk/sourcefiles/internal/ANBannerAdView.m
+++ b/sdk/sourcefiles/internal/ANBannerAdView.m
@@ -16,11 +16,11 @@
#import "ANBannerAdView.h"
#import "ANAdView+PrivateMethods.h"
#import "ANMRAIDContainerView.h"
-
+#import "ANSDKSettings.h"
#import "ANUniversalAdFetcher.h"
#import "ANLogging.h"
#import "ANTrackerManager.h"
-
+#import "ANRealTimer.h"
#import "UIView+ANCategory.h"
#import "ANBannerAdView+ANContentViewTransitions.h"
#import "ANAdView+PrivateMethods.h"
@@ -55,7 +55,7 @@
#pragma mark -
-@interface ANBannerAdView()
+@interface ANBannerAdView()
@property (nonatomic, readwrite, strong) UIView *contentView;
@@ -148,6 +148,7 @@ - (void)initialize {
//
[[ANOMIDImplementation sharedInstance] activateOMIDandCreatePartner];
+
}
- (void)awakeFromNib {
@@ -382,7 +383,7 @@ - (void)fireTrackerAndOMID
{
if(self.impressionURLs != nil) {
//this check is needed to know if the impression was fired early or when attached to window. if impressionURL is nil then either it was fired early & removed or there was no urls in the response
- ANLogDebug(@"Impression URL fired when adview is attaching to window");
+ ANLogDebug(@"Impression tracker fired");
[ANTrackerManager fireTrackerURLArray:self.impressionURLs withBlock:nil];
self.impressionURLs = nil;
}
@@ -536,8 +537,6 @@ - (void)universalAdFetcher:(ANUniversalAdFetcher *)fetcher didFinishRequestWithR
id adObject = response.adObject;
id adObjectHandler = response.adObjectHandler;
- BOOL trackersShouldBeFired = NO;
-
NSError *error = nil;
@@ -563,8 +562,24 @@ - (void)universalAdFetcher:(ANUniversalAdFetcher *)fetcher didFinishRequestWithR
return;
}
-
-
+
+ //Check if its banner only & not native or native renderer
+ if(self.valueOfHowImpressionBeFired == AN1PxViewed){
+ BOOL shouldAddDelegate = TRUE;
+
+ if([adObjectHandler isKindOfClass:[ANNativeStandardAdResponse class]] || [adObject isKindOfClass:[ANNativeAdResponse class]]){
+ shouldAddDelegate = FALSE;
+ }
+
+ if(response.isLazy == NO && self.isLazySecondPassThroughAdUnit == YES){
+ shouldAddDelegate = TRUE;
+ }
+
+ if(shouldAddDelegate){
+ [ANRealTimer addDelegate:self];
+ }
+ }
+
// Capture state for all AdUnits. UNLESS this is the second pass of lazy AdUnit.
//
if ( (!response.isLazy && !self.isLazySecondPassThroughAdUnit) || response.isLazy )
@@ -594,6 +609,8 @@ - (void)universalAdFetcher:(ANUniversalAdFetcher *)fetcher didFinishRequestWithR
//
if ([adObject isKindOfClass:[UIView class]] || response.isLazy)
{
+ self.impressionURLs = (NSArray *) [ANGlobal valueOfGetterProperty:kANImpressionUrls forObject:adObjectHandler];
+
if ( (!response.isLazy && !self.isLazySecondPassThroughAdUnit) || response.isLazy )
{
NSString *width = (NSString *) [ANGlobal valueOfGetterProperty:kANBannerWidth forObject:adObjectHandler];
@@ -610,14 +627,16 @@ - (void)universalAdFetcher:(ANUniversalAdFetcher *)fetcher didFinishRequestWithR
if (_adResponseInfo.adType == ANAdTypeBanner && !([adObjectHandler isKindOfClass:[ANNativeStandardAdResponse class]]))
{
- self.impressionURLs = (NSArray *) [ANGlobal valueOfGetterProperty:kANImpressionUrls forObject:adObjectHandler];
+
// Fire trackers and OMID upon attaching to UIView hierarchy or if countImpressionOnAdReceived is enabled,
// but only when the AdUnit is not lazy.
//
- if (!response.isLazy && (self.window || self.countImpressionOnAdReceived)) {
- trackersShouldBeFired = YES;
+ if(!response.isLazy && self.valueOfHowImpressionBeFired == ANAdRendered && self.window){
+ //fire impression tracker
+ [self fireTrackerAndOMID];
}
+
}
}
@@ -634,14 +653,16 @@ - (void)universalAdFetcher:(ANUniversalAdFetcher *)fetcher didFinishRequestWithR
[self lazyAdDidReceiveAd:self];
return;
- } else {
- trackersShouldBeFired = YES;
}
// Handle AdUnit that is NOT lazy loaded.
//
self.contentView = adObject;
+
+ if(self.isLazySecondPassThroughAdUnit && self.valueOfHowImpressionBeFired == ANLazyLoad){
+ [self fireTrackerAndOMID];
+ }
if ((_adResponseInfo.adType == ANAdTypeBanner) || (_adResponseInfo.adType == ANAdTypeVideo))
{
@@ -669,9 +690,6 @@ - (void)universalAdFetcher:(ANUniversalAdFetcher *)fetcher didFinishRequestWithR
}
}
- if (trackersShouldBeFired) {
- [self fireTrackerAndOMID];
- }
[self adDidReceiveAd:self];
@@ -816,21 +834,46 @@ - (BOOL)valueOfIsLazySecondPassThroughAdUnit
return self.isLazySecondPassThroughAdUnit;
}
-- (BOOL) valueOfCountImpressionOnAdReceived {
- return self.countImpressionOnAdReceived;
+- (ANImpressionFiring) valueOfHowImpressionBeFired {
+ if (self.countImpressionOnAdReceived){
+ return ANAdReceived;
+ } else if (ANSDKSettings.sharedInstance.countImpressionOn1PxRendering){
+ return AN1PxViewed;
+ } else if (self.enableLazyLoad) {
+ return ANLazyLoad;
+ }
+ return ANAdRendered;
}
-
#pragma mark - UIView observer methods.
- (void)didMoveToWindow
{
if (self.contentView && (_adResponseInfo.adType == ANAdTypeBanner))
{
- [self fireTrackerAndOMID];
+ if(self.valueOfHowImpressionBeFired == ANAdRendered){
+ ANLogDebug(@"Impression tracker fired on render");
+ [self fireTrackerAndOMID];
+ }
}
}
+#pragma mark - Check if on screen & fire impression trackers
+
+- (void) handle1SecTimerSentNotification {
+ CGRect updatedVisibleInViewRectangle = [self.contentView an_visibleInViewRectangle];
+
+ ANLogInfo(@"exposed rectangle: %@", NSStringFromCGRect(updatedVisibleInViewRectangle));
+
+ if(updatedVisibleInViewRectangle.size.width > 0 && updatedVisibleInViewRectangle.size.height > 0){
+ ANLogDebug(@"Impression tracker fired on 1px rendering");
+ //Fire impression tracker here
+ [self fireTrackerAndOMID];
+ //Firing the impression tracker & set the delegate to nil to not duplicate the firing of impressions
+ [ANRealTimer removeDelegate:self];
+ }
+}
+
@end
diff --git a/sdk/sourcefiles/internal/ANGlobal.h b/sdk/sourcefiles/internal/ANGlobal.h
index 2391f8079..18d29a9f2 100644
--- a/sdk/sourcefiles/internal/ANGlobal.h
+++ b/sdk/sourcefiles/internal/ANGlobal.h
@@ -26,7 +26,7 @@
#define AN_ERROR_TABLE @"errors"
#define AN_DEFAULT_PLACEMENT_ID @"default_placement_id"
-#define AN_SDK_VERSION @"7.10"
+#define AN_SDK_VERSION @"7.11"
#define APPNEXUS_BANNER_SIZE CGSizeMake(320, 50)
diff --git a/sdk/sourcefiles/internal/ANGlobal.m b/sdk/sourcefiles/internal/ANGlobal.m
index 0e7a10cab..a00f9e3b9 100644
--- a/sdk/sourcefiles/internal/ANGlobal.m
+++ b/sdk/sourcefiles/internal/ANGlobal.m
@@ -520,7 +520,7 @@ + (ANVideoOrientation) parseVideoOrientation:(NSString *)aspectRatio {
}
+ (void) setWebViewCookie:(nonnull WKWebView*)webView{
- if([ANGDPRSettings canAccessDeviceData]){
+ if([ANGDPRSettings canAccessDeviceData] && !ANSDKSettings.sharedInstance.doNotTrack){
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
// Skip cookies that will break our script
diff --git a/sdk/sourcefiles/internal/ANRealTimer.h b/sdk/sourcefiles/internal/ANRealTimer.h
new file mode 100644
index 000000000..22b53c2dd
--- /dev/null
+++ b/sdk/sourcefiles/internal/ANRealTimer.h
@@ -0,0 +1,33 @@
+/* Copyright 2021 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
+
+@protocol ANRealTimerDelegate
+
+- (void)handle1SecTimerSentNotification;
+
+@end
+
+@interface ANRealTimer : NSObject
+
++ (BOOL)addDelegate:(nonnull id)delegate;
+
++ (BOOL)removeDelegate:(nonnull id)delegate;
+
+@end
+
+
+
diff --git a/sdk/sourcefiles/internal/ANRealTimer.m b/sdk/sourcefiles/internal/ANRealTimer.m
new file mode 100644
index 000000000..dcec9fe83
--- /dev/null
+++ b/sdk/sourcefiles/internal/ANRealTimer.m
@@ -0,0 +1,120 @@
+/* Copyright 2021 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 "ANRealTimer.h"
+#import "NSTimer+ANCategory.h"
+#import "ANGlobal.h"
+#import "ANLogging.h"
+
+
+@interface ANRealTimer()
+
+@property (nonatomic, readwrite, strong) NSTimer *viewabilityTimer;
+@property (nonatomic, readwrite, strong) NSMutableArray> *timerDelegates;
+
+
+@end
+
+@implementation ANRealTimer
+
++ (instancetype)sharedInstance {
+ static ANRealTimer *manager;
+ static dispatch_once_t managerToken;
+ dispatch_once(&managerToken, ^{
+ manager = [[ANRealTimer alloc] init];
+ manager.timerDelegates = [[NSMutableArray alloc] init];
+ });
+ return manager;
+}
+
++ (void) scheduleTimer {
+ [self sharedInstance];
+}
+
++ (BOOL)addDelegate:(nonnull id)delegate {
+ return [[self sharedInstance] addDelegate:delegate];
+}
+
++ (BOOL)removeDelegate:(nonnull id)delegate {
+ return [[self sharedInstance] removeDelegate:delegate];
+}
+
+- (void) scheduleTimer {
+ if(_viewabilityTimer == nil){
+ __weak ANRealTimer *weakSelf = self;
+ _viewabilityTimer = [NSTimer an_scheduledTimerWithTimeInterval:kAppNexusNativeAdIABShouldBeViewableForTrackingDuration
+ block:^ {
+ ANRealTimer *strongSelf = weakSelf;
+
+ [strongSelf notifyListenerObjects];
+ }
+ repeats:YES];
+
+ }
+}
+
+- (BOOL)addDelegate:(nonnull id)delegate {
+
+ if(![delegate conformsToProtocol:@protocol(ANRealTimerDelegate)]){
+ ANLogError(@"FAILED to add delegate, delegate does not confront to protocol");
+ return NO;
+ }
+ if([self.timerDelegates containsObject:delegate]){
+ ANLogWarn(@"Delegate already added");
+ return YES;
+ }
+ if(self.viewabilityTimer == nil){
+ [self scheduleTimer];
+ }
+ [self.timerDelegates addObject:delegate];
+ return YES;
+
+}
+
+- (BOOL)removeDelegate:(nonnull id)delegate {
+ if(![delegate conformsToProtocol:@protocol(ANRealTimerDelegate)]){
+ ANLogError(@"FAILED to remove delegate, delegate does not confront to protocol");
+ return NO;
+ }
+
+ [self.timerDelegates removeObject:delegate];
+
+ //if no delegates found then the timer can be stopped & added again if a new delegate is added
+ if(self.timerDelegates.count <= 0){
+ [self.viewabilityTimer invalidate];
+ self.viewabilityTimer = nil;
+ }
+
+ return YES;
+}
+
+-(void) notifyListenerObjects {
+ if(self.timerDelegates.count > 0) {
+ for (int i=0; i< self.timerDelegates.count; i++){
+ id delegate = self.timerDelegates[i];
+ if([delegate respondsToSelector:@selector(handle1SecTimerSentNotification)]){
+ ANLogInfo(@"Notifications pushed from time\
+ ");
+
+ [delegate handle1SecTimerSentNotification];
+ }
+ }
+ }
+ else {
+ ANLogError(@"no delegate subscription found");
+ }
+}
+
+@end
diff --git a/sdk/sourcefiles/internal/ANUniversalAdFetcher.m b/sdk/sourcefiles/internal/ANUniversalAdFetcher.m
index ec186d23c..bbac01691 100644
--- a/sdk/sourcefiles/internal/ANUniversalAdFetcher.m
+++ b/sdk/sourcefiles/internal/ANUniversalAdFetcher.m
@@ -338,6 +338,7 @@ - (void)handleStandardAd:(ANStandardAd *)standardAd
CGSize sizeOfWebview = [self getWebViewSizeForCreativeWidth: standardAd.width
andHeight: standardAd.height];
+
//
if ([self.delegate respondsToSelector:@selector(valueOfEnableLazyLoad)] && [self.delegate valueOfEnableLazyLoad])
{
@@ -354,9 +355,6 @@ - (void)handleStandardAd:(ANStandardAd *)standardAd
if (!returnValue) {
ANLogError(@"FAILED to allocate self.adView.");
- } else {
- [self fireImpressionTrackersEarly:standardAd];
-
}
}
@@ -423,12 +421,16 @@ -(void) renderNativeAd:(ANBaseAdObject *)nativeRenderingElement {
- (void) fireImpressionTrackersEarly:(ANBaseAdObject *) ad {
//fire the impression tracker earlier in the lifecycle. immediatley after creating the webView.
- BOOL countImpressionOnAdReceived = [self.delegate respondsToSelector:@selector(valueOfCountImpressionOnAdReceived)] && [self.delegate valueOfCountImpressionOnAdReceived];
- if(countImpressionOnAdReceived){
- ANLogDebug(@"Impression URL fired when we have a valid ad & the view is created");
- [ANTrackerManager fireTrackerURLArray:ad.impressionUrls withBlock:nil];
- ad.impressionUrls = nil;
+
+ if ([self.delegate respondsToSelector:@selector(valueOfHowImpressionBeFired)]){
+ ANImpressionFiring howImpressionFired = [self.delegate valueOfHowImpressionBeFired];
+ //fire impression when we receive the ad or if lazy load is enabled
+ if(howImpressionFired == ANAdReceived || howImpressionFired == ANLazyLoad){
+ ANLogDebug(@"Impression tracker fired on ad received %@", ad.impressionUrls.firstObject);
+ [ANTrackerManager fireTrackerURLArray:ad.impressionUrls withBlock:nil];
+ ad.impressionUrls = nil;
+ }
}
}
@@ -572,9 +574,16 @@ - (BOOL)allocateAndSetWebviewWithSize: (CGSize)webviewSize
videoXML: webviewContent ];
} else {
+
+ ANStandardAd *standardAd = (ANStandardAd *)self.adObjectHandler;
+
self.adView = [[ANMRAIDContainerView alloc] initWithSize: webviewSize
HTML: webviewContent
webViewBaseURL: [NSURL URLWithString:[[[ANSDKSettings sharedInstance] baseUrlConfig] webViewBaseUrl]] ];
+
+ [self fireImpressionTrackersEarly:standardAd];
+
+
}
if (!self.adView)
@@ -607,7 +616,8 @@ - (BOOL)allocateAndSetWebviewFromCachedAdObjectHandler
//
[self restartAutoRefreshTimer];
[self startAutoRefreshTimer];
-
+
+
return [self allocateAndSetWebviewWithSize: sizeOfWebview
content: lazyStandardAd.content
isXMLForVideo: NO ];
diff --git a/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m b/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m
index dad1f939d..ffe1685db 100644
--- a/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m
+++ b/sdk/sourcefiles/internal/ANUniversalTagRequestBuilder.m
@@ -578,6 +578,10 @@ -(void)getAdFramework:(NSMutableDictionary *)tag{
}else if ([self.adFetcherDelegate externalUid]) {
userDict[@"external_uid"] = [self.adFetcherDelegate externalUid];
}
+
+ if ([[ANSDKSettings sharedInstance] doNotTrack]) {
+ userDict[@"dnt"] = [NSNumber numberWithBool:YES];
+ }
return [userDict copy];
}
@@ -708,7 +712,7 @@ -(void)getAdFramework:(NSMutableDictionary *)tag{
- (NSDictionary *)deviceId
{
- if([ANGDPRSettings canAccessDeviceData] && ANAdvertisingTrackingEnabled()){
+ if([ANGDPRSettings canAccessDeviceData] && ANAdvertisingTrackingEnabled() && !ANSDKSettings.sharedInstance.doNotTrack){
return [self fetchAdvertisingIdentifier];
}
diff --git a/sdk/sourcefiles/internal/config/ANSDKSettings.m b/sdk/sourcefiles/internal/config/ANSDKSettings.m
index 9376d429e..7e1d6281a 100644
--- a/sdk/sourcefiles/internal/config/ANSDKSettings.m
+++ b/sdk/sourcefiles/internal/config/ANSDKSettings.m
@@ -101,8 +101,10 @@ + (id)sharedInstance {
sdkSettings.enableOpenMeasurement = YES;
sdkSettings.enableTestMode = NO;
sdkSettings.disableIDFAUsage = NO;
+ sdkSettings.doNotTrack = NO;
sdkSettings.auctionTimeout = 0;
sdkSettings.nativeAdAboutToExpireInterval = kAppNexusNativeAdAboutToExpireInterval;
+ sdkSettings.countImpressionOn1PxRendering = NO;
});
return sdkSettings;
}
@@ -151,5 +153,4 @@ -(void)setNativeAdAboutToExpireInterval:(NSInteger)nativeAdAboutToExpireInterval
__nativeAdAboutToExpireInterval = nativeAdAboutToExpireInterval;
}
-
@end
diff --git a/sdk/sourcefiles/native/internal/ANNativeAdResponse.m b/sdk/sourcefiles/native/internal/ANNativeAdResponse.m
index a627b0a3e..119562475 100644
--- a/sdk/sourcefiles/native/internal/ANNativeAdResponse.m
+++ b/sdk/sourcefiles/native/internal/ANNativeAdResponse.m
@@ -27,6 +27,7 @@
NSInteger const kANNativeFacebookAdAboutToExpire = 3600;
NSInteger const kANNativeRTBAdAboutToExpire = 21600;
NSInteger const kANNativeRTBAdAboutToExpireForMember_11217 = 300;
+NSInteger const kANNativeRTBAdAboutToExpireForMember_12085 = 600;
#pragma mark - ANNativeAdResponseGestureRecognizerRecord
@@ -333,6 +334,8 @@ -(void)registerAdAboutToExpire{
timeInterval = kANNativeFacebookAdAboutToExpire - self.aboutToExpireInterval;
}else if ([self.adResponseInfo.contentSource isEqualToString:@"rtb"] && self.adResponseInfo.memberId == 11217 ){
timeInterval = kANNativeRTBAdAboutToExpireForMember_11217 - self.aboutToExpireInterval;
+ }else if ([self.adResponseInfo.contentSource isEqualToString:@"rtb"] && self.adResponseInfo.memberId == 12085 ){
+ timeInterval = kANNativeRTBAdAboutToExpireForMember_12085 - self.aboutToExpireInterval;
}else{
timeInterval = kANNativeRTBAdAboutToExpire - self.aboutToExpireInterval;
}
@@ -392,6 +395,9 @@ - (void)setAboutToExpireTimeInterval
}else if ([self.adResponseInfo.contentSource isEqualToString:@"rtb"] && self.adResponseInfo.memberId == 11217 && aboutToExpireTimeInterval >= kANNativeRTBAdAboutToExpireForMember_11217 ){
ANLogError(@"nativeAdAboutToExpireInterval can not be set greater than or equal to 5 minutes for RTB & member 11217");
return;
+ }else if ([self.adResponseInfo.contentSource isEqualToString:@"rtb"] && self.adResponseInfo.memberId == 12085 && aboutToExpireTimeInterval >= kANNativeRTBAdAboutToExpireForMember_12085 ){
+ ANLogError(@"nativeAdAboutToExpireInterval can not be set greater than or equal to 10 minutes for RTB & member 12085");
+ return;
}else if(aboutToExpireTimeInterval >= kANNativeRTBAdAboutToExpire){
ANLogError(@"nativeAdAboutToExpireInterval can not be set greater than or equal to 6 hours");
return;
diff --git a/sdk/sourcefiles/native/internal/ANNativeStandardAdResponse.m b/sdk/sourcefiles/native/internal/ANNativeStandardAdResponse.m
index 250a3741d..62f11c804 100644
--- a/sdk/sourcefiles/native/internal/ANNativeStandardAdResponse.m
+++ b/sdk/sourcefiles/native/internal/ANNativeStandardAdResponse.m
@@ -22,11 +22,12 @@
#import "UIView+ANCategory.h"
#import "ANTrackerManager.h"
#import "ANOMIDImplementation.h"
+#import "ANSDKSettings.h"
+#import "ANRealTimer.h"
-
-@interface ANNativeStandardAdResponse()
+@interface ANNativeStandardAdResponse()
@property (nonatomic, readwrite, strong) NSDate *dateCreated;
@property (nonatomic, readwrite, assign) ANNativeAdNetworkCode networkCode;
@@ -110,21 +111,36 @@ - (void)unregisterViewFromTracking {
- (void)setupViewabilityTracker
{
- __weak ANNativeStandardAdResponse *weakSelf = self;
- NSInteger requiredAmountOfSimultaneousViewableEvents = lround( kAppNexusNativeAdIABShouldBeViewableForTrackingDuration
- / kAppNexusNativeAdCheckViewabilityForTrackingFrequency) + 1;
- self.targetViewabilityValue = lround(pow(2, requiredAmountOfSimultaneousViewableEvents) - 1);
- ANLogDebug(@"\n\trequiredAmountOfSimultaneousViewableEvents=%@ \n\ttargetViewabilityValue=%@", @(requiredAmountOfSimultaneousViewableEvents), @(self.targetViewabilityValue));
+ if(!ANSDKSettings.sharedInstance.countImpressionOn1PxRendering) {
+ __weak ANNativeStandardAdResponse *weakSelf = self;
+ NSInteger requiredAmountOfSimultaneousViewableEvents = lround( kAppNexusNativeAdIABShouldBeViewableForTrackingDuration
+ / kAppNexusNativeAdCheckViewabilityForTrackingFrequency) + 1;
+ self.targetViewabilityValue = lround(pow(2, requiredAmountOfSimultaneousViewableEvents) - 1);
+ ANLogDebug(@"\n\trequiredAmountOfSimultaneousViewableEvents=%@ \n\ttargetViewabilityValue=%@", @(requiredAmountOfSimultaneousViewableEvents), @(self.targetViewabilityValue));
+
+ self.viewabilityTimer = [NSTimer an_scheduledTimerWithTimeInterval:kAppNexusNativeAdCheckViewabilityForTrackingFrequency
+ block:^ {
+ ANNativeStandardAdResponse *strongSelf = weakSelf;
+
+ [strongSelf checkIfIABViewable];
+ } repeats:YES];
+ } else {
+ [ANRealTimer addDelegate:self];
+ }
+}
+
+- (void) checkIfViewIs1pxOnScreen {
+ CGRect updatedVisibleInViewRectangle = [self.viewForTracking an_visibleInViewRectangle];
+
+ ANLogInfo(@"visible rectangle Native: %@", NSStringFromCGRect(updatedVisibleInViewRectangle));
+ if(updatedVisibleInViewRectangle.size.width > 0 && updatedVisibleInViewRectangle.size.height > 0){
+ ANLogInfo(@"Impression tracker fired when 1px native on screen");
+ [self trackImpression];
+ }
- self.viewabilityTimer = [NSTimer an_scheduledTimerWithTimeInterval:kAppNexusNativeAdCheckViewabilityForTrackingFrequency
- block:^ {
- ANNativeStandardAdResponse *strongSelf = weakSelf;
- [strongSelf checkViewability];
- }
- repeats:YES];
}
-- (void)checkViewability {
+- (void)checkIfIABViewable {
self.viewabilityValue = (self.viewabilityValue << 1 | [self.viewForTracking an_isAtLeastHalfViewable]) & self.targetViewabilityValue;
BOOL isIABViewable = (self.viewabilityValue == self.targetViewabilityValue);
ANLogDebug(@"\n\tviewabilityValue=%@ \n\tself.targetViewabilityValue=%@ \n\tisIABViewable=%@", @(self.viewabilityValue), @(self.targetViewabilityValue), @(isIABViewable));
@@ -140,6 +156,7 @@ - (void)trackImpression {
[self fireImpTrackers];
[self.viewabilityTimer invalidate];
self.impressionHasBeenTracked = YES;
+ [ANRealTimer removeDelegate:self];
}
}
@@ -156,6 +173,12 @@ - (void)fireImpTrackers {
}
}
+- (void) handle1SecTimerSentNotification {
+ if(!self.impressionHasBeenTracked){
+ [self checkIfViewIs1pxOnScreen];
+ }
+}
+
diff --git a/tests/TrackerUITest/HelpingLibrary/Categories/ANNativeAdResponse+PrivateMethods.h b/tests/TrackerUITest/HelpingLibrary/Categories/ANNativeAdResponse+PrivateMethods.h
new file mode 100644
index 000000000..db9d948b7
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Categories/ANNativeAdResponse+PrivateMethods.h
@@ -0,0 +1,26 @@
+/* Copyright 2014 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 "ANVerificationScriptResource.h"
+
+@interface ANNativeAdResponse (PrivateMethods)
+
+
+#pragma mark - Unregistration
+
+- (void)unregisterViewFromTracking;
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Categories/ANVerificationScriptResource+ANTest.h b/tests/TrackerUITest/HelpingLibrary/Categories/ANVerificationScriptResource+ANTest.h
new file mode 100644
index 000000000..03dd8dded
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Categories/ANVerificationScriptResource+ANTest.h
@@ -0,0 +1,21 @@
+/* Copyright 2019 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 "ANVerificationScriptResource.h"
+
+@interface ANVerificationScriptResource (ANTest)
+- (void)anVerificationScriptResource:(NSDictionary *)jsonDic;
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Categories/ANVerificationScriptResource+ANTest.m b/tests/TrackerUITest/HelpingLibrary/Categories/ANVerificationScriptResource+ANTest.m
new file mode 100644
index 000000000..ae2a78250
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Categories/ANVerificationScriptResource+ANTest.m
@@ -0,0 +1,30 @@
+/* Copyright 2019 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 "ANVerificationScriptResource+ANTest.h"
+
+@implementation ANVerificationScriptResource (ANTest)
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+- (void)anVerificationScriptResource:(NSDictionary *)jsonDic
+{
+ self.url = @"https://acdn.adnxs.com/mobile/omsdk/test/omid-validation-verification-script-1.2.5.js";
+ self.vendorKey = @"dummyVendor";
+ self.params = @"http://dummy-domain/m?msg=";
+}
+#pragma clang diagnostic pop
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMBannerAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMBannerAd.json
new file mode 100755
index 000000000..9ba55269b
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMBannerAd.json
@@ -0,0 +1,63 @@
+{
+ "version": "3.0.0",
+ "tags": [
+ {
+ "tag_id": 18144580,
+ "auction_id": "6918394593318350869",
+ "nobid": false,
+ "no_ad_url": "http://nym1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKNCKANBAAAAwDWAAUBCIffy_AFEJXg5LWj58SBYBie4p7ovf_NlngqNgkAAAkCABEJBwgAABkJCQjgPyEJCQgAACkRCQAxCQnwfeA_MMS60wg47k5A7k5IAFAAWM6zbGAAaKSThgF4AIABAYoBAJIBA1VTRJgBwAKgATKoAQawAQC4AQDAAQDIAQLQAQDYAQDgAQDwAQCKAjx1ZignYScsIDMzOTA3NTMsIDE1NzgyOTkyNzEpO3VmKCdyJywgMjAxNzIxNzU4LDIfAPD1kgK1AiFmai1KelFqTjFkMFJFSjZQbUdBWUFDRE9zMnd3QURnQVFBUkk3azVReExyVENGZ0FZSVlGYUFCd0FIZ0FnQUVBaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFHZlIxZjV0QWlNUDhFQm4wZFgtYlFJakRfSkFkU2J2NjdNNXZVXzJRRUFBQUFBQUFEd1AtQUJBUFVCb1VWZ1BKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFPQUNBT2dDQVBnQ0FJQURBWmdEQWFnRHpkWGRFYm9EQ1U1WlRUSTZOREF3T2VBRC1SaUlCQUNRQkFDWUJBSEJCBUUJAQh5UVEJCQEBFE5nRUFQRRGNAZAsNEJBQ0lCYWtmcVFVAREBFDx3UHcuLpoCiQEhaUJMZkNBNjkBoHpyTnNJQVFvQURGN0ZLNUg0WHFFUHpvSlRsbE5Nam8wTURBNVFQa1lTEXgMUEFfVREMDEFBQVcdDABZHQwAYR0MAGMdDPQOAWVBQS7YAgDgAsqoTeoCNGl0dW5lcy5hcHBsZS5jb20vdXMvYXBwL2FwcG5leHVzLXNkay1hcHAvaWQ3MzY4Njk4MzOAAwCIAwGQAwCYAxegAwGqAwDAA6wCyAMB2AP5o3rgAwDoAwL4AwCABACSBAYvdXQvdjOYBACiBAwxMC43NS4xMC4xNDGoBIeaAbIEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQPMTAwOTQjTllNMjo0MDA52gQCCADgBADwBJ6PmGD6BBIJAAAAQJbkQkARAAAAwAKaXsCCBQk3MzY4Njk4MzOIBQGYBQCgBf___________wHABQDJBQAAAAAAAPA_0gUJCQAAAABhYnDYBQHgBQHwBY2XBvoFBAgAEACQBgCYBgC4BgDBBgEhMAAA8L_QBtYz2gYWChAJERkBUBAAGADgBgHyBgIIAIAHAYgHAKAHAQ..&s=ab2bb0e4df506ecdd3f1072c63113f3bf0a8bb26",
+ "timeout_ms": 0,
+ "ad_profile_id": 1266762,
+ "rtb_video_fallback": false,
+ "ads": [
+ {
+ "content_source": "csm",
+ "ad_type": "banner",
+ "buyer_member_id": 10094,
+ "creative_id": 201721758,
+ "media_type_id": 1,
+ "media_subtype_id": 1,
+ "brand_category_id": 53,
+ "client_initiated_ad_counting": false,
+ "viewability": {
+ "config": "document.write('
');"
+ },
+ "csm": {
+ "banner": {
+ "content": "",
+ "width": 320,
+ "height": 50
+ },
+ "timeout_ms": 500,
+ "handler": [
+ {
+ "width": "320",
+ "height": "50",
+ "type": "ios",
+ "class": "ANAdAdapterBannerAdMob",
+ "id": "ca-app-pub-3940256099942544/2934735716"
+ },
+ {
+ "width": "320",
+ "height": "50",
+ "type": "android",
+ "class": "com.appnexus.opensdk.mediatedviews.AdMobBanner",
+ "id": "ca-app-pub-3940256099942544/6300978111"
+ }
+ ],
+ "trackers": [
+ {
+ "impression_urls": [
+ "http://nym1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKVCOgVBAAAAwDWAAUBCIffy_AFEJXg5LWj58SBYBie4p7ovf_NlngqNgkLB0KygAmMPxELB0KygAmMPxkAAAECCOA_IREbACkRCQAxARm4AADgPzDEutMIOO5OQO5OSAJQno-YYFjOs2xgAGikk4YBePrbBIABAYoBA1VTRJIFBvBVmAHAAqABMqgBBrABALgBAcABBMgBAtABANgBAOABAPABAIoCPHVmKCdhJywgMzM5MDc1MywgMTU3ODI5OTI3MSk7dWYoJ3InLCAyMDE3MjE3NTgsIDEdH_D1kgK1AiFmai1KelFqTjFkMFJFSjZQbUdBWUFDRE9zMnd3QURnQVFBUkk3azVReExyVENGZ0FZSVlGYUFCd0FIZ0FnQUVBaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFHZlIxZjV0QWlNUDhFQm4wZFgtYlFJakRfSkFkU2J2NjdNNXZVXzJRRUFBQUFBQUFEd1AtQUJBUFVCb1VWZ1BKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFPQUNBT2dDQVBnQ0FJQURBWmdEQWFnRHpkWGRFYm9EQ1U1WlRUSTZOREF3T2VBRC1SaUlCQUNRQkFDWUJBSEJCBUUJAQh5UVEJCQEBFE5nRUFQRRGNAZAsNEJBQ0lCYWtmcVFVAREBFDx3UHcuLpoCiQEhaUJMZkNBNjkBoHpyTnNJQVFvQURGN0ZLNUg0WHFFUHpvSlRsbE5Nam8wTURBNVFQa1lTEXgMUEFfVREMDEFBQVcdDABZHQwAYR0MAGMdDPDCZUFBLtgCAOACyqhN6gI0aXR1bmVzLmFwcGxlLmNvbS91cy9hcHAvYXBwbmV4dXMtc2RrLWFwcC9pZDczNjg2OTgzM4ADAIgDAZADAJgDF6ADAaoDAMADrALIAwHYA_mjeuADAOgDAvgDAIAEAJIEBi91dC92M5gEAKIEDDEwLjc1LjEwLjE0MagEh5oBsgQOCAAQARgAIAAoADAAOAK4BADABADIBADSBA8xMDA5NCNOWU0yOjQwMDnaBAIIAeAEAfAEYQhg-gQSCQAAAECW5EJAEQAAAMACml7AggUJNxGlIIgFAZgFAKAF_xEBFAHABQDJBWlaEPA_0gUJAUAFAXDYBQHgBQHwBY2XBvoFBAgAEACQBgCYBgC4BgDBBgUiLADwP9AG1jPaBhYKEAkRGQFQEAAYAOAGAfIGAggAgAcBiAcAoAcB&s=a0968149b94b6033cda75ec96054b354c039e55a"
+ ],
+ "video_events": {}
+ }
+ ],
+ "request_url": "http://nym1-mobile.adnxs.com/mediation/v2/log_req?info=LwAAAAMABQEFAQiH38vwBRCV4OS1o-fEgWAY7k4hCwdCsoAJjD8ono-YYDANOAA.&s=fa584117ee352a237773c5b4b837c831473e1af4",
+ "response_url": "http://nym1-mobile.adnxs.com/mediation/v2/log_resp?info=LwAAAAMABQEFAQiH38vwBRCV4OS1o-fEgWAY7k4hCwdCsoAJjD8ono-YYDANOAA.&s=fa584117ee352a237773c5b4b837c831473e1af4"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMInterstiatalAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMInterstiatalAd.json
new file mode 100755
index 000000000..9d7a3c00f
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMInterstiatalAd.json
@@ -0,0 +1,56 @@
+{
+ "version": "3.0.0",
+ "tags": [
+ {
+ "tag_id": 18144585,
+ "auction_id": "1741743309004110761",
+ "nobid": false,
+ "no_ad_url": "http://nym1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKNCKANBAAAAwDWAAUBCL3fy_AFEKn36bj7yfqVGBie4p7ovf_NlngqNgkAAAkCABEJBwgAABkJCQjgPyEJCQgAACkRCQAxCQnwfeA_MMm60wg47k5A7k5IAFAAWM6zbGAAaKSThgF4AIABAYoBAJIBA1VTRJgBAaABAagBBrABALgBAMABAMgBAtABANgBAOABAPABAIoCPHVmKCdhJywgMzM5MDc1MywgMTU3ODI5OTMyNSk7dWYoJ3InLCAyMDE3MjIwNDQsIC4fAPD1kgK1AiFVRDJXandqTzFkMFJFTHlSbUdBWUFDRE9zMnd3QURnQVFBUkk3azVReWJyVENGZ0FZSVlGYUFCd0FIZ0FnQUVBaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFGdUNIYVh1R09RUDhFQmJnaDJsN2hqa0RfSkFVNHVJcHJQbV9rXzJRRUFBQUFBQUFEd1AtQUJBUFVCd1IyRFBKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFPQUNBT2dDQVBnQ0FJQURBWmdEQWFnRHp0WGRFYm9EQ1U1WlRUSTZOREk0TS1BRC1SaUlCQUNRQkFDWUJBSEJCBUUJAQh5UVEJCQEBFE5nRUFQRRGNAZAsNEJBQ0lCYnNocVFVAREBFEB3UHcuLpoCiQEhclJLWkZRajI5AaB6ck5zSUFRb0FERjdGSzVINFhxRVB6b0pUbGxOTWpvME1qZ3pRUGtZUxF4DFBBX1URDAxBQUFXHQwAWR0MAGEdDABjHQz0DgFlQUEu2AIA4ALKqE3qAjRpdHVuZXMuYXBwbGUuY29tL3VzL2FwcC9hcHBuZXh1cy1zZGstYXBwL2lkNzM2ODY5ODMzgAMAiAMBkAMAmAMXoAMBqgMAwAPgqAHIAwHYA_mjeuADAOgDAvgDAIAEAJIEBi91dC92M5gEAKIEDDEwLjc1LjEwLjE0MagEiJoBsgQOCAAQARgAIAAoADAAOAK4BADABADIBADSBA8xMDA5NCNOWU0yOjQyODPaBAIIAOAEAPAEvJGYYPoEEgkAAABAluRCQBEAAADAAppewIIFCTczNjg2OTgzM4gFAZgFAKAF____________AcAFAMkFAAAAAAAA8D_SBQkJAAAAZWFw2AUB4AUB8AWNlwb6BQQIABAAkAYBmAYAuAYAwQYFIiwA8L_QBtYz2gYWChAJERkBUBAAGADgBgPyBgIIAIAHAYgHAKAHBQ..&s=2fc401f5b025ed9baeeeb2716cef352dcfe19596",
+ "timeout_ms": 0,
+ "ad_profile_id": 1266762,
+ "rtb_video_fallback": false,
+ "ads": [
+ {
+ "content_source": "csm",
+ "ad_type": "banner",
+ "buyer_member_id": 10094,
+ "creative_id": 201722044,
+ "media_type_id": 3,
+ "media_subtype_id": 5,
+ "brand_category_id": 53,
+ "client_initiated_ad_counting": false,
+ "csm": {
+ "banner": {
+ "content": "",
+ "width": 1,
+ "height": 1
+ },
+ "timeout_ms": 500,
+ "handler": [
+ {
+ "type": "ios",
+ "class": "ANAdAdapterInterstitialAdMob",
+ "id": "ca-app-pub-3940256099942544/4411468910"
+ },
+ {
+ "type": "android",
+ "class": "com.appnexus.opensdk.mediatedviews.AdMobInterstitial",
+ "id": "ca-app-pub-3940256099942544/1033173712"
+ }
+ ],
+ "trackers": [
+ {
+ "impression_urls": [
+ "http://nym1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKVCOgVBAAAAwDWAAUBCL3fy_AFEKn36bj7yfqVGBie4p7ovf_NlngqNglpxqLp7GSQPxFpxqLp7GSQPxkAAAECCOA_IREbACkRCQAxARm4AADgPzDJutMIOO5OQO5OSAJQvJGYYFjOs2xgAGikk4YBeJGlBYABAYoBA1VTRJIFBvBVmAEBoAEBqAEGsAEAuAEBwAEEyAEC0AEA2AEA4AEA8AEAigI8dWYoJ2EnLCAzMzkwNzUzLCAxNTc4Mjk5MzI1KTt1ZigncicsIDIwMTcyMjA0NCwgMTUZH_D1kgK1AiFVRDJXandqTzFkMFJFTHlSbUdBWUFDRE9zMnd3QURnQVFBUkk3azVReWJyVENGZ0FZSVlGYUFCd0FIZ0FnQUVBaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFGdUNIYVh1R09RUDhFQmJnaDJsN2hqa0RfSkFVNHVJcHJQbV9rXzJRRUFBQUFBQUFEd1AtQUJBUFVCd1IyRFBKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFPQUNBT2dDQVBnQ0FJQURBWmdEQWFnRHp0WGRFYm9EQ1U1WlRUSTZOREk0TS1BRC1SaUlCQUNRQkFDWUJBSEJCBUUJAQh5UVEJCQEBFE5nRUFQRRGNAZAsNEJBQ0lCYnNocVFVAREBFEB3UHcuLpoCiQEhclJLWkZRajI5AaB6ck5zSUFRb0FERjdGSzVINFhxRVB6b0pUbGxOTWpvME1qZ3pRUGtZUxF4DFBBX1URDAxBQUFXHQwAWR0MAGEdDABjHQz0DgFlQUEu2AIA4ALKqE3qAjRpdHVuZXMuYXBwbGUuY29tL3VzL2FwcC9hcHBuZXh1cy1zZGstYXBwL2lkNzM2ODY5ODMzgAMAiAMBkAMAmAMXoAMBqgMAwAPgqAHIAwHYA_mjeuADAOgDAvgDAIAEAJIEBi91dC92M5gEAKIEDDEwLjc1LjEwLjE0MagEiJoBsgQOCAAQARgAIAAoADAAOAK4BADABADIBADSBA8xMDA5NCNOWU0yOjQyODPaBAIIAOAEAfAEvJGYYPoEEgkAAABAluRCQBEAAADAAppewIIFCTczNjg2OTgzM4gFAZgFAKAF____________AcAFAMkFAAAAAAAA8D_SBQkJAAAAZWlw2AUB4AUB8AWNlwb6BQQIABAAkAYBmAYAuAYAwQYFIiwA8D_QBtYz2gYWChAJERkBUBAAGADgBgPyBgIIAIAHAYgHAKAHBQ..&s=0fc2be5f237c535c682b550d73fa8aee703ed1ca"
+ ],
+ "video_events": {}
+ }
+ ],
+ "request_url": "http://nym1-mobile.adnxs.com/mediation/v2/log_req?info=LwAAAAMABQEFAQi938vwBRCp9-m4-8n6lRgY7k4hacai6exkkD8ovJGYYDAKOAA.&s=8bbf9d0cd1194953c7f824f2b5f91dc93624a7dd",
+ "response_url": "http://nym1-mobile.adnxs.com/mediation/v2/log_resp?info=LwAAAAMABQEFAQi938vwBRCp9-m4-8n6lRgY7k4hacai6exkkD8ovJGYYDAKOAA.&s=8bbf9d0cd1194953c7f824f2b5f91dc93624a7dd"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMNativeAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMNativeAd.json
new file mode 100755
index 000000000..a183da222
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/CSMNativeAd.json
@@ -0,0 +1,56 @@
+{
+ "version": "3.0.0",
+ "tags": [
+ {
+ "tag_id": 18144598,
+ "auction_id": "8195076460992493534",
+ "nobid": false,
+ "no_ad_url": "http://nym1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKNCKANBAAAAwDWAAUBCJney_AFEN7v_aTz07DdcRie4p7ovf_NlngqNgkAAAkCABEJBwgAABkJCQjgPyEJCQgAACkRCQAxCQnwfeA_MNa60wg47k5A7k5IAFAAWM6zbGAAaKSThgF4AIABAYoBAJIBA1VTRJgBAaABAagBBrABALgBAMABAMgBAtABANgBAOABAPABAIoCPHVmKCdhJywgMzM5MDc1MywgMTU3ODI5OTE2MSk7dWYoJ3InLCAyMDE3MjI0MzUsIC4fAPD1kgK1AiFtajZNT1FqVTFkMFJFTU9VbUdBWUFDRE9zMnd3QURnQVFBUkk3azVRMXJyVENGZ0FZSVlGYUFCd0FIZ0FnQUVBaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFFUU9PVE5KN1NNUDhFQkVEamt6U2UwakRfSkFicVZnR0MtYlBZXzJRRUFBQUFBQUFEd1AtQUJBUFVCTjZGbFBKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFPQUNBT2dDQVBnQ0FJQURBWmdEQWFnRDFOWGRFYm9EQ1U1WlRUSTZOREl3T2VBRC1SaUlCQUNRQkFDWUJBSEJCBUUJAQh5UVEJCQEBFE5nRUFQRRGNPEFBQUQ0QkFDSUJmRWdxUVUBEQEUQHdQdy4umgKJASF1eExrR2dqMjkBoHpyTnNJQVFvQURGN0ZLNUg0WHFFUHpvSlRsbE5Nam8wTWpBNVFQa1lTEXgMUEFfVREMDEFBQVcdDABZHQwAYR0MAGMdDPQOAWVBQS7YAgDgAsqoTeoCNGl0dW5lcy5hcHBsZS5jb20vdXMvYXBwL2FwcG5leHVzLXNkay1hcHAvaWQ3MzY4Njk4MzOAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDAdgD-aN64AMA6AMC-AMAgAQAkgQGL3V0L3YzmAQAogQMMTAuNzUuMTAuMTQxqASGmgGyBA4IABABGAAgACgAMAA4ArgEAMAEAMgEANIEDzEwMDk0I05ZTTI6NDIwOdoEAggA4AQA8ATDlJhg-gQSCQAAAECW5EJAEQAAAMACml7AggUJNzM2ODY5ODMziAUBmAUAoAX___________8BwAUAyQUAAAAAAADwP9IFCQkAAABlYXDYBQHgBQHwBY2XBvoFBAgAEACQBgGYBgC4BgDBBgUiLADwv9AG1jPaBhYKEAkRGQFQEAAYAOAGDPIGAggAgAcBiAcAoAdB&s=b5d32852ea3b1bbcaa5a189bdf91a73f10c9b90c",
+ "timeout_ms": 0,
+ "ad_profile_id": 1266762,
+ "rtb_video_fallback": false,
+ "ads": [
+ {
+ "content_source": "csm",
+ "ad_type": "native",
+ "buyer_member_id": 10094,
+ "creative_id": 201722435,
+ "media_type_id": 12,
+ "media_subtype_id": 65,
+ "brand_category_id": 53,
+ "client_initiated_ad_counting": true,
+ "viewability": {
+ "config": ""
+ },
+ "csm": {
+ "timeout_ms": 500,
+ "handler": [
+ {
+ "type": "ios",
+ "class": "ANAdAdapterNativeAdMob",
+ "param": "",
+ "id": "ca-app-pub-3940256099942544/3986624511"
+ },
+ {
+ "type": "android",
+ "class": "com.appnexus.opensdk.mediatednativead.AdMobNativeAd",
+ "param": "",
+ "id": "ca-app-pub-3940256099942544/2247696110"
+ }
+ ],
+ "trackers": [
+ {
+ "impression_urls": [
+ "http://nym1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKVCOgVBAAAAwDWAAUBCJney_AFEN7v_aTz07DdcRie4p7ovf_NlngqNgktW-uLhLaMPxEtW-uLhLaMPxkAAAECCOA_IREbACkRCQAxARm4AADgPzDWutMIOO5OQO5OSAJQw5SYYFjOs2xgAGikk4YBeN6RBYABAYoBA1VTRJIFBvBVmAEBoAEBqAEGsAEAuAEAwAEEyAEC0AEA2AEA4AEA8AEAigI8dWYoJ2EnLCAzMzkwNzUzLCAxNTc4Mjk5MTYxKTt1ZigncicsIDIwMTcyMjQzNSwgMTUZH_D1kgK1AiFtajZNT1FqVTFkMFJFTU9VbUdBWUFDRE9zMnd3QURnQVFBUkk3azVRMXJyVENGZ0FZSVlGYUFCd0FIZ0FnQUVBaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFFUU9PVE5KN1NNUDhFQkVEamt6U2UwakRfSkFicVZnR0MtYlBZXzJRRUFBQUFBQUFEd1AtQUJBUFVCTjZGbFBKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFPQUNBT2dDQVBnQ0FJQURBWmdEQWFnRDFOWGRFYm9EQ1U1WlRUSTZOREl3T2VBRC1SaUlCQUNRQkFDWUJBSEJCBUUJAQh5UVEJCQEBFE5nRUFQRRGNPEFBQUQ0QkFDSUJmRWdxUVUBEQEUQHdQdy4umgKJASF1eExrR2dqMjkBoHpyTnNJQVFvQURGN0ZLNUg0WHFFUHpvSlRsbE5Nam8wTWpBNVFQa1lTEXgMUEFfVREMDEFBQVcdDABZHQwAYR0MAGMdDPQOAWVBQS7YAgDgAsqoTeoCNGl0dW5lcy5hcHBsZS5jb20vdXMvYXBwL2FwcG5leHVzLXNkay1hcHAvaWQ3MzY4Njk4MzOAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDAdgD-aN64AMA6AMC-AMAgAQAkgQGL3V0L3YzmAQAogQMMTAuNzUuMTAuMTQxqASGmgGyBA4IABABGAAgACgAMAA4ArgEAMAEAMgEANIEDzEwMDk0I05ZTTI6NDIwOdoEAggB4AQA8ATDlJhg-gQSCQAAAECW5EJAEQAAAMACml7AggUJNzM2ODY5ODMziAUBmAUAoAX___________8BwAUAyQUAAAAAAADwP9IFCQkAAABlaXDYBQHgBQHwBY2XBvoFBAgAEACQBgGYBgC4BgDBBgUiLADwP9AG1jPaBhYKEAkRGQFQEAAYAOAGDPIGAggAgAcBiAcAoAdB&s=0570e781603fc61a0a13795369e56d18b174b362"
+ ],
+ "video_events": {}
+ }
+ ],
+ "request_url": "http://nym1-mobile.adnxs.com/mediation/v2/log_req?info=LwAAAAMABQEFAQiZ3svwBRDe7_2k89Ow3XEY7k4hLVvri4S2jD8ow5SYYDBaOAA.&s=0ef93d82d284a01bfe1b6f1a2f144fa1e38ff2f0",
+ "response_url": "http://nym1-mobile.adnxs.com/mediation/v2/log_resp?info=LwAAAAMABQEFAQiZ3svwBRDe7_2k89Ow3XEY7k4hLVvri4S2jD8ow5SYYDBaOAA.&s=0ef93d82d284a01bfe1b6f1a2f144fa1e38ff2f0"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerAd.json
new file mode 100755
index 000000000..90bcead13
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerAd.json
@@ -0,0 +1,39 @@
+{
+ "version": "0.0.1",
+ "tags": [
+ {
+ "tag_id": 13457285,
+ "auction_id": "2291993975392492012",
+ "nobid": false,
+ "no_ad_url": "http://nym1-ib.adnxs.com/it?e=wqT_3QLLBmxLAwAAAwDWAAUBCPqkptkFEOyz69SIjLPnHxj_EQEQASo2CQANAQARDQgEABkRCQAhEQkAKREJADERCfB7MIWvtQY4vgdAvgdIAFAAWPfiP2AAaJFAeACAAQGSAQNVU0SYAawCoAH6AagBAbABALgBAcABAMgBAtABANgBAOABAPABAIoCPHVmKCdhJywgMTEwNzYxNywgMTUyOTQ1MTEzMCk7dWYoJ3InLCAxMDIwNzA4MjksIDE1MhUf8JySAvkBIU5qdWd5Z2lmMnVrS0VLMzAxVEFZQUNEMzRqOHdBRGdBUUFSSXZnZFFoYS0xQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFaZmk4WFhnd2UwXzJRRUFBQUFBQUFEd1AtQUJBUFVCBQ8oSmdDQUtBQ0FMVUMFEARMMAkI8ExNQUNBY2dDQWRBQ0FkZ0NBZUFDQU9nQ0FQZ0NBSUFEQVpBREFKZ0RBYWdEbjlycENyb0RDVTVaVFRJNk16WXpOUS4umgItIUd3cFB0Zzb8APDkOS1JX0lBUW9BRG9KVGxsTk1qb3pOak0x2ALoB-ACx9MB6gI9cGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD1jb20uYXBwbmV4dXMub3BlbnNka2FwcIADAYgDAZADAJgDF6ADAaoDAMADrALIAwDYA_zgWeADAOgDAvgDAIAEAJIEBi91dC92MpgEAKIECjEwLjEuMTMuNTaoBACyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQNOTU4I05ZTTI6MzYzNdoEAggA4AQB8ASt9NUw-gQSCUWHCEBKQEG0KMDMzCpAggUXY29tTq8AHIgFAZgFAKAFUfMY_wHABQDJBQVCFADwP9IFCXUCYNgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgE.&s=5fd01dbe8aba75c8a527ef1fa733fcb84ec8dd0c&referrer=play.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.appnexus.opensdkapp",
+ "timeout_ms": 10000,
+ "ad_profile_id": 27079,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "banner",
+ "buyer_member_id": 958,
+ "creative_id": 102070829,
+ "media_type_id": 1,
+ "media_subtype_id": 1,
+ "client_initiated_ad_counting": true,
+ "rtb": {
+ "banner": {
+ "content": "",
+ "width": 300,
+ "height": 250
+ },
+ "trackers": [
+ {
+ "impression_urls": [
+ "http://nym1-ib.adnxs.com/it?e=wqT_3QLWBmxWAwAAAwDWAAUBCPqkptkFEOyz69SIjLPnHxj_EQEwASo2CXsUrkfheoQ_EREJBBkADQEAIRESACkRCQAxDRqoADCFr7UGOL4HQL4HSAJQrfTVMFj34j9gAGiRQHjH0wSAAQGKAQNVU0SSAQEG9GgBmAGsAqAB-gGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjx1ZignYScsIDExMDc2MTcsIDE1Mjk0NTExMzApO3VmKCdyJywgMTAyMDcwODI5LCAxNTI5NDUxMTMwKTuSAvkBIU5qdWd5Z2lmMnVrS0VLMzAxVEFZQUNEMzRqOHdBRGdBUUFSSXZnZFFoYS0xQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFaZmk4WFhnd2UwXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFNQUNBY2dDQWRBQ0FkZ0NBZUFDQU9nQ0FQZ0NBSUFEQVpBREFKZ0RBYWdEbjlycENyb0RDVTVaVFRJNk16WXpOUS4umgItIUd3cFB0Zzb8APDcOS1JX0lBUW9BRG9KVGxsTk1qb3pOak0x2ALoB-ACx9MB6gI9cGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD1jb20uYXBwbmV4dXMub3BlbnNka2FwcIADAYgDAZADAJgDF6ADAaoDAMADrALIAwDYA_zgWeADAOgDAvgDAIAEAJIEBi91dC92MpgEAKIECjEwLjEuMTMuNTaoBACyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQNOTU4I05ZTTI6MzYzNdoEAggB4AQB8ARBdAz6BBIJRZJEQEpAEQAAAMDMzCpAggUXY29tTq8AHIgFAZgFAKAFUf4Y_wHABQDJBQVCFADwP9IFCQlObAAAANgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgE.&s=c60bf8485daaa47c88843086734eff52180ae5a5&referrer=play.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.appnexus.opensdkapp"
+ ],
+ "video_events": {}
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerNativeAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerNativeAd.json
new file mode 100755
index 000000000..7796e2827
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerNativeAd.json
@@ -0,0 +1,58 @@
+{
+ "version": "3.0.0",
+ "tags": [
+ {
+ "tag_id": 15740033,
+ "auction_id": "3579836792830527402",
+ "nobid": false,
+ "no_ad_url": "https://sin1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKtCKAtBAAAAwDWAAUBCIG7rucFEKqPprSK04jXMRi1zICs5JfXxSYqNgkAAAkCABEJBywAABkAAABA4XqEPyEREgApEQkAMREb8JowgdnABzjuTkDuTkgAUABYzrNsYABopJOGAXgAgAEBigEAkgEDVVNEmAEBoAEBqAEBsAEAuAEBwAEAyAEC0AEA2AEA4AEA8AEAigJZdWYoJ2EnLCAzMDM4MzE0LCAxNTU4OTQ1MTUzKTt1ZignaScsIDEwMDg3NzgsIDE1NTg5NDUxNTMpO3VmKCdyJywgMTU0NDg1ODA3LCAxNRk88JqSApECIXJ6N1J3UWlIaS1FTkVLLUkxVWtZQUNET3Myd3dBRGdBUUFSSTdrNVFnZG5BQjFnQVlLVUZhQUJ3QUhnQWdBRUFpQUVBa0FFQm1BRUJvQUVCcUFFRHNBRUF1UUdSN3dydzRYcUVQOEVCa2U4SzhPRjZoRF9KQVNSRzBvREZWUUJBMlFFQUFBQUFBQUR3UC1BQmlzazk5UQkULG1BSUFvQUlBdFFJQQEBAHYNCJh3QUlBeUFJQTBBSUEyQUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQU8F1Oh1Z01KVTBsT01Ub3pOVGMxNEFQTURJQUU4OERrQVlnRTljRGtBWkFFQUpnRUFRLi6aAmEhT0JDSDVnaQVAMRRAenJOc0lBUW9BREY3Rks1SDQB2AR6bzJcABRRTXdNU1EBqhhBQUFQQV9VEQwMQUFBVx0M9DQB2AIA4ALKqE3qAjRpdHVuZXMuYXBwbGUuY29tL3VzL2FwcC9hcHBuZXh1cy1zZGstYXBwL2lkNzM2ODY5ODMzgAMAiAMBkAMAmAMXoAMBqgMAwAOsAsgDANIDKAgAEiQ1MzYzOTYzYi02MWVhLTRiZmUtYjczMS05ZGE1MGFhNTJhYmPSAygIChIkZWY1NDA0ZTQtM2NmOS00YzNiLTkzNTAtYjRhOWE5YzA0YjU12AP5o3rgAwDoAwL4AwCABACSBAYvdXQvdjOYBACiBAsxMC4xNC4xMi40NagEhOYisgQQCAAQARisAiD6ASgAMAA4ArgEAMAEAMgEANIEDzEwMDk0I1NJTjE6MzU3NdoEAggA4AQB8ASviNVJ-gQSCQAAAECW5EJAEQAAAMACml7AggUJNzM2CfwgiAUBmAUAoAX_EQEYAcAFAMkFAAUBFPA_0gUJCQULdAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgC4BgDBBgEfLAAA8L_IBgDaBhYKEAkQGQFEEAAYAOAGDPIGAggAgAcBiAcA&s=6f2fa33f3b83d94aacc2346e5345dead47934579",
+ "timeout_ms": 0,
+ "ad_profile_id": 1266762,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "native",
+ "buyer_member_id": 10094,
+ "creative_id": 154485807,
+ "media_type_id": 12,
+ "media_subtype_id": 65,
+ "brand_category_id": 0,
+ "client_initiated_ad_counting": true,
+ "viewability": {
+ "config": ""
+ },
+ "rtb": {
+ "native": {
+ "title": "Native Renderer Title",
+ "desc": "Native Renderer Desc",
+ "sponsored": "Abhishek Sharma",
+ "ctatext": "NativeRendererCampaign",
+ "icon": {
+ "url": "https://vcdn.adnxs.com/p/creative-image/73/0d/53/85/730d5385-8952-4f74-9700-693fe2f17da0.png",
+ "width": 868,
+ "height": 996,
+ "prevent_crop": false
+ },
+ "main_img": {
+ "url": "https://vcdn.adnxs.com/p/creative-image/66/91/f0/ab/6691f0ab-d2a3-47c8-a1fb-dfdac2a80cc2.png",
+ "width": 868,
+ "height": 996,
+ "prevent_crop": false
+ },
+ "link": {
+ "url": "https://appnexus.com",
+ "click_trackers": [
+ "https://sin1-mobile.adnxs.com/click?exSuR-F6hD97FK5H4XqEPwAAAEDheoQ_exSuR-F6hD97FK5H4XqEP6qHiaaYIq4xNSaARb5ciyaBnetcAAAAAIEs8ABuJwAAbicAAAIAAAAvRDUJzhkbAAAAAABVU0QAVVNEAAEAAQCkiQAAAAABAQQCAAAAAMIAfSJ4VQAAAAA./cpcpm=AAAAAAAAAAA=/bcr=AAAAAAAA8D8=/cnd=%21OBCH5giHi-ENEK-I1UkYzrNsIAQoADF7FK5H4XqEPzoJU0lOMTozNTc1QMwMSQAAAAAAAPA_UQAAAAAAAAAAWQAAAAAAAAAA/cca=MTAwOTQjU0lOMTozNTc1/bn=86603/"
+ ]
+ },
+ "impression_trackers": [
+ "https://sin1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QK2CPA8NgQAAAMA1gAFAQiBu67nBRCqj6a0itOI1zEYtcyArOSX18UmKjYJexSuR-F6hD8RexSuR-F6hD8ZAAAAQAESACERGwApEQkAMREbqDCB2cAHOO5OQO5OSAJQr4jVSVjOs2xgAGikk4YBeMukBYABAYoBA1VTRJIFBvBPmAEBoAEBqAEBsAEAuAEBwAEEyAEC0AEA2AEA4AEA8AEAigJZdWYoJ2EnLCAzMDM4MzE0LCAxNTU4OTQ1MTUzKTt1ZignaScsIDEwMDg3NzhGHQAEcicBFBg0NDg1ODA3AQsZPPCakgKRAiFyejdSd1FpSGktRU5FSy1JMVVrWUFDRE9zMnd3QURnQVFBUkk3azVRZ2RuQUIxZ0FZS1VGYUFCd0FIZ0FnQUVBaUFFQWtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFTUkcwb0RGVlFCQTJRRUFBQUFBQUFEd1AtQUJpc2s5OVEJFCxtQUlBb0FJQXRRSUEBAQB2DQiYd0FJQXlBSUEwQUlBMkFJQTRBSUE2QUlBLUFJQWdBTUJtQU1CcUFPBdTodWdNSlUwbE9NVG96TlRjMTRBUE1ESUFFODhEa0FZZ0U5Y0RrQVpBRUFKZ0VBUS4umgJhIU9CQ0g1Z2kFQDEUQHpyTnNJQVFvQURGN0ZLNUg0AdgEem8yXAAUUU13TVNRAaoYQUFBUEFfVREMDEFBQVcdDPReAdgCAOACyqhN6gI0aXR1bmVzLmFwcGxlLmNvbS91cy9hcHAvYXBwbmV4dXMtc2RrLWFwcC9pZDczNjg2OTgzM4ADAIgDAZADAJgDF6ADAaoDAMAD4KgByAMA0gMoCAASJDUzNjM5NjNiLTYxZWEtNGJmZS1iNzMxLTlkYTUwYWE1MmFiY9IDKAgKEiRlZjU0MDRlNC0zY2Y5LTRjM2ItOTM1MC1iNGE5YTljMDRiNTXYA_mjeuADAOgDAvgDAIAEAJIEBi91dC92M5gEAKIECzEwLjE0LjEyLjQ1qASE5iKyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQPMTAwOTQjU0lOMTozNTc12gQCCAHgBAHwBK-I1Un6BBIJAAAAQJbkQkARAAAAwAKaXsCCBQk3MzY4Njk4MzOIBQGYBQCgBf___________wHABQDJBQAAAAAAAPA_0gUJCQULdAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgC4BgDBBgEfLAAA8D_IBgDaBhYKEAkQGQFEEAAYAOAGDPIGAggAgAcBiAcA&s=91d3af1f75b86ccc77cdf065374aa86b1385b11f"
+ ],
+ "id": 154485807
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerNativeRendererAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerNativeRendererAd.json
new file mode 100644
index 000000000..c36244b21
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerNativeRendererAd.json
@@ -0,0 +1,60 @@
+{
+ "version": "3.0.0",
+ "tags": [
+ {
+ "tag_id": 15740033,
+ "auction_id": "3579836792830527402",
+ "nobid": false,
+ "no_ad_url": "https://sin1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKtCKAtBAAAAwDWAAUBCIG7rucFEKqPprSK04jXMRi1zICs5JfXxSYqNgkAAAkCABEJBywAABkAAABA4XqEPyEREgApEQkAMREb8JowgdnABzjuTkDuTkgAUABYzrNsYABopJOGAXgAgAEBigEAkgEDVVNEmAEBoAEBqAEBsAEAuAEBwAEAyAEC0AEA2AEA4AEA8AEAigJZdWYoJ2EnLCAzMDM4MzE0LCAxNTU4OTQ1MTUzKTt1ZignaScsIDEwMDg3NzgsIDE1NTg5NDUxNTMpO3VmKCdyJywgMTU0NDg1ODA3LCAxNRk88JqSApECIXJ6N1J3UWlIaS1FTkVLLUkxVWtZQUNET3Myd3dBRGdBUUFSSTdrNVFnZG5BQjFnQVlLVUZhQUJ3QUhnQWdBRUFpQUVBa0FFQm1BRUJvQUVCcUFFRHNBRUF1UUdSN3dydzRYcUVQOEVCa2U4SzhPRjZoRF9KQVNSRzBvREZWUUJBMlFFQUFBQUFBQUR3UC1BQmlzazk5UQkULG1BSUFvQUlBdFFJQQEBAHYNCJh3QUlBeUFJQTBBSUEyQUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQU8F1Oh1Z01KVTBsT01Ub3pOVGMxNEFQTURJQUU4OERrQVlnRTljRGtBWkFFQUpnRUFRLi6aAmEhT0JDSDVnaQVAMRRAenJOc0lBUW9BREY3Rks1SDQB2AR6bzJcABRRTXdNU1EBqhhBQUFQQV9VEQwMQUFBVx0M9DQB2AIA4ALKqE3qAjRpdHVuZXMuYXBwbGUuY29tL3VzL2FwcC9hcHBuZXh1cy1zZGstYXBwL2lkNzM2ODY5ODMzgAMAiAMBkAMAmAMXoAMBqgMAwAOsAsgDANIDKAgAEiQ1MzYzOTYzYi02MWVhLTRiZmUtYjczMS05ZGE1MGFhNTJhYmPSAygIChIkZWY1NDA0ZTQtM2NmOS00YzNiLTkzNTAtYjRhOWE5YzA0YjU12AP5o3rgAwDoAwL4AwCABACSBAYvdXQvdjOYBACiBAsxMC4xNC4xMi40NagEhOYisgQQCAAQARisAiD6ASgAMAA4ArgEAMAEAMgEANIEDzEwMDk0I1NJTjE6MzU3NdoEAggA4AQB8ASviNVJ-gQSCQAAAECW5EJAEQAAAMACml7AggUJNzM2CfwgiAUBmAUAoAX_EQEYAcAFAMkFAAUBFPA_0gUJCQULdAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgC4BgDBBgEfLAAA8L_IBgDaBhYKEAkQGQFEEAAYAOAGDPIGAggAgAcBiAcA&s=6f2fa33f3b83d94aacc2346e5345dead47934579",
+ "timeout_ms": 0,
+ "ad_profile_id": 1266762,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "native",
+ "buyer_member_id": 10094,
+ "creative_id": 154485807,
+ "media_type_id": 12,
+ "media_subtype_id": 65,
+ "brand_category_id": 0,
+ "renderer_url": "https://dcdn.adnxs.com/renderer-content/b6da3b80-39c5-43f0-a37d-bbfa6a348aed",
+ "renderer_id": 258,
+ "client_initiated_ad_counting": true,
+ "viewability": {
+ "config": ""
+ },
+ "rtb": {
+ "native": {
+ "title": "Native Renderer Campaign",
+ "desc": "Native Renderer Campaign",
+ "sponsored": "Abhishek Sharma",
+ "ctatext": "NativeRendererCampaign",
+ "icon": {
+ "url": "https://vcdn.adnxs.com/p/creative-image/73/0d/53/85/730d5385-8952-4f74-9700-693fe2f17da0.png",
+ "width": 868,
+ "height": 996,
+ "prevent_crop": false
+ },
+ "main_img": {
+ "url": "https://vcdn.adnxs.com/p/creative-image/66/91/f0/ab/6691f0ab-d2a3-47c8-a1fb-dfdac2a80cc2.png",
+ "width": 868,
+ "height": 996,
+ "prevent_crop": false
+ },
+ "link": {
+ "url": "https://appnexus.com",
+ "click_trackers": [
+ "https://sin1-mobile.adnxs.com/click?exSuR-F6hD97FK5H4XqEPwAAAEDheoQ_exSuR-F6hD97FK5H4XqEP6qHiaaYIq4xNSaARb5ciyaBnetcAAAAAIEs8ABuJwAAbicAAAIAAAAvRDUJzhkbAAAAAABVU0QAVVNEAAEAAQCkiQAAAAABAQQCAAAAAMIAfSJ4VQAAAAA./cpcpm=AAAAAAAAAAA=/bcr=AAAAAAAA8D8=/cnd=%21OBCH5giHi-ENEK-I1UkYzrNsIAQoADF7FK5H4XqEPzoJU0lOMTozNTc1QMwMSQAAAAAAAPA_UQAAAAAAAAAAWQAAAAAAAAAA/cca=MTAwOTQjU0lOMTozNTc1/bn=86603/"
+ ]
+ },
+ "impression_trackers": [
+ "https://sin1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QK2CPA8NgQAAAMA1gAFAQiBu67nBRCqj6a0itOI1zEYtcyArOSX18UmKjYJexSuR-F6hD8RexSuR-F6hD8ZAAAAQAESACERGwApEQkAMREbqDCB2cAHOO5OQO5OSAJQr4jVSVjOs2xgAGikk4YBeMukBYABAYoBA1VTRJIFBvBPmAEBoAEBqAEBsAEAuAEBwAEEyAEC0AEA2AEA4AEA8AEAigJZdWYoJ2EnLCAzMDM4MzE0LCAxNTU4OTQ1MTUzKTt1ZignaScsIDEwMDg3NzhGHQAEcicBFBg0NDg1ODA3AQsZPPCakgKRAiFyejdSd1FpSGktRU5FSy1JMVVrWUFDRE9zMnd3QURnQVFBUkk3azVRZ2RuQUIxZ0FZS1VGYUFCd0FIZ0FnQUVBaUFFQWtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFTUkcwb0RGVlFCQTJRRUFBQUFBQUFEd1AtQUJpc2s5OVEJFCxtQUlBb0FJQXRRSUEBAQB2DQiYd0FJQXlBSUEwQUlBMkFJQTRBSUE2QUlBLUFJQWdBTUJtQU1CcUFPBdTodWdNSlUwbE9NVG96TlRjMTRBUE1ESUFFODhEa0FZZ0U5Y0RrQVpBRUFKZ0VBUS4umgJhIU9CQ0g1Z2kFQDEUQHpyTnNJQVFvQURGN0ZLNUg0AdgEem8yXAAUUU13TVNRAaoYQUFBUEFfVREMDEFBQVcdDPReAdgCAOACyqhN6gI0aXR1bmVzLmFwcGxlLmNvbS91cy9hcHAvYXBwbmV4dXMtc2RrLWFwcC9pZDczNjg2OTgzM4ADAIgDAZADAJgDF6ADAaoDAMAD4KgByAMA0gMoCAASJDUzNjM5NjNiLTYxZWEtNGJmZS1iNzMxLTlkYTUwYWE1MmFiY9IDKAgKEiRlZjU0MDRlNC0zY2Y5LTRjM2ItOTM1MC1iNGE5YTljMDRiNTXYA_mjeuADAOgDAvgDAIAEAJIEBi91dC92M5gEAKIECzEwLjE0LjEyLjQ1qASE5iKyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQPMTAwOTQjU0lOMTozNTc12gQCCAHgBAHwBK-I1Un6BBIJAAAAQJbkQkARAAAAwAKaXsCCBQk3MzY4Njk4MzOIBQGYBQCgBf___________wHABQDJBQAAAAAAAPA_0gUJCQULdAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgC4BgDBBgEfLAAA8D_IBgDaBhYKEAkQGQFEEAAYAOAGDPIGAggAgAcBiAcA&s=91d3af1f75b86ccc77cdf065374aa86b1385b11f"
+ ],
+ "id": 154485807
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerVideoAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerVideoAd.json
new file mode 100755
index 000000000..26d7d4b15
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBBannerVideoAd.json
@@ -0,0 +1,38 @@
+{
+ "version": "0.0.1",
+ "tags": [
+ {
+ "tag_id": 9887537,
+ "auction_id": "4584035484591692222",
+ "nobid": false,
+ "no_ad_url": "http://sin1-mobile.adnxs.com/it?e=wqT_3QLRBqBRAwAAAwDWAAUBCM7AsNUFEL6z_sbG__DOPxio2pHdrJ_hhhYqNgkAAAkCABEJBywAABkAAACA61HgPyEREgApEQkAMREb8GMwsb7bBDi-B0C-B0gAUABY7_U-YABokUB4AIABAZIBA1VTRJgBAaABAagBAbABALgBAMABAMgBAtABANgBAOABAPABAIoCO3VmKCdhJywgMTA4NTgwOSwgMTUyMTIyOTkwMik7AR0wcicsIDY1NTg4NzE2LDIeAPCNkgL5ASFHRGc4UmdqOTNyQUdFT3lib3g4WUFDRHY5VDR3QURnQVFBUkl2Z2RRc2I3YkJGZ0FZUGdCYUFCd0pIalNSNEFCU29nQjBrZVFBUUdZQVFHZ0FRR29BUU93QVFDNUFTbUxpSU1BQU9BX3dRRXBpNGlEQUFEZ1A4a0JkdDhpWHZYeTB6X1pBUUFBQQEDJFBBXzRBRUE5UUUBDixBbUFJQW9BSUF0UUkFEAB2DQiId0FJQXlBSUE0QUlBNkFJQS1BSUFnQU1Ca0FNQW1BTUJxQVAF0Jh1Z01SWkdWbVlYVnNkQ05UU1U0eE9qTTFOakkumgI5IThRelJHd2oFLBH8KDdfVS1JQVFvQURvYjwAiNgC6AfgAsfTAeoCNGl0dW5lcy5hcHBsZS5jb20vdXMvYXBwAQQkbmV4dXMtc2RrLQER8LppZDczNjg2OTgzM4ADAYgDAZADAJgDF6ADAaoDAMADrALIAwDSAygIABIkZWNjZDk2MmYtZTA3Ny00MDA2LTlkNWYtZGRlNmEyM2ZjM2Ew2AP5o3rgAwDoAwL4AwCABACSBAYvdXQvdjKYBACiBAkxMC4xNC44LjGoBOhksgQOCAAQARisAiD6ATAAOAK4BADABADIBADSBBFkZWZhdWx0I1NJTjE6MzU2MtoEAggA4AQA8ATsm6MfggUJFbkgiAUBmAUAoAX_EQEYAcAFAMkFAAUBFPA_0gUJCQULYAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgA.&s=be77947eeb499e8d243abcae8af36bb8fb1e24e8&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833",
+ "timeout_ms": 10000,
+ "ad_profile_id": 27079,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "video",
+ "notify_url": "http://sin1-mobile.adnxs.com/vast_track/v2?info=YwAAAAMArgAFAQlOIKxaAAAAABG-md9o_MOdPxlOIKxaAAAAACDsm6MfKAAwvgc4vgdA1q4xSJn7hwFQsb7bBFgBYgItLWgBcAF4AIABAIgBAJABrAKYAfoBoAEAqAHsm6Mf&event_type=1",
+ "usersync_url": "http%3A%2F%2Facdn.adnxs.com%2Fib%2Fstatic%2Fusersync%2Fv4%2Fasync_usersync.html",
+ "buyer_member_id": 958,
+ "creative_id": 65588716,
+ "media_type_id": 4,
+ "media_subtype_id": 64,
+ "client_initiated_ad_counting": true,
+ "rtb": {
+ "video": {
+ "player_width": 300,
+ "player_height": 250,
+ "duration_ms": 145000,
+ "playback_methods": [
+ "unknown"
+ ],
+ "frameworks": [],
+ "content": "adnxs00:00:00"
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBInterstitialAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBInterstitialAd.json
new file mode 100755
index 000000000..834e7bdd8
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBInterstitialAd.json
@@ -0,0 +1,39 @@
+{
+ "version": "0.0.1",
+ "tags": [
+ {
+ "tag_id": 13457285,
+ "auction_id": "2291993975392492012",
+ "nobid": false,
+ "no_ad_url": "http://nym1-ib.adnxs.com/it?e=wqT_3QLLBmxLAwAAAwDWAAUBCPqkptkFEOyz69SIjLPnHxj_EQEQASo2CQANAQARDQgEABkRCQAhEQkAKREJADERCfB7MIWvtQY4vgdAvgdIAFAAWPfiP2AAaJFAeACAAQGSAQNVU0SYAawCoAH6AagBAbABALgBAcABAMgBAtABANgBAOABAPABAIoCPHVmKCdhJywgMTEwNzYxNywgMTUyOTQ1MTEzMCk7dWYoJ3InLCAxMDIwNzA4MjksIDE1MhUf8JySAvkBIU5qdWd5Z2lmMnVrS0VLMzAxVEFZQUNEMzRqOHdBRGdBUUFSSXZnZFFoYS0xQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFaZmk4WFhnd2UwXzJRRUFBQUFBQUFEd1AtQUJBUFVCBQ8oSmdDQUtBQ0FMVUMFEARMMAkI8ExNQUNBY2dDQWRBQ0FkZ0NBZUFDQU9nQ0FQZ0NBSUFEQVpBREFKZ0RBYWdEbjlycENyb0RDVTVaVFRJNk16WXpOUS4umgItIUd3cFB0Zzb8APDkOS1JX0lBUW9BRG9KVGxsTk1qb3pOak0x2ALoB-ACx9MB6gI9cGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD1jb20uYXBwbmV4dXMub3BlbnNka2FwcIADAYgDAZADAJgDF6ADAaoDAMADrALIAwDYA_zgWeADAOgDAvgDAIAEAJIEBi91dC92MpgEAKIECjEwLjEuMTMuNTaoBACyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQNOTU4I05ZTTI6MzYzNdoEAggA4AQB8ASt9NUw-gQSCUWHCEBKQEG0KMDMzCpAggUXY29tTq8AHIgFAZgFAKAFUfMY_wHABQDJBQVCFADwP9IFCXUCYNgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgE.&s=5fd01dbe8aba75c8a527ef1fa733fcb84ec8dd0c&referrer=play.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.appnexus.opensdkapp",
+ "timeout_ms": 10000,
+ "ad_profile_id": 27079,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "banner",
+ "buyer_member_id": 958,
+ "creative_id": 102070829,
+ "media_type_id": 3,
+ "media_subtype_id": 5,
+ "client_initiated_ad_counting": true,
+ "rtb": {
+ "banner": {
+ "content": "",
+ "width": 300,
+ "height": 250
+ },
+ "trackers": [
+ {
+ "impression_urls": [
+ "http://nym1-ib.adnxs.com/it?e=wqT_3QLWBmxWAwAAAwDWAAUBCPqkptkFEOyz69SIjLPnHxj_EQEwASo2CXsUrkfheoQ_EREJBBkADQEAIRESACkRCQAxDRqoADCFr7UGOL4HQL4HSAJQrfTVMFj34j9gAGiRQHjH0wSAAQGKAQNVU0SSAQEG9GgBmAGsAqAB-gGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjx1ZignYScsIDExMDc2MTcsIDE1Mjk0NTExMzApO3VmKCdyJywgMTAyMDcwODI5LCAxNTI5NDUxMTMwKTuSAvkBIU5qdWd5Z2lmMnVrS0VLMzAxVEFZQUNEMzRqOHdBRGdBUUFSSXZnZFFoYS0xQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFaZmk4WFhnd2UwXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFNQUNBY2dDQWRBQ0FkZ0NBZUFDQU9nQ0FQZ0NBSUFEQVpBREFKZ0RBYWdEbjlycENyb0RDVTVaVFRJNk16WXpOUS4umgItIUd3cFB0Zzb8APDcOS1JX0lBUW9BRG9KVGxsTk1qb3pOak0x2ALoB-ACx9MB6gI9cGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD1jb20uYXBwbmV4dXMub3BlbnNka2FwcIADAYgDAZADAJgDF6ADAaoDAMADrALIAwDYA_zgWeADAOgDAvgDAIAEAJIEBi91dC92MpgEAKIECjEwLjEuMTMuNTaoBACyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQNOTU4I05ZTTI6MzYzNdoEAggB4AQB8ARBdAz6BBIJRZJEQEpAEQAAAMDMzCpAggUXY29tTq8AHIgFAZgFAKAFUf4Y_wHABQDJBQVCFADwP9IFCQlObAAAANgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgE.&s=c60bf8485daaa47c88843086734eff52180ae5a5&referrer=play.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.appnexus.opensdkapp"
+ ],
+ "video_events": {}
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBNativeAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBNativeAd.json
new file mode 100755
index 000000000..7796e2827
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBNativeAd.json
@@ -0,0 +1,58 @@
+{
+ "version": "3.0.0",
+ "tags": [
+ {
+ "tag_id": 15740033,
+ "auction_id": "3579836792830527402",
+ "nobid": false,
+ "no_ad_url": "https://sin1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKtCKAtBAAAAwDWAAUBCIG7rucFEKqPprSK04jXMRi1zICs5JfXxSYqNgkAAAkCABEJBywAABkAAABA4XqEPyEREgApEQkAMREb8JowgdnABzjuTkDuTkgAUABYzrNsYABopJOGAXgAgAEBigEAkgEDVVNEmAEBoAEBqAEBsAEAuAEBwAEAyAEC0AEA2AEA4AEA8AEAigJZdWYoJ2EnLCAzMDM4MzE0LCAxNTU4OTQ1MTUzKTt1ZignaScsIDEwMDg3NzgsIDE1NTg5NDUxNTMpO3VmKCdyJywgMTU0NDg1ODA3LCAxNRk88JqSApECIXJ6N1J3UWlIaS1FTkVLLUkxVWtZQUNET3Myd3dBRGdBUUFSSTdrNVFnZG5BQjFnQVlLVUZhQUJ3QUhnQWdBRUFpQUVBa0FFQm1BRUJvQUVCcUFFRHNBRUF1UUdSN3dydzRYcUVQOEVCa2U4SzhPRjZoRF9KQVNSRzBvREZWUUJBMlFFQUFBQUFBQUR3UC1BQmlzazk5UQkULG1BSUFvQUlBdFFJQQEBAHYNCJh3QUlBeUFJQTBBSUEyQUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQU8F1Oh1Z01KVTBsT01Ub3pOVGMxNEFQTURJQUU4OERrQVlnRTljRGtBWkFFQUpnRUFRLi6aAmEhT0JDSDVnaQVAMRRAenJOc0lBUW9BREY3Rks1SDQB2AR6bzJcABRRTXdNU1EBqhhBQUFQQV9VEQwMQUFBVx0M9DQB2AIA4ALKqE3qAjRpdHVuZXMuYXBwbGUuY29tL3VzL2FwcC9hcHBuZXh1cy1zZGstYXBwL2lkNzM2ODY5ODMzgAMAiAMBkAMAmAMXoAMBqgMAwAOsAsgDANIDKAgAEiQ1MzYzOTYzYi02MWVhLTRiZmUtYjczMS05ZGE1MGFhNTJhYmPSAygIChIkZWY1NDA0ZTQtM2NmOS00YzNiLTkzNTAtYjRhOWE5YzA0YjU12AP5o3rgAwDoAwL4AwCABACSBAYvdXQvdjOYBACiBAsxMC4xNC4xMi40NagEhOYisgQQCAAQARisAiD6ASgAMAA4ArgEAMAEAMgEANIEDzEwMDk0I1NJTjE6MzU3NdoEAggA4AQB8ASviNVJ-gQSCQAAAECW5EJAEQAAAMACml7AggUJNzM2CfwgiAUBmAUAoAX_EQEYAcAFAMkFAAUBFPA_0gUJCQULdAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgC4BgDBBgEfLAAA8L_IBgDaBhYKEAkQGQFEEAAYAOAGDPIGAggAgAcBiAcA&s=6f2fa33f3b83d94aacc2346e5345dead47934579",
+ "timeout_ms": 0,
+ "ad_profile_id": 1266762,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "native",
+ "buyer_member_id": 10094,
+ "creative_id": 154485807,
+ "media_type_id": 12,
+ "media_subtype_id": 65,
+ "brand_category_id": 0,
+ "client_initiated_ad_counting": true,
+ "viewability": {
+ "config": ""
+ },
+ "rtb": {
+ "native": {
+ "title": "Native Renderer Title",
+ "desc": "Native Renderer Desc",
+ "sponsored": "Abhishek Sharma",
+ "ctatext": "NativeRendererCampaign",
+ "icon": {
+ "url": "https://vcdn.adnxs.com/p/creative-image/73/0d/53/85/730d5385-8952-4f74-9700-693fe2f17da0.png",
+ "width": 868,
+ "height": 996,
+ "prevent_crop": false
+ },
+ "main_img": {
+ "url": "https://vcdn.adnxs.com/p/creative-image/66/91/f0/ab/6691f0ab-d2a3-47c8-a1fb-dfdac2a80cc2.png",
+ "width": 868,
+ "height": 996,
+ "prevent_crop": false
+ },
+ "link": {
+ "url": "https://appnexus.com",
+ "click_trackers": [
+ "https://sin1-mobile.adnxs.com/click?exSuR-F6hD97FK5H4XqEPwAAAEDheoQ_exSuR-F6hD97FK5H4XqEP6qHiaaYIq4xNSaARb5ciyaBnetcAAAAAIEs8ABuJwAAbicAAAIAAAAvRDUJzhkbAAAAAABVU0QAVVNEAAEAAQCkiQAAAAABAQQCAAAAAMIAfSJ4VQAAAAA./cpcpm=AAAAAAAAAAA=/bcr=AAAAAAAA8D8=/cnd=%21OBCH5giHi-ENEK-I1UkYzrNsIAQoADF7FK5H4XqEPzoJU0lOMTozNTc1QMwMSQAAAAAAAPA_UQAAAAAAAAAAWQAAAAAAAAAA/cca=MTAwOTQjU0lOMTozNTc1/bn=86603/"
+ ]
+ },
+ "impression_trackers": [
+ "https://sin1-mobile.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QK2CPA8NgQAAAMA1gAFAQiBu67nBRCqj6a0itOI1zEYtcyArOSX18UmKjYJexSuR-F6hD8RexSuR-F6hD8ZAAAAQAESACERGwApEQkAMREbqDCB2cAHOO5OQO5OSAJQr4jVSVjOs2xgAGikk4YBeMukBYABAYoBA1VTRJIFBvBPmAEBoAEBqAEBsAEAuAEBwAEEyAEC0AEA2AEA4AEA8AEAigJZdWYoJ2EnLCAzMDM4MzE0LCAxNTU4OTQ1MTUzKTt1ZignaScsIDEwMDg3NzhGHQAEcicBFBg0NDg1ODA3AQsZPPCakgKRAiFyejdSd1FpSGktRU5FSy1JMVVrWUFDRE9zMnd3QURnQVFBUkk3azVRZ2RuQUIxZ0FZS1VGYUFCd0FIZ0FnQUVBaUFFQWtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFTUkcwb0RGVlFCQTJRRUFBQUFBQUFEd1AtQUJpc2s5OVEJFCxtQUlBb0FJQXRRSUEBAQB2DQiYd0FJQXlBSUEwQUlBMkFJQTRBSUE2QUlBLUFJQWdBTUJtQU1CcUFPBdTodWdNSlUwbE9NVG96TlRjMTRBUE1ESUFFODhEa0FZZ0U5Y0RrQVpBRUFKZ0VBUS4umgJhIU9CQ0g1Z2kFQDEUQHpyTnNJQVFvQURGN0ZLNUg0AdgEem8yXAAUUU13TVNRAaoYQUFBUEFfVREMDEFBQVcdDPReAdgCAOACyqhN6gI0aXR1bmVzLmFwcGxlLmNvbS91cy9hcHAvYXBwbmV4dXMtc2RrLWFwcC9pZDczNjg2OTgzM4ADAIgDAZADAJgDF6ADAaoDAMAD4KgByAMA0gMoCAASJDUzNjM5NjNiLTYxZWEtNGJmZS1iNzMxLTlkYTUwYWE1MmFiY9IDKAgKEiRlZjU0MDRlNC0zY2Y5LTRjM2ItOTM1MC1iNGE5YTljMDRiNTXYA_mjeuADAOgDAvgDAIAEAJIEBi91dC92M5gEAKIECzEwLjE0LjEyLjQ1qASE5iKyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQPMTAwOTQjU0lOMTozNTc12gQCCAHgBAHwBK-I1Un6BBIJAAAAQJbkQkARAAAAwAKaXsCCBQk3MzY4Njk4MzOIBQGYBQCgBf___________wHABQDJBQAAAAAAAPA_0gUJCQULdAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgC4BgDBBgEfLAAA8D_IBgDaBhYKEAkQGQFEEAAYAOAGDPIGAggAgAcBiAcA&s=91d3af1f75b86ccc77cdf065374aa86b1385b11f"
+ ],
+ "id": 154485807
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBVideoAd.json b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBVideoAd.json
new file mode 100755
index 000000000..26d7d4b15
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/StubResponse/RTBVideoAd.json
@@ -0,0 +1,38 @@
+{
+ "version": "0.0.1",
+ "tags": [
+ {
+ "tag_id": 9887537,
+ "auction_id": "4584035484591692222",
+ "nobid": false,
+ "no_ad_url": "http://sin1-mobile.adnxs.com/it?e=wqT_3QLRBqBRAwAAAwDWAAUBCM7AsNUFEL6z_sbG__DOPxio2pHdrJ_hhhYqNgkAAAkCABEJBywAABkAAACA61HgPyEREgApEQkAMREb8GMwsb7bBDi-B0C-B0gAUABY7_U-YABokUB4AIABAZIBA1VTRJgBAaABAagBAbABALgBAMABAMgBAtABANgBAOABAPABAIoCO3VmKCdhJywgMTA4NTgwOSwgMTUyMTIyOTkwMik7AR0wcicsIDY1NTg4NzE2LDIeAPCNkgL5ASFHRGc4UmdqOTNyQUdFT3lib3g4WUFDRHY5VDR3QURnQVFBUkl2Z2RRc2I3YkJGZ0FZUGdCYUFCd0pIalNSNEFCU29nQjBrZVFBUUdZQVFHZ0FRR29BUU93QVFDNUFTbUxpSU1BQU9BX3dRRXBpNGlEQUFEZ1A4a0JkdDhpWHZYeTB6X1pBUUFBQQEDJFBBXzRBRUE5UUUBDixBbUFJQW9BSUF0UUkFEAB2DQiId0FJQXlBSUE0QUlBNkFJQS1BSUFnQU1Ca0FNQW1BTUJxQVAF0Jh1Z01SWkdWbVlYVnNkQ05UU1U0eE9qTTFOakkumgI5IThRelJHd2oFLBH8KDdfVS1JQVFvQURvYjwAiNgC6AfgAsfTAeoCNGl0dW5lcy5hcHBsZS5jb20vdXMvYXBwAQQkbmV4dXMtc2RrLQER8LppZDczNjg2OTgzM4ADAYgDAZADAJgDF6ADAaoDAMADrALIAwDSAygIABIkZWNjZDk2MmYtZTA3Ny00MDA2LTlkNWYtZGRlNmEyM2ZjM2Ew2AP5o3rgAwDoAwL4AwCABACSBAYvdXQvdjKYBACiBAkxMC4xNC44LjGoBOhksgQOCAAQARisAiD6ATAAOAK4BADABADIBADSBBFkZWZhdWx0I1NJTjE6MzU2MtoEAggA4AQA8ATsm6MfggUJFbkgiAUBmAUAoAX_EQEYAcAFAMkFAAUBFPA_0gUJCQULYAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgA.&s=be77947eeb499e8d243abcae8af36bb8fb1e24e8&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833",
+ "timeout_ms": 10000,
+ "ad_profile_id": 27079,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "video",
+ "notify_url": "http://sin1-mobile.adnxs.com/vast_track/v2?info=YwAAAAMArgAFAQlOIKxaAAAAABG-md9o_MOdPxlOIKxaAAAAACDsm6MfKAAwvgc4vgdA1q4xSJn7hwFQsb7bBFgBYgItLWgBcAF4AIABAIgBAJABrAKYAfoBoAEAqAHsm6Mf&event_type=1",
+ "usersync_url": "http%3A%2F%2Facdn.adnxs.com%2Fib%2Fstatic%2Fusersync%2Fv4%2Fasync_usersync.html",
+ "buyer_member_id": 958,
+ "creative_id": 65588716,
+ "media_type_id": 4,
+ "media_subtype_id": 64,
+ "client_initiated_ad_counting": true,
+ "rtb": {
+ "video": {
+ "player_width": 300,
+ "player_height": 250,
+ "duration_ms": 145000,
+ "playback_methods": [
+ "unknown"
+ ],
+ "frameworks": [],
+ "content": "adnxs00:00:00"
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANGlobal+ANTest.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANGlobal+ANTest.h
new file mode 100644
index 000000000..be1a71a51
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANGlobal+ANTest.h
@@ -0,0 +1,26 @@
+/* Copyright 2020 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 "ANGlobal.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ANGlobal (ANTest)
+
++ (void) constructAdServerRequestURL;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANGlobal+ANTest.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANGlobal+ANTest.m
new file mode 100644
index 000000000..8813e6f17
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANGlobal+ANTest.m
@@ -0,0 +1,25 @@
+/* Copyright 2020 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 "ANGDPRSettings.h"
+#import "ANGlobal+ANTest.h"
+#import "ANSDKSettings+PrivateMethods.h"
+#import "ANHTTPCookieStorage.h"
+#import "ANWebView.h"
+
+@implementation ANGlobal (ANTest)
+
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPCookieStorage.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPCookieStorage.h
new file mode 100644
index 000000000..c3a1e8203
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPCookieStorage.h
@@ -0,0 +1,31 @@
+/* Copyright 2020 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
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ANHTTPCookieStorage : NSObject
+
++ (instancetype)sharedInstance;
+
+@property (nonatomic, readwrite, nullable) NSDictionary *adFetcherRequestCookie;
+@property (nonatomic, readwrite, nullable) NSDictionary *adFetcherResponseCookie;
+@property (nonatomic, readwrite,nullable) NSDictionary *bannerWebViewCookie;
+@property (nonatomic, readwrite,nullable) NSDictionary *videoAdPlayerCookie;
+-(NSDictionary *) getCurrentCookie;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPCookieStorage.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPCookieStorage.m
new file mode 100644
index 000000000..39fe289d6
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPCookieStorage.m
@@ -0,0 +1,41 @@
+/* Copyright 2020 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 "ANHTTPCookieStorage.h"
+#import "ANSDKSettings+PrivateMethods.h"
+
+@implementation ANHTTPCookieStorage
+
+
++ (instancetype)sharedInstance {
+ static dispatch_once_t onceToken;
+ static ANHTTPCookieStorage *cookieObject;
+ dispatch_once(&onceToken, ^{
+ cookieObject = [[ANHTTPCookieStorage alloc] init];
+ });
+ return cookieObject;
+}
+
+-(NSDictionary *) getCurrentCookie{
+ NSString *urlString = [[[ANSDKSettings sharedInstance] baseUrlConfig] webViewBaseUrl];
+ NSURL *URL = [NSURL URLWithString:urlString];
+ NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:URL];
+ NSDictionary *cookieHeaders;
+ cookieHeaders = [ NSHTTPCookie requestHeaderFieldsWithCookies: cookies];
+ return cookieHeaders;
+}
+
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPNetworkSession+ANTest.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPNetworkSession+ANTest.h
new file mode 100644
index 000000000..812dbe7a3
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPNetworkSession+ANTest.h
@@ -0,0 +1,26 @@
+/* Copyright 2020 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 "ANHTTPNetworkSession.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ANHTTPNetworkSession (ANTest)
+
+@property (nonatomic, strong) NSURLSession * adServerSession;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubURLProtocol.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubURLProtocol.h
new file mode 100644
index 000000000..ab210b6b4
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubURLProtocol.h
@@ -0,0 +1,23 @@
+/* Copyright 2014 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
+
+extern NSString *const kANHTTPStubURLProtocolRequestDidLoadNotification;
+extern NSString *const kANHTTPStubURLProtocolRequest;
+
+@interface ANHTTPStubURLProtocol : NSURLProtocol
+
+@end
\ No newline at end of file
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubURLProtocol.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubURLProtocol.m
new file mode 100644
index 000000000..af6b37161
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubURLProtocol.m
@@ -0,0 +1,117 @@
+/* Copyright 2014 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 "ANHTTPStubURLProtocol.h"
+#import "ANHTTPStubbingManager.h"
+
+
+
+static NSString *const kANTestHTTPStubURLProtocolExceptionKey = @"kANTestHTTPStubURLProtocolExceptionKey";
+NSString *const kANHTTPStubURLProtocolRequestDidLoadNotification = @"kANHTTPStubURLProtocolRequestDidLoadNotification";
+NSString *const kANHTTPStubURLProtocolRequest = @"kANHTTPStubURLProtocolRequest";
+
+
+
+@implementation ANHTTPStubURLProtocol
+
++ (BOOL)canInitWithRequest:(NSURLRequest *)request
+{
+ BOOL broadcastRequests = [ANHTTPStubbingManager sharedStubbingManager].broadcastRequests;
+
+ if (broadcastRequests && request) {
+ [[NSNotificationCenter defaultCenter] postNotificationName:kANHTTPStubURLProtocolRequestDidLoadNotification
+ object:nil
+ userInfo:@{kANHTTPStubURLProtocolRequest:request}];
+ }
+
+ BOOL isHttpOrHttps = [request.URL.scheme isEqualToString:@"http"] || [request.URL.scheme isEqualToString:@"https"];
+ if (!isHttpOrHttps) {
+ return NO;
+ }
+
+ BOOL ignoreUnstubbedRequests = [ANHTTPStubbingManager sharedStubbingManager].ignoreUnstubbedRequests;
+ if (ignoreUnstubbedRequests) {
+ ANURLConnectionStub *stub = [[ANHTTPStubbingManager sharedStubbingManager] stubForURLString:request.URL.absoluteString];
+ return (stub != nil);
+ } else {
+ return YES;
+ }
+}
+
++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
+ return request;
+}
+
++ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b {
+ return NO;
+}
+
+- (void)startLoading {
+ id client = self.client;
+ ANURLConnectionStub *stub = [self stubForRequest];
+
+ if (stub) {
+ NSURLResponse *response = [self buildResponseForRequestUsingStub:stub];
+ [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
+
+ NSData *responseData = [self buildDataForRequestUsingStub:stub];
+ [client URLProtocol:self didLoadData:responseData];
+
+ [client URLProtocolDidFinishLoading:self];
+ NSLog(@"Successfully loaded request from stub: %@", [self request]);
+
+ } else {
+ NSLog(@"Could not load request successfully: %@", [self request]);
+ NSLog(@"This can happen if the request was not stubbed, or if the stubs were removed before this request was completed (due to asynchronous request loading).");
+ [client URLProtocol: self
+ didFailWithError: [NSError errorWithDomain: kANTestHTTPStubURLProtocolExceptionKey
+ code: 1
+ userInfo: nil ]
+ ];
+ }
+}
+
+- (void)stopLoading {
+ // Do nothing, but method is required.
+}
+
+
+
+
+#pragma mark - Stubbing
+
+- (ANURLConnectionStub *)stubForRequest {
+ return [[ANHTTPStubbingManager sharedStubbingManager] stubForURLString:self.request.URL.absoluteString];
+}
+
+
+- (NSURLResponse *)buildResponseForRequestUsingStub:(ANURLConnectionStub *)stub {
+ NSHTTPURLResponse *httpResponse = [[NSHTTPURLResponse alloc] initWithURL:[[self request] URL]
+ statusCode:stub.responseCode
+ HTTPVersion:@"HTTP/1.1"
+ headerFields:@{}];
+ return httpResponse;
+}
+
+- (NSData *)buildDataForRequestUsingStub:(ANURLConnectionStub *)stub {
+ if ([stub.responseBody isKindOfClass:[NSString class]]) {
+ return [stub.responseBody dataUsingEncoding:NSUTF8StringEncoding];
+ } else if ([stub.responseBody isKindOfClass:[NSData class]]) {
+ return stub.responseBody;
+ }
+ return nil;
+}
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubbingManager.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubbingManager.h
new file mode 100644
index 000000000..6282389db
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubbingManager.h
@@ -0,0 +1,57 @@
+/* Copyright 2014 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 "ANHTTPStubURLProtocol.h"
+#import "ANURLConnectionStub.h"
+
+
+
+
+@interface ANHTTPStubbingManager : NSObject
+
+/**
+ If set to YES, then unstubbed requests will be ignored by this class and handled by the system.
+ If set to NO (default), then unstubbed requests will result in didFailToLoad errors.
+
+ Default is NO.
+ */
+@property (nonatomic) BOOL ignoreUnstubbedRequests;
+
+/**
+ If set to YES, then all requests which trigger canInitWithRequest: will be broadcast
+ as kANHTTPStubURLProtocolRequestDidLoadNotification notifications. The request will be in the user info,
+ as the value of the kANHTTPStubURLProtocolRequest key.
+
+ Default is NO.
+ */
+@property (nonatomic) BOOL broadcastRequests;
+
+
+
++ (ANHTTPStubbingManager *)sharedStubbingManager;
+
+- (void)enable;
+- (void)disable;
+
+- (void)addStub:(ANURLConnectionStub *)stub;
+- (void)addStubs:(NSArray *)stubs;
+- (void)removeAllStubs;
+
+- (ANURLConnectionStub *)stubForURLString:(NSString *)URLString;
+
+//
++ (NSDictionary *) jsonBodyOfURLRequestAsDictionary: (NSURLRequest *)urlRequest;
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubbingManager.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubbingManager.m
new file mode 100644
index 000000000..9db51e782
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANHTTPStubbingManager.m
@@ -0,0 +1,113 @@
+/* Copyright 2014 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 "ANHTTPStubbingManager.h"
+#import "ANHTTPStubURLProtocol.h"
+#import "ANSDKSettings.h"
+
+#import "NSURLRequest+HTTPBodyTesting.h"
+
+
+
+
+@interface ANHTTPStubbingManager()
+@property (nonatomic) NSMutableArray *stubs;
+@end
+
+
+
+
+@implementation ANHTTPStubbingManager
+
++ (ANHTTPStubbingManager *)sharedStubbingManager {
+ static dispatch_once_t sharedStubbingManagerToken;
+ static ANHTTPStubbingManager *manager;
+ dispatch_once(&sharedStubbingManagerToken, ^{
+ manager = [[ANHTTPStubbingManager alloc] init];
+ });
+ return manager;
+}
+
+- (void)enable {
+ [NSURLProtocol registerClass:[ANHTTPStubURLProtocol class]];
+}
+
+- (void)disable {
+ [NSURLProtocol unregisterClass:[ANHTTPStubURLProtocol class]];
+}
+
+- (void)addStub:(ANURLConnectionStub *)stub {
+ [self.stubs addObject:stub];
+}
+
+- (void)addStubs:(NSArray *)stubs {
+ [self.stubs addObjectsFromArray:stubs];
+}
+
+- (void)removeAllStubs {
+ [self.stubs removeAllObjects];
+}
+
+- (NSMutableArray *)stubs {
+ @synchronized(self) {
+ if (!_stubs) _stubs = [[NSMutableArray alloc] init];
+ return _stubs;
+ }
+}
+
+- (ANURLConnectionStub *)stubForURLString:(NSString *)URLString
+{
+ __block ANURLConnectionStub *stubMatch = nil;
+
+ [self.stubs enumerateObjectsUsingBlock: ^(ANURLConnectionStub *stub, NSUInteger idx, BOOL *stop)
+ {
+ NSError *error;
+ NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: stub.requestURL
+ options: NSRegularExpressionDotMatchesLineSeparators
+ error: &error];
+ if ([regex numberOfMatchesInString: URLString
+ options: 0
+ range: NSMakeRange(0, [URLString length])])
+ {
+ stubMatch = stub;
+ *stop = YES;
+ }
+ } ];
+ return stubMatch;
+}
+
+
+
+
+#pragma mark - Helper class methods.
+
++ (NSDictionary *) jsonBodyOfURLRequestAsDictionary: (NSURLRequest *)urlRequest
+{
+// TESTTRACE();
+
+ NSString *bodyAsString = [[NSString alloc] initWithData:[urlRequest ANHTTPStubs_HTTPBody] encoding:NSUTF8StringEncoding];
+ NSData *objectData = [bodyAsString dataUsingEncoding:NSUTF8StringEncoding];
+ NSError *error = nil;
+
+ NSDictionary *json = [NSJSONSerialization JSONObjectWithData: objectData
+ options: NSJSONReadingMutableContainers
+ error: &error];
+ if (error) { return nil; }
+
+ return json;
+}
+
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANStubManager.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANStubManager.h
new file mode 100644
index 000000000..b34ee578a
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANStubManager.h
@@ -0,0 +1,29 @@
+/* Copyright 2020 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
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ANStubManager : NSObject
+
++ (instancetype)sharedInstance;
+
+-(void) enableStubbing;
+-(void) disableStubbing;
+-(void)stubRequestWithResponse:(NSString *)responseName;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANStubManager.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANStubManager.m
new file mode 100644
index 000000000..55f03495a
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANStubManager.m
@@ -0,0 +1,59 @@
+/* Copyright 2020 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 "ANStubManager.h"
+#import "ANHTTPStubbingManager.h"
+#import "ANSDKSettings+PrivateMethods.h"
+
+@implementation ANStubManager
+
+
++ (instancetype)sharedInstance {
+ static dispatch_once_t onceToken;
+ static ANStubManager *anStubManager;
+ dispatch_once(&onceToken, ^{
+ anStubManager = [[ANStubManager alloc] init];
+ });
+ return anStubManager;
+}
+
+-(void) enableStubbing{
+ [[ANHTTPStubbingManager sharedStubbingManager] enable];
+ [ANHTTPStubbingManager sharedStubbingManager].ignoreUnstubbedRequests = YES;
+}
+
+-(void) disableStubbing{
+ [[ANHTTPStubbingManager sharedStubbingManager] removeAllStubs];
+ [[ANHTTPStubbingManager sharedStubbingManager] disable];
+}
+
+
+- (void)stubRequestWithResponse:(NSString *)responseName
+{
+ NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
+
+ NSString *baseResponse = [NSString stringWithContentsOfFile: [currentBundle pathForResource:responseName ofType:@"json"]
+ encoding: NSUTF8StringEncoding
+ error: nil ];
+
+ ANURLConnectionStub *requestStub = [[ANURLConnectionStub alloc] init];
+ requestStub.requestURL = [[[ANSDKSettings sharedInstance] baseUrlConfig] utAdRequestBaseUrl];
+ requestStub.responseCode = 200;
+ requestStub.responseBody = baseResponse;
+
+ [[ANHTTPStubbingManager sharedStubbingManager] addStub:requestStub];
+}
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub+NSURLSessionConfiguration.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub+NSURLSessionConfiguration.m
new file mode 100644
index 000000000..d1b6ff7d5
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub+NSURLSessionConfiguration.m
@@ -0,0 +1,71 @@
+/* Copyright 2017 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 "ANURLConnectionStub.h"
+#import "NSObject+Swizzling.h"
+#import "ANHTTPNetworkSession+ANTest.h"
+#import "ANGlobal+ANTest.h"
+
+
+
+/**
+ * This helper is used to swizzle NSURLSessionConfiguration constructor methods
+ * defaultSessionConfiguration and ephemeralSessionConfiguration to insert the private
+ * OHHTTPStubsProtocol into their protocolClasses array so that OHHTTPStubs is automagically
+ * supported when you create a new NSURLSession based on one of there configurations.
+ */
+
+typedef NSURLSessionConfiguration*(*SessionConfigConstructor)(id,SEL);
+static SessionConfigConstructor orig_defaultSessionConfiguration;
+static SessionConfigConstructor orig_ephemeralSessionConfiguration;
+
+static NSURLSessionConfiguration* ANHTTPStubs_defaultSessionConfiguration(id self, SEL _cmd)
+{
+ NSURLSessionConfiguration* config = orig_defaultSessionConfiguration(self,_cmd); // call original method
+ [ANURLConnectionStub setEnabled:YES forSessionConfiguration:config]; //
+ return config;
+}
+
+static NSURLSessionConfiguration* ANHTTPStubs_ephemeralSessionConfiguration(id self, SEL _cmd)
+{
+ NSURLSessionConfiguration* config = orig_ephemeralSessionConfiguration(self,_cmd); // call original method
+ [ANURLConnectionStub setEnabled:YES forSessionConfiguration:config]; //
+ return config;
+}
+
+@interface NSURLSessionConfiguration(ANHTTPStubsSupport) @end
+
+@implementation NSURLSessionConfiguration(ANHTTPStubsSupport)
+
++(void)load
+{
+
+ orig_defaultSessionConfiguration = (SessionConfigConstructor)ANHTTPStubsReplaceMethod(@selector(defaultSessionConfiguration),
+ (IMP)ANHTTPStubs_defaultSessionConfiguration,
+ [NSURLSessionConfiguration class],
+ YES);
+ orig_ephemeralSessionConfiguration = (SessionConfigConstructor)ANHTTPStubsReplaceMethod(@selector(ephemeralSessionConfiguration),
+ (IMP)ANHTTPStubs_ephemeralSessionConfiguration,
+ [NSURLSessionConfiguration class],
+ YES);
+
+ // Recreated network session and mutable request after http stubbing is enabled.
+ [[ANHTTPNetworkSession sharedInstance]setAdServerSession:[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:[ANHTTPNetworkSession sharedInstance] delegateQueue:nil]];
+ [ANGlobal constructAdServerRequestURL];
+}
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub.h
new file mode 100644
index 000000000..4dfc850db
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub.h
@@ -0,0 +1,78 @@
+/* Copyright 2014 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
+
+
+
+
+@interface ANURLConnectionStub : NSObject
+
+@property (nonatomic, readwrite, strong) NSString *requestURL;
+@property (nonatomic, readwrite, assign) NSInteger responseCode;
+@property (nonatomic, readwrite, strong) id responseBody; //can be nsstring or nsdata
+
++ (ANURLConnectionStub *)stubForStandardBannerWithAdSize:(CGSize)adSize
+ content:(NSString *)content;
+
++ (ANURLConnectionStub *)stubForStandardBannerWithAdSize:(CGSize)adSize
+ contentFromResource:(NSString *)resource
+ ofType:(NSString *)type;
+
++ (ANURLConnectionStub *)stubForResource:(NSString *)resource
+ ofType:(NSString *)type;
+
++ (ANURLConnectionStub *)stubForResource:(NSString *)resource
+ ofType:(NSString *)type
+ withRequestURL:(NSString *)pattern;
+
++ (ANURLConnectionStub *)stubForResource:(NSString *)resource
+ ofType:(NSString *)type
+ withRequestURL:(NSString *)pattern
+ inBundle:(NSBundle *)bundle;
+
++ (ANURLConnectionStub *)stubForMraidFile;
+
+/**
+ * Enable or disable the stubs on a given `NSURLSessionConfiguration`.
+ *
+ * @param enabled If `YES`, enables the stubs for this `NSURLSessionConfiguration`.
+ * If `NO`, disable the stubs and let all the requests hit the real world
+ * @param sessionConfig The NSURLSessionConfiguration on which to enabled/disable the stubs
+ *
+ * @note OHHTTPStubs are enabled by default on newly created `defaultSessionConfiguration`
+ * and `ephemeralSessionConfiguration`, so there is no need to call this method with
+ * `YES` for stubs to work. You generally only use this if you want to disable
+ * `OHTTPStubs` per `NSURLSession` by calling it before building the `NSURLSession`
+ * with the `NSURLSessionConfiguration`.
+ *
+ * @note Important: As usual according to the way `NSURLSessionConfiguration` works, you
+ * MUST set this property BEFORE creating the `NSURLSession`. Once the `NSURLSession`
+ * object is created, they use a deep copy of the `NSURLSessionConfiguration` object
+ * used to create them, so changing the configuration later does not affect already
+ * created sessions.
+ */
++ (void)setEnabled:(BOOL)enabled forSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig;
+
+/**
+ * Whether stubs are enabled or disabled on a given `NSURLSessionConfiguration`
+ *
+ * @param sessionConfig The NSURLSessionConfiguration on which to enable/disable the stubs
+ *
+ * @return If `YES` the stubs are enabled for sessionConfig. If `NO` then the stubs are disabled
+ */
++ (BOOL)isEnabledForSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig;
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub.m
new file mode 100644
index 000000000..f18a9b07b
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/ANURLConnectionStub.m
@@ -0,0 +1,186 @@
+/* Copyright 2014 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 "ANURLConnectionStub.h"
+#import "ANSDKSettings+PrivateMethods.h"
+#import "ANHTTPStubURLProtocol.h"
+
+@implementation ANURLConnectionStub
+
+- (id)copyWithZone:(NSZone *)zone {
+ ANURLConnectionStub *newStub = [[ANURLConnectionStub alloc] init];
+ newStub.requestURL = self.requestURL;
+ newStub.responseCode = self.responseCode;
+ newStub.responseBody = self.responseBody;
+ return newStub;
+}
+
+- (BOOL)isEqual:(ANURLConnectionStub *)object {
+ BOOL sameRequestURLString = [self.requestURL isEqualToString:object.requestURL];
+ BOOL sameResponseCode = (self.responseCode == object.responseCode);
+ BOOL sameResponseBody = [self.responseBody isEqualToString:object.responseBody];
+ return sameRequestURLString && sameResponseBody && sameResponseCode;
+}
+
+- (NSUInteger)hash {
+ NSMutableString *description = [[NSMutableString alloc] init];
+ [description appendString:self.requestURL];
+ [description appendString:[NSString stringWithFormat:@"%ld", (long)self.responseCode]];
+ [description appendString:self.responseBody];
+ return [description hash];
+}
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"NSURLConnectionStub: \n\
+ Request URL Pattern: %@,\n\
+ Response Code: %ld,\n\
+ Response Body: %@",self.requestURL, (long)self.responseCode, self.responseBody];
+
+}
+
+
+
+
+#pragma mark - Pre-Initialized Stubbers
+
++ (ANURLConnectionStub *)stubForStandardBannerWithAdSize:(CGSize)adSize
+ contentFromResource:(NSString *)resource
+ ofType:(NSString *)type {
+ NSString *filePath = [[NSBundle mainBundle] pathForResource:resource
+ ofType:type];
+ NSString *content = [[NSString alloc] initWithContentsOfFile:filePath
+ encoding:NSUTF8StringEncoding
+ error:nil];
+ return [ANURLConnectionStub stubForStandardBannerWithAdSize:adSize
+ content:content];
+}
+
++ (ANURLConnectionStub *)stubForStandardBannerWithAdSize:(CGSize)adSize
+ content:(NSString *)content {
+ ANURLConnectionStub *stub = [[ANURLConnectionStub alloc] init];
+ stub.requestURL = [[ANSDKSettings sharedInstance].baseUrlConfig utAdRequestBaseUrl];
+ stub.responseCode = 200;
+ stub.responseBody = [NSJSONSerialization dataWithJSONObject:[[self class] responseForStandardBannerWithAdSize:adSize
+ content:content]
+ options:0
+ error:nil];
+ return stub;
+}
+
++ (ANURLConnectionStub *)stubForMraidFile {
+ ANURLConnectionStub *stub = [[ANURLConnectionStub alloc] init];
+ stub.requestURL = [[[ANSDKSettings sharedInstance].baseUrlConfig webViewBaseUrl] stringByAppendingString:@"mraid.js"];
+ stub.responseBody = @"";
+ stub.responseCode = 200;
+ return stub;
+}
+
++ (ANURLConnectionStub *)stubForResource:(NSString *)resource
+ ofType:(NSString *)type {
+ return [ANURLConnectionStub stubForResource:resource
+ ofType:type
+ withRequestURL:resource
+ inBundle:[NSBundle mainBundle]];
+}
+
++ (ANURLConnectionStub *)stubForResource:(NSString *)resource
+ ofType:(NSString *)type
+ withRequestURL:(NSString *)pattern {
+ return [ANURLConnectionStub stubForResource:resource
+ ofType:type
+ withRequestURL:pattern
+ inBundle:[NSBundle mainBundle]];
+}
+
++ (ANURLConnectionStub *)stubForResource:(NSString *)resource
+ ofType:(NSString *)type
+ withRequestURL:(NSString *)pattern
+ inBundle:(NSBundle *)bundle {
+ ANURLConnectionStub *stub = [[ANURLConnectionStub alloc] init];
+ stub.responseCode = 200;
+ stub.requestURL = pattern;
+ stub.responseBody = [NSData dataWithContentsOfFile:[bundle pathForResource:resource
+ ofType:type]];
+ return stub;
+}
+
++ (NSDictionary *)responseForStandardBannerWithAdSize:(CGSize)adSize
+ content:(NSString *)content {
+ NSMutableDictionary *response = [[NSMutableDictionary alloc] init];
+ response[@"status"] = @"ok";
+ NSDictionary *adElement = [[self class] adElementForAdType:@"banner"
+ adSize:adSize
+ content:content];
+ response[@"ads"] = @[adElement];
+ return [response copy];
+}
+
++ (NSDictionary *)adElementForAdType:(NSString *)type
+ adSize:(CGSize)adSize
+ content:(NSString *)content {
+ NSMutableDictionary *adElement = [[NSMutableDictionary alloc] init];
+ adElement[@"type"] = type;
+ adElement[@"width"] = [@(adSize.width) description];
+ adElement[@"height"] = [@(adSize.height) description];
+ adElement[@"content"] = content;
+ return [adElement copy];
+}
+
++ (void)setEnabled:(BOOL)enable forSessionConfiguration:(NSURLSessionConfiguration*)sessionConfig
+{
+ // Runtime check to make sure the API is available on this version
+ if ( [sessionConfig respondsToSelector:@selector(protocolClasses)]
+ && [sessionConfig respondsToSelector:@selector(setProtocolClasses:)])
+ {
+ NSMutableArray * urlProtocolClasses = [NSMutableArray arrayWithArray:sessionConfig.protocolClasses];
+ Class protoCls = ANHTTPStubURLProtocol.class;
+ if (enable && ![urlProtocolClasses containsObject:protoCls])
+ {
+ [urlProtocolClasses insertObject:protoCls atIndex:0];
+ }
+ else if (!enable && [urlProtocolClasses containsObject:protoCls])
+ {
+ [urlProtocolClasses removeObject:protoCls];
+ }
+ sessionConfig.protocolClasses = urlProtocolClasses;
+ }
+ else
+ {
+ NSLog(@"[ANURLConnectionStub] %@ is only available when running on iOS7+/OSX9+. "
+ @"Use conditions like 'if ([NSURLSessionConfiguration class])' to only call "
+ @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector(_cmd));
+ }
+}
+
++ (BOOL)isEnabledForSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig
+{
+ // Runtime check to make sure the API is available on this version
+ if ( [sessionConfig respondsToSelector:@selector(protocolClasses)]
+ && [sessionConfig respondsToSelector:@selector(setProtocolClasses:)])
+ {
+ NSMutableArray * urlProtocolClasses = [NSMutableArray arrayWithArray:sessionConfig.protocolClasses];
+ Class protoCls = ANHTTPStubURLProtocol.class;
+ return [urlProtocolClasses containsObject:protoCls];
+ }
+ else
+ {
+ NSLog(@"[ANURLConnectionStub] %@ is only available when running on iOS7+/OSX9+. "
+ @"Use conditions like 'if ([NSURLSessionConfiguration class])' to only call "
+ @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector(_cmd));
+ return NO;
+ }
+}
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/NSObject+Swizzling.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSObject+Swizzling.h
new file mode 100644
index 000000000..43539034b
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSObject+Swizzling.h
@@ -0,0 +1,46 @@
+/* Copyright 2014 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
+
+@interface NSObject (Swizzling)
+
++ (void)exchangeClassSelector:(SEL)originalSelector
+ withSelector:(SEL)swizzledSelector;
++ (void)exchangeInstanceSelector:(SEL)originalSelector
+ withSelector:(SEL)swizzledSelector;
+
+/**
+ * Replaces the selector's associated method implementation with the
+ * given implementation (or adds it, if there was no existing one).
+ *
+ * @param selector The selector entry in the dispatch table.
+ * @param newImpl The implementation that will be associated with
+ * the given selector.
+ * @param affectedClass The class whose dispatch table will be altered.
+ * @param isClassMethod Set to YES if the selector denotes a class
+ * method, or NO if it is an instance method.
+ * @return The previous implementation associated with
+ * the swizzled selector. You should store the
+ * implementation and call it when overwriting
+ * the selector.
+ */
+__attribute__((warn_unused_result)) IMP ANHTTPStubsReplaceMethod(SEL selector,
+ IMP newImpl,
+ Class affectedClass,
+ BOOL isClassMethod);
+
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/NSObject+Swizzling.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSObject+Swizzling.m
new file mode 100644
index 000000000..9ec175b84
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSObject+Swizzling.m
@@ -0,0 +1,77 @@
+/* Copyright 2014 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 "NSObject+Swizzling.h"
+#import
+
+@implementation NSObject (Swizzling)
+
++ (void)exchangeClassSelector:(SEL)originalSelector withSelector:(SEL)swizzledSelector {
+ Class class = object_getClass((id)self);
+
+ Method originalMethod = class_getInstanceMethod(class, originalSelector);
+ Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
+
+ BOOL didAddMethod = class_addMethod(class,
+ originalSelector,
+ method_getImplementation(swizzledMethod),
+ method_getTypeEncoding(swizzledMethod));
+ if (didAddMethod) {
+ class_replaceMethod(class,
+ swizzledSelector,
+ method_getImplementation(originalMethod),
+ method_getTypeEncoding(originalMethod));
+ } else {
+ method_exchangeImplementations(originalMethod, swizzledMethod);
+ }
+}
+
++ (void)exchangeInstanceSelector:(SEL)originalSelector withSelector:(SEL)swizzledSelector {
+ Class class = [self class];
+
+ Method originalMethod = class_getInstanceMethod(class, originalSelector);
+ Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
+
+ BOOL didAddMethod = class_addMethod(class,
+ originalSelector,
+ method_getImplementation(swizzledMethod),
+ method_getTypeEncoding(swizzledMethod));
+ if (didAddMethod) {
+ class_replaceMethod(class,
+ swizzledSelector,
+ method_getImplementation(originalMethod),
+ method_getTypeEncoding(originalMethod));
+ } else {
+ method_exchangeImplementations(originalMethod, swizzledMethod);
+ }
+}
+
+IMP ANHTTPStubsReplaceMethod(SEL selector,
+ IMP newImpl,
+ Class affectedClass,
+ BOOL isClassMethod)
+{
+ Method origMethod = isClassMethod ? class_getClassMethod(affectedClass, selector) : class_getInstanceMethod(affectedClass, selector);
+ IMP origImpl = method_getImplementation(origMethod);
+
+ if (!class_addMethod(isClassMethod ? object_getClass(affectedClass) : affectedClass, selector, newImpl, method_getTypeEncoding(origMethod)))
+ {
+ method_setImplementation(origMethod, newImpl);
+ }
+
+ return origImpl;
+}
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/NSURLRequest+HTTPBodyTesting.h b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSURLRequest+HTTPBodyTesting.h
new file mode 100644
index 000000000..8f8779176
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSURLRequest+HTTPBodyTesting.h
@@ -0,0 +1,31 @@
+/* Copyright 2017 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
+
+// This category is only useful when NSURLSession is present
+
+@interface NSURLRequest (HTTPBodyTesting)
+/**
+ * Unfortunately, when sending POST requests (with a body) using NSURLSession,
+ * by the time the request arrives at OHHTTPStubs, the HTTPBody of the
+ * NSURLRequest has been reset to nil.
+ *
+ * You can use this method to retrieve the HTTPBody for testing and use it to
+ * conditionally stub your requests.
+ */
+- (NSData *)ANHTTPStubs_HTTPBody;
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/Stubbing/NSURLRequest+HTTPBodyTesting.m b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSURLRequest+HTTPBodyTesting.m
new file mode 100644
index 000000000..655aa9b32
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/Stubbing/NSURLRequest+HTTPBodyTesting.m
@@ -0,0 +1,70 @@
+/* Copyright 2017 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 "NSURLRequest+HTTPBodyTesting.h"
+
+#import "NSObject+Swizzling.h"
+
+#pragma mark - NSURLRequest+CustomHTTPBody
+
+NSString * const ANHTTPStubs_HTTPBodyKey = @"HTTPBody";
+
+@implementation NSURLRequest (HTTPBodyTesting)
+
+- (NSData*)ANHTTPStubs_HTTPBody
+{
+ return [NSURLProtocol propertyForKey:ANHTTPStubs_HTTPBodyKey inRequest:self];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////
+#pragma mark - NSMutableURLRequest+HTTPBodyTesting
+
+typedef void(*ANHHTTPStubsSetterIMP)(id, SEL, id);
+static ANHHTTPStubsSetterIMP orig_setHTTPBody;
+
+static void ANHTTPStubs_setHTTPBody(id self, SEL _cmd, NSData* HTTPBody)
+{
+ // store the http body via NSURLProtocol
+ if (HTTPBody) {
+ [NSURLProtocol setProperty:HTTPBody forKey:ANHTTPStubs_HTTPBodyKey inRequest:self];
+ } else {
+ // unfortunately resetting does not work properly as the NSURLSession also uses this to reset the property
+ }
+
+ orig_setHTTPBody(self, _cmd, HTTPBody);
+}
+
+/**
+ * Swizzles setHTTPBody: in order to maintain a copy of the http body for later
+ * reference and calls the original implementation.
+ *
+ * @warning Should not be used in production, testing only.
+ */
+@interface NSMutableURLRequest (HTTPBodyTesting) @end
+
+@implementation NSMutableURLRequest (HTTPBodyTesting)
+
++ (void)load
+{
+ orig_setHTTPBody = (ANHHTTPStubsSetterIMP)ANHTTPStubsReplaceMethod(@selector(setHTTPBody:),
+ (IMP)ANHTTPStubs_setHTTPBody,
+ [NSMutableURLRequest class],
+ NO);
+}
+
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/ViewabilityStubResponse/OMID_BannerAd.json b/tests/TrackerUITest/HelpingLibrary/ViewabilityStubResponse/OMID_BannerAd.json
new file mode 100644
index 000000000..b0be4cd1f
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/ViewabilityStubResponse/OMID_BannerAd.json
@@ -0,0 +1,39 @@
+{
+ "version": "0.0.1",
+ "tags": [
+ {
+ "tag_id": 13457285,
+ "auction_id": "2291993975392492012",
+ "nobid": false,
+ "no_ad_url": "http://nym1-ib.adnxs.com/it?e=wqT_3QLLBmxLAwAAAwDWAAUBCPqkptkFEOyz69SIjLPnHxj_EQEQASo2CQANAQARDQgEABkRCQAhEQkAKREJADERCfB7MIWvtQY4vgdAvgdIAFAAWPfiP2AAaJFAeACAAQGSAQNVU0SYAawCoAH6AagBAbABALgBAcABAMgBAtABANgBAOABAPABAIoCPHVmKCdhJywgMTEwNzYxNywgMTUyOTQ1MTEzMCk7dWYoJ3InLCAxMDIwNzA4MjksIDE1MhUf8JySAvkBIU5qdWd5Z2lmMnVrS0VLMzAxVEFZQUNEMzRqOHdBRGdBUUFSSXZnZFFoYS0xQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFaZmk4WFhnd2UwXzJRRUFBQUFBQUFEd1AtQUJBUFVCBQ8oSmdDQUtBQ0FMVUMFEARMMAkI8ExNQUNBY2dDQWRBQ0FkZ0NBZUFDQU9nQ0FQZ0NBSUFEQVpBREFKZ0RBYWdEbjlycENyb0RDVTVaVFRJNk16WXpOUS4umgItIUd3cFB0Zzb8APDkOS1JX0lBUW9BRG9KVGxsTk1qb3pOak0x2ALoB-ACx9MB6gI9cGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD1jb20uYXBwbmV4dXMub3BlbnNka2FwcIADAYgDAZADAJgDF6ADAaoDAMADrALIAwDYA_zgWeADAOgDAvgDAIAEAJIEBi91dC92MpgEAKIECjEwLjEuMTMuNTaoBACyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQNOTU4I05ZTTI6MzYzNdoEAggA4AQB8ASt9NUw-gQSCUWHCEBKQEG0KMDMzCpAggUXY29tTq8AHIgFAZgFAKAFUfMY_wHABQDJBQVCFADwP9IFCXUCYNgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgE.&s=5fd01dbe8aba75c8a527ef1fa733fcb84ec8dd0c&referrer=play.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.appnexus.opensdkapp",
+ "timeout_ms": 10000,
+ "ad_profile_id": 27079,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "banner",
+ "buyer_member_id": 958,
+ "creative_id": 102070829,
+ "media_type_id": 1,
+ "media_subtype_id": 1,
+ "client_initiated_ad_counting": true,
+ "rtb": {
+ "banner": {
+ "content": "",
+ "width": 300,
+ "height": 250
+ },
+ "trackers": [
+ {
+ "impression_urls": [
+ "http://nym1-ib.adnxs.com/it?e=wqT_3QLWBmxWAwAAAwDWAAUBCPqkptkFEOyz69SIjLPnHxj_EQEwASo2CXsUrkfheoQ_EREJBBkADQEAIRESACkRCQAxDRqoADCFr7UGOL4HQL4HSAJQrfTVMFj34j9gAGiRQHjH0wSAAQGKAQNVU0SSAQEG9GgBmAGsAqAB-gGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjx1ZignYScsIDExMDc2MTcsIDE1Mjk0NTExMzApO3VmKCdyJywgMTAyMDcwODI5LCAxNTI5NDUxMTMwKTuSAvkBIU5qdWd5Z2lmMnVrS0VLMzAxVEFZQUNEMzRqOHdBRGdBUUFSSXZnZFFoYS0xQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFaZmk4WFhnd2UwXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFKZ0NBS0FDQUxVQ0FBQUFBTDBDQUFBQUFNQUNBY2dDQWRBQ0FkZ0NBZUFDQU9nQ0FQZ0NBSUFEQVpBREFKZ0RBYWdEbjlycENyb0RDVTVaVFRJNk16WXpOUS4umgItIUd3cFB0Zzb8APDcOS1JX0lBUW9BRG9KVGxsTk1qb3pOak0x2ALoB-ACx9MB6gI9cGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD1jb20uYXBwbmV4dXMub3BlbnNka2FwcIADAYgDAZADAJgDF6ADAaoDAMADrALIAwDYA_zgWeADAOgDAvgDAIAEAJIEBi91dC92MpgEAKIECjEwLjEuMTMuNTaoBACyBBAIABABGKwCIPoBKAAwADgCuAQAwAQAyAQA0gQNOTU4I05ZTTI6MzYzNdoEAggB4AQB8ARBdAz6BBIJRZJEQEpAEQAAAMDMzCpAggUXY29tTq8AHIgFAZgFAKAFUf4Y_wHABQDJBQVCFADwP9IFCQlObAAAANgFAeAFAfAFAfoFBAgAEACQBgCYBgC4BgE.&s=c60bf8485daaa47c88843086734eff52180ae5a5&referrer=play.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.appnexus.opensdkapp"
+ ],
+ "video_events": {}
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/ViewabilityStubResponse/OMID_VideoAd.json b/tests/TrackerUITest/HelpingLibrary/ViewabilityStubResponse/OMID_VideoAd.json
new file mode 100644
index 000000000..3eb2cac9f
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/ViewabilityStubResponse/OMID_VideoAd.json
@@ -0,0 +1,46 @@
+{
+ "version": "3.0.0",
+ "tags": [
+ {
+ "tag_id": 16417701,
+ "auction_id": "5531859120537927358",
+ "nobid": false,
+ "no_ad_url": "https://nym1-ib.adnxs.com/it?an_audit=0&referrer=itunes.apple.com%2Fus%2Fapp%2Fappnexus-sdk-app%2Fid736869833&e=wqT_3QKSCXySBAAAAwDWAAUBCMP36fMFEL79q5n6kcfiTBgAKjYJAA0BABENCAQAGQkJCOA_IQkJCAAAKREJADEJCfCa4D8wpYfqBzi-B0C-B0gAUABYuaxgYABokUB4AIABAYoBAJIBA1VTRJgBAaABAagBAbABALgBA8ABAMgBAtABANgBAOABAPABAIoCWXVmKCdhJywgMjc2NzIwNywgMTU4NTA4NTM3OSk7dWYoJ2knLCAxNTUyMjgxLCAxNTg1MDg1Mzc5KTt1ZigncicsIDE3MjA1OTEyOCwgMTUZPPCfkgKhAyFYRWljcGdpcGw0TVBFUGpUaFZJWUFDQzVyR0F3QURnQVFBUkl2Z2RRcFlmcUIxZ0FZUF9fX184UGFBQndBWGdCZ0FFQmlBRUJrQUVCbUFFQm9BRUJxQUVEc0FFQXVRRXBpNGlEQUFEd1A4RUJLWXVJZ3dBQThEX0pBVGFSbXRSRm1PMF8yUUVBQUFBQUFBRHdQLUFCbWQ5ZTlRRQUUKG1BSUFvQUlBdFFJBRAAdg0ImHdBSUJ5QUlCMEFJQjJBSUI0QUlBNkFJQS1BSUFnQU1CbUFNQnFBTwXYoHVnTUpUbGxOTWpvME16WXg0QU9ISFlBRUFJZ0VBSkFFQUpnRUFjRUVBBWIBAQhESkIBBw0BCDBRUQkKJElBYVFOZ0VBUEUdLCBDSUJZa2lxUVUJJBhBRHdQN0VGDQ0UQUFBREJCDT8BAQB5FSgMQUFBTjIoAABaLigASDRBV2dqUVkumgKJASFHaENFRXc2pQEkdWF4Z0lBUW9BRBGMEER3UHpvMukAEFFJY2RTEX0MUEFfVREMDEFBQVcdDABZHQwAYR0MAGMNDKhnQnBBZUFBLtgC6AfgAsfTAeoCNGl0dW5lcy5hcHBsZS5jb20vdXMvYXBwAQTwvG5leHVzLXNkay1hcHAvaWQ3MzY4Njk4MzOAAwGIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD-aN64AMA6AMC-AMAgAQAkgQGL3V0L3YzmAQAogQLMTAuNzUuMTEuNDSoBACyBBcIABAEGMACIDIoASgCKAMoBCgFMAA4ArgEAMAEAMgEANIEDTk1OCNOWU0yOjQzNjHaBAIIAOAEAPAE-NOFUvoEEgkAAABAluRCQBEAAADAAppewIIFCTczNgmqIIgFAZgFAKAF_xEBGAHABQDJBQAFARDwP9IFCQFABQFo2AUB4AUB8AUB-gUECAAQAJAGAZgGALgGAMEGBSAsAPC_0AbWAtoGFgoQCREZAVwQABgA4AYE8gYCCACABwGIBwCgB0DIBwA.&s=571a47ebf4c02182eddc8edc156a3b1212484cbf",
+ "timeout_ms": 10000,
+ "ad_profile_id": 27079,
+ "rtb_video_fallback": false,
+ "ads": [
+ {
+ "content_source": "rtb",
+ "ad_type": "video",
+ "notify_url": "https://nym1-ib.adnxs.com/vast_track/v2?info=ZQAAAAMArgAFAQnDe3peAAAAABG-_iqjjxzFTBnDe3peAAAAACD404VSKAAwvgc4vgdAx9FMSPP7jAJQpYfqB1gBYgItLWgBcAF4AIABAogBAJABwAKYATKgAQCoAfjThVKwAQE.&s=e16d7e8c3217476e84c0bda1789fee8d39f0313d&event_type=1",
+ "usersync_url": "https%3A%2F%2Facdn.adnxs.com%2Fdmp%2Fasync_usersync.html",
+ "buyer_member_id": 958,
+ "creative_id": 172059128,
+ "media_type_id": 4,
+ "media_subtype_id": 64,
+ "brand_category_id": 0,
+ "client_initiated_ad_counting": true,
+ "rtb": {
+ "video": {
+ "player_width": 300,
+ "player_height": 250,
+ "duration_ms": 32000,
+ "playback_methods": [
+ "auto_play_sound_off"
+ ],
+ "frameworks": [
+ "vpaid_1_0",
+ "vpaid_2_0",
+ "mraid_1",
+ "mraid_2",
+ "ormma"
+ ],
+ "content": "adnxs00:00:32"
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/AuthenticationChallengeSender.swift b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/AuthenticationChallengeSender.swift
new file mode 100644
index 000000000..a15ae8ee0
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/AuthenticationChallengeSender.swift
@@ -0,0 +1,35 @@
+
+import Foundation
+import WebKit
+
+@objc class AuthenticationChallengeSender : NSObject, URLAuthenticationChallengeSender {
+
+ typealias AuthenticationChallengeHandler = (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
+
+ let handler: AuthenticationChallengeHandler
+
+ init(handler: @escaping AuthenticationChallengeHandler) {
+ self.handler = handler
+ super.init()
+ }
+
+ @objc func use(_ credential: URLCredential, for challenge: URLAuthenticationChallenge) {
+ handler(.useCredential, credential)
+ }
+
+ @objc func continueWithoutCredential(for challenge: URLAuthenticationChallenge) {
+ handler(.useCredential, nil)
+ }
+
+ @objc func cancel(_ challenge: URLAuthenticationChallenge) {
+ handler(.cancelAuthenticationChallenge, nil)
+ }
+
+ @objc func performDefaultHandling(for challenge: URLAuthenticationChallenge) {
+ handler(.performDefaultHandling, nil)
+ }
+
+ @objc func rejectProtectionSpaceAndContinue(with challenge: URLAuthenticationChallenge) {
+ handler(.rejectProtectionSpace, nil)
+ }
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/NSURLProtocol+WebKitSupport.swift b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/NSURLProtocol+WebKitSupport.swift
new file mode 100644
index 000000000..af4ccea6c
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/NSURLProtocol+WebKitSupport.swift
@@ -0,0 +1,35 @@
+
+
+import Foundation
+import WebKit
+
+extension URLProtocol {
+
+ @objc class func contextControllerClass()->AnyClass {
+ return NSClassFromString("WKBrowsingContextController")!
+ }
+
+ @objc class func registerSchemeSelector()->Selector {
+ return NSSelectorFromString("registerSchemeForCustomProtocol:")
+ }
+
+ @objc class func unregisterSchemeSelector()->Selector {
+ return NSSelectorFromString("unregisterSchemeForCustomProtocol:")
+ }
+
+ @objc class func wk_register(scheme:String){
+ let cls:AnyClass = contextControllerClass()
+ let sel = registerSchemeSelector()
+ if cls.responds(to: sel) {
+ _ = (cls as AnyObject).perform(sel, with: scheme)
+ }
+ }
+
+ @objc class func wk_unregister(scheme:String){
+ let cls:AnyClass = contextControllerClass()
+ let sel = unregisterSchemeSelector()
+ if cls.responds(to: sel) {
+ _ = (cls as AnyObject).perform(sel, with: scheme)
+ }
+ }
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLProtocol+WKWebViewSupport.h b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLProtocol+WKWebViewSupport.h
new file mode 100755
index 000000000..352fc2098
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLProtocol+WKWebViewSupport.h
@@ -0,0 +1,24 @@
+/* Copyright 2019 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
+
+@interface NSURLProtocol (WKWebViewSupport)
+
++ (void)wk_registerScheme:(NSString *)scheme;
++ (void)wk_unregisterScheme:(NSString *)scheme;
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLProtocol+WKWebViewSupport.m b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLProtocol+WKWebViewSupport.m
new file mode 100755
index 000000000..afaab24ae
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLProtocol+WKWebViewSupport.m
@@ -0,0 +1,60 @@
+/* Copyright 2019 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 "NSURLProtocol+WKWebViewSupport.h"
+#import
+
+Class WK_ContextControllerClass() {
+ static Class cls;
+ if (!cls) {
+ cls = [[[WKWebView new] valueForKey:@"browsingContextController"] class];
+ }
+ return cls;
+}
+
+SEL WK_RegisterSchemeSelector() {
+ return NSSelectorFromString(@"registerSchemeForCustomProtocol:");
+}
+
+SEL WK_UnregisterSchemeSelector() {
+ return NSSelectorFromString(@"unregisterSchemeForCustomProtocol:");
+}
+
+@implementation NSURLProtocol (WKWebViewSupport)
+
++ (void)wk_registerScheme:(NSString *)scheme {
+ Class cls = WK_ContextControllerClass();
+ SEL sel = WK_RegisterSchemeSelector();
+ if ([(id)cls respondsToSelector:sel]) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+ [(id)cls performSelector:sel withObject:scheme];
+#pragma clang diagnostic pop
+ }
+}
+
++ (void)wk_unregisterScheme:(NSString *)scheme {
+ Class cls = WK_ContextControllerClass();
+ SEL sel = WK_UnregisterSchemeSelector();
+ if ([(id)cls respondsToSelector:sel]) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+ [(id)cls performSelector:sel withObject:scheme];
+#pragma clang diagnostic pop
+ }
+}
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLSessionConfiguration+ANProtocols.h b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLSessionConfiguration+ANProtocols.h
new file mode 100644
index 000000000..de88add67
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLSessionConfiguration+ANProtocols.h
@@ -0,0 +1,20 @@
+/* Copyright 2019 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.
+ */
+
+
+
+@interface NSURLSessionConfiguration (ANProtocols)
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLSessionConfiguration+ANProtocols.m b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLSessionConfiguration+ANProtocols.m
new file mode 100644
index 000000000..83c6894e0
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/NSURLSessionConfiguration+ANProtocols.m
@@ -0,0 +1,36 @@
+/* Copyright 2019 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 "NSURLSessionConfiguration+ANProtocols.h"
+#import "SDKValidationURLProtocol.h"
+
+@import ObjectiveC.runtime;
+
+@implementation NSURLSessionConfiguration (ANProtocols)
+
++ (NSURLSessionConfiguration *)zw_defaultSessionConfiguration {
+ NSURLSessionConfiguration *configuration = [self zw_defaultSessionConfiguration];
+ NSArray *protocolClasses = @[[SDKValidationURLProtocol class]];
+ configuration.protocolClasses = protocolClasses;
+ return configuration;
+}
++ (void)load{
+ Method systemMethod = class_getClassMethod([NSURLSessionConfiguration class], @selector(defaultSessionConfiguration));
+ Method zwMethod = class_getClassMethod([self class], @selector(zw_defaultSessionConfiguration));
+ method_exchangeImplementations(systemMethod, zwMethod);
+}
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/SDKValidationURLProtocol.h b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/SDKValidationURLProtocol.h
new file mode 100644
index 000000000..244dddb11
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/SDKValidationURLProtocol.h
@@ -0,0 +1,25 @@
+/* Copyright 2019 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
+
+@protocol SDKValidationURLProtocolDelegate
+- (void)didReceiveIABResponse:(NSString *)response;
+@end
+
+@interface SDKValidationURLProtocol: NSURLProtocol
++ (void) setDelegate:(id)delegate;
++ (id ) delegate;
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/SDKValidationURLProtocol.m b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/SDKValidationURLProtocol.m
new file mode 100644
index 000000000..5f295b05c
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/SDKValidationURL/SDKValidationURLProtocol.m
@@ -0,0 +1,101 @@
+/* Copyright 2019 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 "SDKValidationURLProtocol.h"
+@interface SDKValidationURLProtocol()
+@property (nonatomic, strong) NSURLConnection *connection;
+@property NSMutableData *data;
+@end
+
+@implementation SDKValidationURLProtocol
+static id classDelegate = nil;
+
++ (void)setDelegate:(id)delegate
+{
+ classDelegate = delegate;
+}
+
++ (id)delegate
+{
+ return classDelegate;
+}
+
++ (BOOL)canInitWithRequest:(NSURLRequest *)request
+{
+ if ([NSURLProtocol propertyForKey:@"AppNexusURLProtocolHandledKey" inRequest:request]) {
+ return NO;
+ }
+ if ([SDKValidationURLProtocol supportedPBSHost:request.URL.absoluteString]) {
+ if (classDelegate != nil) {
+ [classDelegate didReceiveIABResponse:request.URL.absoluteString];
+ }
+ return YES;
+ }
+ return NO;
+}
+
++ (BOOL) supportedPBSHost:(NSString *) hostURL {
+ if (hostURL != nil) {
+ if ([hostURL containsString:@"iabtechlab.com"] || [hostURL containsString:@"appnexustracker.com"] ) {
+ return YES;
+ }
+ }
+ return NO;
+}
+
++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
+ return request;
+}
+
++ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b {
+ return [super requestIsCacheEquivalent:a toRequest:b];
+}
+
+- (void)startLoading
+{
+ self.data = [[NSMutableData alloc] init];
+ NSMutableURLRequest *newRequest = [self.request mutableCopy];
+ [NSURLProtocol setProperty:@YES forKey:@"AppNexusURLProtocolHandledKey" inRequest:newRequest];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.connection = [NSURLConnection connectionWithRequest:newRequest delegate:self];
+#pragma clang diagnostic pop
+}
+
+- (void)stopLoading
+{
+ [self.connection cancel];
+ self.connection = nil;
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
+ [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
+ [self.client URLProtocol:self didLoadData:data];
+ [self.data appendData:data];
+}
+
+- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
+ [self.client URLProtocolDidFinishLoading:self];
+}
+
+- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
+ [self.client URLProtocol:self didFailWithError:error];
+}
+
+
+@end
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/TrackerTest-Bridging-Header.h b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/TrackerTest-Bridging-Header.h
new file mode 100644
index 000000000..46f4c846d
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/TrackerTest-Bridging-Header.h
@@ -0,0 +1,15 @@
+/* Copyright 2020 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.
+ */
+
diff --git a/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/WebKitURLProtocol.swift b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/WebKitURLProtocol.swift
new file mode 100644
index 000000000..b66a17d55
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/WkWebViewTracking/WebKitURLProtocol.swift
@@ -0,0 +1,124 @@
+
+
+import Foundation
+import WebKit
+
+extension Notification.Name {
+ static let didReceiveURLResponse = Notification.Name("didReceiveURLResponse")
+}
+
+@objc class WebKitURLProtocol: URLProtocol {
+
+ static let internalKey = "com.toshiki.URLProtocolInternal"
+
+ private lazy var session: URLSession = { [unowned self] in
+ return URLSession(configuration: .default, delegate: self, delegateQueue: nil)
+ }()
+
+ private var response: URLResponse?
+ private var responseData: NSMutableData?
+
+ open override class func canInit(with request: URLRequest) -> Bool {
+ return canServeRequest(request)
+ }
+
+ override open class func canInit(with task: URLSessionTask) -> Bool
+ {
+ guard let request = task.currentRequest else { return false }
+ return canServeRequest(request)
+ }
+
+ private class func canServeRequest(_ request: URLRequest) -> Bool
+ {
+ guard
+ URLProtocol.property(forKey: WebKitURLProtocol.internalKey, in: request) == nil,
+ let url = request.url,
+ (url.absoluteString.hasPrefix("http") || url.absoluteString.hasPrefix("https"))
+ else {
+ return false
+ }
+ return true
+ }
+
+ override func startLoading() {
+ let mutableRequest = (request as NSURLRequest).mutableCopy() as! NSMutableURLRequest
+ URLProtocol.setProperty(true, forKey: WebKitURLProtocol.internalKey, in: mutableRequest)
+ session.dataTask(with: mutableRequest as URLRequest).resume()
+
+ }
+
+ override func stopLoading() {
+ session.getTasksWithCompletionHandler { dataTasks, _, _ in
+ dataTasks.forEach { $0.cancel() }
+ }
+ }
+
+ open override class func canonicalRequest(for request: URLRequest) -> URLRequest {
+ return request
+ }
+}
+
+extension WebKitURLProtocol: URLSessionDataDelegate {
+ @objc public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
+ responseData?.append(data)
+
+ client?.urlProtocol(self, didLoad: data)
+ }
+
+ @objc public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
+ self.response = response
+ self.responseData = NSMutableData()
+
+ client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: URLCache.StoragePolicy.notAllowed)
+ completionHandler(.allow)
+ }
+
+ @objc public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
+ defer {
+ if let error = error {
+ client?.urlProtocol(self, didFailWithError: error)
+ } else {
+ client?.urlProtocolDidFinishLoading(self)
+ }
+ }
+
+ guard task.originalRequest != nil else {
+ return
+ }
+
+ if let response = response {
+// if let mime = response.mimeType, mime.contains("mpegurl") {
+// let data = (responseData ?? NSMutableData()) as Data
+// print(response.url!)
+// print(data.count)
+// }
+ NotificationCenter.default.post(name: .didReceiveURLResponse, object: nil, userInfo: ["response": response])
+ }
+
+ }
+
+ @objc public func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
+
+ let updatedRequest: URLRequest
+ if URLProtocol.property(forKey: WebKitURLProtocol.internalKey, in: request) != nil {
+ let mutableRequest = (request as NSURLRequest).mutableCopy() as! NSMutableURLRequest
+ URLProtocol.removeProperty(forKey: WebKitURLProtocol.internalKey, in: mutableRequest)
+
+ updatedRequest = mutableRequest as URLRequest
+ } else {
+ updatedRequest = request
+ }
+
+ client?.urlProtocol(self, wasRedirectedTo: updatedRequest, redirectResponse: response)
+ completionHandler(updatedRequest)
+ }
+
+ @objc public func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
+ let wrappedChallenge = URLAuthenticationChallenge(authenticationChallenge: challenge, sender: AuthenticationChallengeSender(handler: completionHandler))
+ client?.urlProtocol(self, didReceive: wrappedChallenge)
+ }
+
+ @objc public func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
+ client?.urlProtocolDidFinishLoading(self)
+ }
+}
diff --git a/tests/TrackerUITest/HelpingLibrary/readme.md b/tests/TrackerUITest/HelpingLibrary/readme.md
new file mode 100644
index 000000000..8670260b8
--- /dev/null
+++ b/tests/TrackerUITest/HelpingLibrary/readme.md
@@ -0,0 +1,14 @@
+#### ANNativeAdResponse+PrivateMethods
+* To use unregisterViewFromTracking called for Native & Banner Native
+
+
+#### ANVerificationScriptResource+ANTest.h
+* To mock OMID for Banner Native,Banner Native Renderer and Native
+
+
+#### WkWebViewTracking
+Contain file used for Tracking URLs and Events
+
+
+#### Stubbing Folder
+To mock stubbing with mock response
diff --git a/tests/TrackerUITest/TrackerApp.xcodeproj/project.pbxproj b/tests/TrackerUITest/TrackerApp.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..c3db81725
--- /dev/null
+++ b/tests/TrackerUITest/TrackerApp.xcodeproj/project.pbxproj
@@ -0,0 +1,1236 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0E49155C24065546003B7CC2 /* AdType.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E49155A24065546003B7CC2 /* AdType.storyboard */; };
+ 0E49157624065911003B7CC2 /* MARBannerNativeRendererAdTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E49156724065911003B7CC2 /* MARBannerNativeRendererAdTrackerTestVC.storyboard */; };
+ 0E49157724065911003B7CC2 /* MARBannerNativeRendererAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E49156824065911003B7CC2 /* MARBannerNativeRendererAdTrackerTestVC.m */; };
+ 0E49158C24065963003B7CC2 /* VideoAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E49158024065963003B7CC2 /* VideoAdTrackerTestVC.m */; };
+ 0E49158D24065963003B7CC2 /* VideoAdTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E49158224065963003B7CC2 /* VideoAdTrackerTestVC.storyboard */; };
+ 0E49158E24065963003B7CC2 /* BannerNativeVideoTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E49158424065963003B7CC2 /* BannerNativeVideoTrackerTestVC.storyboard */; };
+ 0E49158F24065963003B7CC2 /* BannerNativeVideoTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E49158524065963003B7CC2 /* BannerNativeVideoTrackerTestVC.m */; };
+ 0E49159024065963003B7CC2 /* NativeAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E49158824065963003B7CC2 /* NativeAdTrackerTestVC.m */; };
+ 0E49159124065963003B7CC2 /* ANNativeAdView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0E49158924065963003B7CC2 /* ANNativeAdView.xib */; };
+ 0E49159224065963003B7CC2 /* NativeAdTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E49158B24065963003B7CC2 /* NativeAdTrackerTestVC.storyboard */; };
+ 0E49159524065ABF003B7CC2 /* ANNativeAdView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E49159324065ABF003B7CC2 /* ANNativeAdView.m */; };
+ 0E49159B24065E84003B7CC2 /* InterstitialAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E49159824065E84003B7CC2 /* InterstitialAdTrackerTestVC.m */; };
+ 0E49159C24065E84003B7CC2 /* InterstitialAdTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E49159924065E84003B7CC2 /* InterstitialAdTrackerTestVC.storyboard */; };
+ 0E877AB423FEA40700DC962F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E877AB323FEA40700DC962F /* AppDelegate.m */; };
+ 0E877ABF23FEA40900DC962F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0E877ABE23FEA40900DC962F /* Assets.xcassets */; };
+ 0E877AC223FEA40900DC962F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E877AC023FEA40900DC962F /* LaunchScreen.storyboard */; };
+ 0E877AC523FEA40900DC962F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E877AC423FEA40900DC962F /* main.m */; };
+ FC1DFE9B2590DA62008AE0EB /* InterstitialAdViewabilityTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFE972590DA62008AE0EB /* InterstitialAdViewabilityTrackerTestVC.m */; };
+ FC1DFE9C2590DA62008AE0EB /* InterstitialAdViewabilityTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FC1DFE992590DA62008AE0EB /* InterstitialAdViewabilityTrackerTestVC.storyboard */; };
+ FC1DFEB22590E7EF008AE0EB /* ANVerificationScriptResource+ANTest.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEB12590E7EF008AE0EB /* ANVerificationScriptResource+ANTest.m */; };
+ FC1DFEB92590E8C7008AE0EB /* BannerNativeAdViewabilityTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FC1DFEB62590E8C7008AE0EB /* BannerNativeAdViewabilityTrackerTestVC.storyboard */; };
+ FC1DFEBA2590E8C7008AE0EB /* BannerNativeAdViewabilityTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEB72590E8C7008AE0EB /* BannerNativeAdViewabilityTrackerTestVC.m */; };
+ FC1DFECA2591229F008AE0EB /* NSURLProtocol+WKWebViewSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEC42591229F008AE0EB /* NSURLProtocol+WKWebViewSupport.m */; };
+ FC1DFECB2591229F008AE0EB /* SDKValidationURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEC72591229F008AE0EB /* SDKValidationURLProtocol.m */; };
+ FC1DFECC2591229F008AE0EB /* NSURLSessionConfiguration+ANProtocols.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEC92591229F008AE0EB /* NSURLSessionConfiguration+ANProtocols.m */; };
+ FC1F380A253D54F5006DD370 /* AdTypeTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1F3809253D54F5006DD370 /* AdTypeTableViewController.m */; };
+ FC1F3813253D5799006DD370 /* RTBVideoAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC1F380C253D5799006DD370 /* RTBVideoAd.json */; };
+ FC1F3814253D5799006DD370 /* RTBBannerNativeRendererAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC1F380D253D5799006DD370 /* RTBBannerNativeRendererAd.json */; };
+ FC1F3815253D5799006DD370 /* RTBBannerNativeAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC1F380E253D5799006DD370 /* RTBBannerNativeAd.json */; };
+ FC1F3816253D5799006DD370 /* RTBNativeAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC1F380F253D5799006DD370 /* RTBNativeAd.json */; };
+ FC1F3817253D5799006DD370 /* RTBBannerVideoAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC1F3810253D5799006DD370 /* RTBBannerVideoAd.json */; };
+ FC1F3818253D5799006DD370 /* RTBBannerAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC1F3811253D5799006DD370 /* RTBBannerAd.json */; };
+ FC1F3819253D5799006DD370 /* RTBInterstitialAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC1F3812253D5799006DD370 /* RTBInterstitialAd.json */; };
+ FC77572C25374EB400400FE7 /* AppNexusSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC77572225374E7000400FE7 /* AppNexusSDK.framework */; };
+ FC77572D25374EB400400FE7 /* AppNexusSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FC77572225374E7000400FE7 /* AppNexusSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ FC77575D25374EFB00400FE7 /* NSURLRequest+HTTPBodyTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77573325374EFB00400FE7 /* NSURLRequest+HTTPBodyTesting.m */; };
+ FC77575E25374EFB00400FE7 /* ANStubManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77573525374EFB00400FE7 /* ANStubManager.m */; };
+ FC77575F25374EFB00400FE7 /* ANGlobal+ANTest.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77573725374EFB00400FE7 /* ANGlobal+ANTest.m */; };
+ FC77576025374EFB00400FE7 /* ANHTTPStubbingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77573925374EFB00400FE7 /* ANHTTPStubbingManager.m */; };
+ FC77576125374EFB00400FE7 /* ANHTTPCookieStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77573B25374EFB00400FE7 /* ANHTTPCookieStorage.m */; };
+ FC77576225374EFB00400FE7 /* ANURLConnectionStub.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77573E25374EFB00400FE7 /* ANURLConnectionStub.m */; };
+ FC77576325374EFB00400FE7 /* ANHTTPStubURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77574025374EFB00400FE7 /* ANHTTPStubURLProtocol.m */; };
+ FC77576425374EFB00400FE7 /* NSObject+Swizzling.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77574125374EFB00400FE7 /* NSObject+Swizzling.m */; };
+ FC77576525374EFB00400FE7 /* ANURLConnectionStub+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = FC77574325374EFB00400FE7 /* ANURLConnectionStub+NSURLSessionConfiguration.m */; };
+ FC7BCF3A2588FC4E00739FC1 /* BannerAdViewabilityTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC7BCF372588FC4E00739FC1 /* BannerAdViewabilityTrackerTestVC.m */; };
+ FC7BCF3B2588FC4E00739FC1 /* BannerAdViewabilityTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FC7BCF392588FC4E00739FC1 /* BannerAdViewabilityTrackerTestVC.storyboard */; };
+ FC7BCF40258905DB00739FC1 /* OMID_BannerAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC7BCF3F258905DB00739FC1 /* OMID_BannerAd.json */; };
+ FC7BCF5A258B9F8700739FC1 /* BannerVideoAdViewabilityTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC7BCF57258B9F8700739FC1 /* BannerVideoAdViewabilityTrackerTestVC.m */; };
+ FC7BCF5B258B9F8700739FC1 /* BannerVideoAdViewabilityTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FC7BCF59258B9F8700739FC1 /* BannerVideoAdViewabilityTrackerTestVC.storyboard */; };
+ FC7BCF66258BC31300739FC1 /* OMID_VideoAd.json in Resources */ = {isa = PBXBuildFile; fileRef = FC7BCF65258BC31300739FC1 /* OMID_VideoAd.json */; };
+ FC85ACF8258D19C100A64F7D /* VideoAdViewabilityTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC85ACF5258D19C100A64F7D /* VideoAdViewabilityTrackerTestVC.m */; };
+ FC85ACF9258D19C100A64F7D /* VideoAdViewabilityTrackerTestVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FC85ACF7258D19C100A64F7D /* VideoAdViewabilityTrackerTestVC.storyboard */; };
+ FC8FE6E525483AE000971E2A /* UnifiedNativeAdView.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC8FE6E225483AE000971E2A /* UnifiedNativeAdView.xib */; };
+ FCB2469F2539B4FB00600B3D /* NSURLProtocol+WebKitSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB2469B2539B4FB00600B3D /* NSURLProtocol+WebKitSupport.swift */; };
+ FCB246A02539B4FB00600B3D /* WebKitURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB2469C2539B4FB00600B3D /* WebKitURLProtocol.swift */; };
+ FCB246A12539B4FB00600B3D /* AuthenticationChallengeSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB2469D2539B4FB00600B3D /* AuthenticationChallengeSender.swift */; };
+ FCCB89C725AE352D0029E24E /* readme.md in Resources */ = {isa = PBXBuildFile; fileRef = FCCB89C625AE352D0029E24E /* readme.md */; };
+ FCDE87B325F28CA300E9B117 /* ContentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FCDE87AC25F28CA300E9B117 /* ContentCell.m */; };
+ FCDE87B425F28CA300E9B117 /* ScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FCDE87AD25F28CA300E9B117 /* ScrollViewController.m */; };
+ FCDE87B525F28CA300E9B117 /* BannerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FCDE87AE25F28CA300E9B117 /* BannerCell.m */; };
+ FCDE87B625F28CA300E9B117 /* ScrollViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FCDE87AF25F28CA300E9B117 /* ScrollViewController.storyboard */; };
+ FCDE87BA25F2933300E9B117 /* BannerAdOnePXScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FCDE87B925F2933300E9B117 /* BannerAdOnePXScrollViewController.m */; };
+ FCE7E8CC2593C9E300801E27 /* InterstitialViewabilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEA92590DC8F008AE0EB /* InterstitialViewabilityTrackerTests.m */; };
+ FCE7E8CD2593C9E300801E27 /* BannerViewabilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FC7BCF212588ED3400739FC1 /* BannerViewabilityTrackerTests.m */; };
+ FCE7E8CE2593C9E300801E27 /* BannerNativeViewabilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEEA25922617008AE0EB /* BannerNativeViewabilityTrackerTests.m */; };
+ FCE7E8CF2593C9E300801E27 /* NativeViewabilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1DFEF025922D79008AE0EB /* NativeViewabilityTrackerTests.m */; };
+ FCE7E8D02593C9E300801E27 /* VideoViewabilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FC85ACEE258D198900A64F7D /* VideoViewabilityTrackerTests.m */; };
+ FCE7E8D12593C9E300801E27 /* BannerVideoViewabilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FC85ACE7258D0C5200A64F7D /* BannerVideoViewabilityTrackerTests.m */; };
+ FCE7E8DA2593C9ED00801E27 /* BannerAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC75568B253DAFE000C2C518 /* BannerAdTrackerTestVC.m */; };
+ FCE7E8DB2593C9ED00801E27 /* BannerNativeRendererAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC75567B253D78EF00C2C518 /* BannerNativeRendererAdTrackerTestVC.m */; };
+ FCE7E8DC2593C9ED00801E27 /* MARBannerNativeRendererAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5D432541841300240D74 /* MARBannerNativeRendererAdTrackerTestVC.m */; };
+ FCE7E8DD2593C9ED00801E27 /* MARNativeAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5D3E2541759A00240D74 /* MARNativeAdTrackerTestVC.m */; };
+ FCE7E8DE2593C9ED00801E27 /* NativeAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC755685253D9E8D00C2C518 /* NativeAdTrackerTestVC.m */; };
+ FCE7E8E02593C9ED00801E27 /* BannerNativeAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC755680253D960B00C2C518 /* BannerNativeAdTrackerTestVC.m */; };
+ FCE7E8E12593C9ED00801E27 /* BannerVideoAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC755691253EC4BC00C2C518 /* BannerVideoAdTrackerTestVC.m */; };
+ FCE7E8E32593C9ED00801E27 /* InterstitialAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC75568E253DC80C00C2C518 /* InterstitialAdTrackerTestVC.m */; };
+ FCE7E8E42593C9ED00801E27 /* VideoAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC755695253EC6B800C2C518 /* VideoAdTrackerTestVC.m */; };
+ FCE7E8E62593C9ED00801E27 /* MARBannerAdTrackerTestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1C6D14253F787E00781272 /* MARBannerAdTrackerTestVC.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ FC75564E253D773A00C2C518 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = FC77571C25374E7000400FE7 /* AppNexusSDK.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = 8A9AED8B1A1BE84F00C58BDA;
+ remoteInfo = AppNexusSDK;
+ };
+ FC77572125374E7000400FE7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = FC77571C25374E7000400FE7 /* AppNexusSDK.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 8A9AED8C1A1BE84F00C58BDA;
+ remoteInfo = AppNexusSDK;
+ };
+ FC77572325374E7000400FE7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = FC77571C25374E7000400FE7 /* AppNexusSDK.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = F5731AFD228B43570012B134;
+ remoteInfo = AppNexusNativeSDK;
+ };
+ FCE7E8B22593C9C100801E27 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0E877AA723FEA40700DC962F /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0E877AAE23FEA40700DC962F;
+ remoteInfo = TrackerApp;
+ };
+ FCE7E8C32593C9D700801E27 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 0E877AA723FEA40700DC962F /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0E877AAE23FEA40700DC962F;
+ remoteInfo = TrackerApp;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 0EE0578423FED62F00D61405 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ FC77572D25374EB400400FE7 /* AppNexusSDK.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 0E49155B24065546003B7CC2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AdType.storyboard; sourceTree = ""; };
+ 0E49156624065911003B7CC2 /* MARBannerNativeRendererAdTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MARBannerNativeRendererAdTrackerTestVC.h; sourceTree = ""; };
+ 0E49156724065911003B7CC2 /* MARBannerNativeRendererAdTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MARBannerNativeRendererAdTrackerTestVC.storyboard; sourceTree = ""; };
+ 0E49156824065911003B7CC2 /* MARBannerNativeRendererAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MARBannerNativeRendererAdTrackerTestVC.m; sourceTree = ""; };
+ 0E49158024065963003B7CC2 /* VideoAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoAdTrackerTestVC.m; sourceTree = ""; };
+ 0E49158124065963003B7CC2 /* VideoAdTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoAdTrackerTestVC.h; sourceTree = ""; };
+ 0E49158224065963003B7CC2 /* VideoAdTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = VideoAdTrackerTestVC.storyboard; sourceTree = ""; };
+ 0E49158424065963003B7CC2 /* BannerNativeVideoTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = BannerNativeVideoTrackerTestVC.storyboard; sourceTree = ""; };
+ 0E49158524065963003B7CC2 /* BannerNativeVideoTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerNativeVideoTrackerTestVC.m; sourceTree = ""; };
+ 0E49158624065963003B7CC2 /* BannerNativeVideoTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BannerNativeVideoTrackerTestVC.h; sourceTree = ""; };
+ 0E49158824065963003B7CC2 /* NativeAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeAdTrackerTestVC.m; sourceTree = ""; };
+ 0E49158924065963003B7CC2 /* ANNativeAdView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ANNativeAdView.xib; sourceTree = ""; };
+ 0E49158A24065963003B7CC2 /* NativeAdTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeAdTrackerTestVC.h; sourceTree = ""; };
+ 0E49158B24065963003B7CC2 /* NativeAdTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NativeAdTrackerTestVC.storyboard; sourceTree = ""; };
+ 0E49159324065ABF003B7CC2 /* ANNativeAdView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANNativeAdView.m; sourceTree = ""; };
+ 0E49159424065ABF003B7CC2 /* ANNativeAdView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANNativeAdView.h; sourceTree = ""; };
+ 0E49159824065E84003B7CC2 /* InterstitialAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InterstitialAdTrackerTestVC.m; sourceTree = ""; };
+ 0E49159924065E84003B7CC2 /* InterstitialAdTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = InterstitialAdTrackerTestVC.storyboard; sourceTree = ""; };
+ 0E49159A24065E84003B7CC2 /* InterstitialAdTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterstitialAdTrackerTestVC.h; sourceTree = ""; };
+ 0E877AAF23FEA40700DC962F /* TrackerApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TrackerApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0E877AB223FEA40700DC962F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ 0E877AB323FEA40700DC962F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ 0E877ABE23FEA40900DC962F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 0E877AC123FEA40900DC962F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 0E877AC323FEA40900DC962F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 0E877AC423FEA40900DC962F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ FC1C6D14253F787E00781272 /* MARBannerAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MARBannerAdTrackerTestVC.m; sourceTree = ""; };
+ FC1DFE972590DA62008AE0EB /* InterstitialAdViewabilityTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InterstitialAdViewabilityTrackerTestVC.m; sourceTree = ""; };
+ FC1DFE982590DA62008AE0EB /* InterstitialAdViewabilityTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterstitialAdViewabilityTrackerTestVC.h; sourceTree = ""; };
+ FC1DFE992590DA62008AE0EB /* InterstitialAdViewabilityTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = InterstitialAdViewabilityTrackerTestVC.storyboard; sourceTree = ""; };
+ FC1DFEA92590DC8F008AE0EB /* InterstitialViewabilityTrackerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InterstitialViewabilityTrackerTests.m; sourceTree = ""; };
+ FC1DFEB02590E7EF008AE0EB /* ANVerificationScriptResource+ANTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ANVerificationScriptResource+ANTest.h"; sourceTree = ""; };
+ FC1DFEB12590E7EF008AE0EB /* ANVerificationScriptResource+ANTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ANVerificationScriptResource+ANTest.m"; sourceTree = ""; };
+ FC1DFEB62590E8C7008AE0EB /* BannerNativeAdViewabilityTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = BannerNativeAdViewabilityTrackerTestVC.storyboard; sourceTree = ""; };
+ FC1DFEB72590E8C7008AE0EB /* BannerNativeAdViewabilityTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerNativeAdViewabilityTrackerTestVC.m; sourceTree = ""; };
+ FC1DFEB82590E8C7008AE0EB /* BannerNativeAdViewabilityTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BannerNativeAdViewabilityTrackerTestVC.h; sourceTree = ""; };
+ FC1DFEC42591229F008AE0EB /* NSURLProtocol+WKWebViewSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURLProtocol+WKWebViewSupport.m"; sourceTree = ""; };
+ FC1DFEC52591229F008AE0EB /* SDKValidationURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDKValidationURLProtocol.h; sourceTree = ""; };
+ FC1DFEC62591229F008AE0EB /* NSURLSessionConfiguration+ANProtocols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURLSessionConfiguration+ANProtocols.h"; sourceTree = ""; };
+ FC1DFEC72591229F008AE0EB /* SDKValidationURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDKValidationURLProtocol.m; sourceTree = ""; };
+ FC1DFEC82591229F008AE0EB /* NSURLProtocol+WKWebViewSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURLProtocol+WKWebViewSupport.h"; sourceTree = ""; };
+ FC1DFEC92591229F008AE0EB /* NSURLSessionConfiguration+ANProtocols.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURLSessionConfiguration+ANProtocols.m"; sourceTree = ""; };
+ FC1DFEDB25912AD7008AE0EB /* ANNativeAdResponse+PrivateMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ANNativeAdResponse+PrivateMethods.h"; sourceTree = ""; };
+ FC1DFEEA25922617008AE0EB /* BannerNativeViewabilityTrackerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerNativeViewabilityTrackerTests.m; sourceTree = ""; };
+ FC1DFEF025922D79008AE0EB /* NativeViewabilityTrackerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeViewabilityTrackerTests.m; sourceTree = ""; };
+ FC1F3808253D54F5006DD370 /* AdTypeTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdTypeTableViewController.h; sourceTree = ""; };
+ FC1F3809253D54F5006DD370 /* AdTypeTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AdTypeTableViewController.m; sourceTree = ""; };
+ FC1F380C253D5799006DD370 /* RTBVideoAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RTBVideoAd.json; sourceTree = ""; };
+ FC1F380D253D5799006DD370 /* RTBBannerNativeRendererAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RTBBannerNativeRendererAd.json; sourceTree = ""; };
+ FC1F380E253D5799006DD370 /* RTBBannerNativeAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RTBBannerNativeAd.json; sourceTree = ""; };
+ FC1F380F253D5799006DD370 /* RTBNativeAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RTBNativeAd.json; sourceTree = ""; };
+ FC1F3810253D5799006DD370 /* RTBBannerVideoAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RTBBannerVideoAd.json; sourceTree = ""; };
+ FC1F3811253D5799006DD370 /* RTBBannerAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RTBBannerAd.json; sourceTree = ""; };
+ FC1F3812253D5799006DD370 /* RTBInterstitialAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = RTBInterstitialAd.json; sourceTree = ""; };
+ FC75567B253D78EF00C2C518 /* BannerNativeRendererAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerNativeRendererAdTrackerTestVC.m; sourceTree = ""; };
+ FC755680253D960B00C2C518 /* BannerNativeAdTrackerTestVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BannerNativeAdTrackerTestVC.m; sourceTree = ""; };
+ FC755685253D9E8D00C2C518 /* NativeAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeAdTrackerTestVC.m; sourceTree = ""; };
+ FC75568B253DAFE000C2C518 /* BannerAdTrackerTestVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BannerAdTrackerTestVC.m; sourceTree = ""; };
+ FC75568E253DC80C00C2C518 /* InterstitialAdTrackerTestVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InterstitialAdTrackerTestVC.m; sourceTree = ""; };
+ FC755691253EC4BC00C2C518 /* BannerVideoAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerVideoAdTrackerTestVC.m; sourceTree = ""; };
+ FC755695253EC6B800C2C518 /* VideoAdTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoAdTrackerTestVC.m; sourceTree = ""; };
+ FC77571C25374E7000400FE7 /* AppNexusSDK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AppNexusSDK.xcodeproj; path = ../../sdk/AppNexusSDK.xcodeproj; sourceTree = ""; };
+ FC77573325374EFB00400FE7 /* NSURLRequest+HTTPBodyTesting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURLRequest+HTTPBodyTesting.m"; sourceTree = ""; };
+ FC77573425374EFB00400FE7 /* ANHTTPNetworkSession+ANTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ANHTTPNetworkSession+ANTest.h"; sourceTree = ""; };
+ FC77573525374EFB00400FE7 /* ANStubManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANStubManager.m; sourceTree = ""; };
+ FC77573625374EFB00400FE7 /* ANURLConnectionStub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANURLConnectionStub.h; sourceTree = ""; };
+ FC77573725374EFB00400FE7 /* ANGlobal+ANTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ANGlobal+ANTest.m"; sourceTree = ""; };
+ FC77573825374EFB00400FE7 /* ANHTTPStubURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANHTTPStubURLProtocol.h; sourceTree = ""; };
+ FC77573925374EFB00400FE7 /* ANHTTPStubbingManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANHTTPStubbingManager.m; sourceTree = ""; };
+ FC77573A25374EFB00400FE7 /* NSObject+Swizzling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+Swizzling.h"; sourceTree = ""; };
+ FC77573B25374EFB00400FE7 /* ANHTTPCookieStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANHTTPCookieStorage.m; sourceTree = ""; };
+ FC77573C25374EFB00400FE7 /* NSURLRequest+HTTPBodyTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURLRequest+HTTPBodyTesting.h"; sourceTree = ""; };
+ FC77573D25374EFB00400FE7 /* ANGlobal+ANTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ANGlobal+ANTest.h"; sourceTree = ""; };
+ FC77573E25374EFB00400FE7 /* ANURLConnectionStub.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANURLConnectionStub.m; sourceTree = ""; };
+ FC77573F25374EFB00400FE7 /* ANStubManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANStubManager.h; sourceTree = ""; };
+ FC77574025374EFB00400FE7 /* ANHTTPStubURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANHTTPStubURLProtocol.m; sourceTree = ""; };
+ FC77574125374EFB00400FE7 /* NSObject+Swizzling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+Swizzling.m"; sourceTree = ""; };
+ FC77574225374EFB00400FE7 /* ANHTTPCookieStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANHTTPCookieStorage.h; sourceTree = ""; };
+ FC77574325374EFB00400FE7 /* ANURLConnectionStub+NSURLSessionConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ANURLConnectionStub+NSURLSessionConfiguration.m"; sourceTree = ""; };
+ FC77574425374EFB00400FE7 /* ANHTTPStubbingManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANHTTPStubbingManager.h; sourceTree = ""; };
+ FC7BCF212588ED3400739FC1 /* BannerViewabilityTrackerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BannerViewabilityTrackerTests.m; sourceTree = ""; };
+ FC7BCF372588FC4E00739FC1 /* BannerAdViewabilityTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerAdViewabilityTrackerTestVC.m; sourceTree = ""; };
+ FC7BCF382588FC4E00739FC1 /* BannerAdViewabilityTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BannerAdViewabilityTrackerTestVC.h; sourceTree = ""; };
+ FC7BCF392588FC4E00739FC1 /* BannerAdViewabilityTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = BannerAdViewabilityTrackerTestVC.storyboard; sourceTree = ""; };
+ FC7BCF3F258905DB00739FC1 /* OMID_BannerAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = OMID_BannerAd.json; sourceTree = ""; };
+ FC7BCF57258B9F8700739FC1 /* BannerVideoAdViewabilityTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerVideoAdViewabilityTrackerTestVC.m; sourceTree = ""; };
+ FC7BCF58258B9F8700739FC1 /* BannerVideoAdViewabilityTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BannerVideoAdViewabilityTrackerTestVC.h; sourceTree = ""; };
+ FC7BCF59258B9F8700739FC1 /* BannerVideoAdViewabilityTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = BannerVideoAdViewabilityTrackerTestVC.storyboard; sourceTree = ""; };
+ FC7BCF65258BC31300739FC1 /* OMID_VideoAd.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = OMID_VideoAd.json; sourceTree = ""; };
+ FC85ACE7258D0C5200A64F7D /* BannerVideoViewabilityTrackerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BannerVideoViewabilityTrackerTests.m; sourceTree = ""; };
+ FC85ACEE258D198900A64F7D /* VideoViewabilityTrackerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoViewabilityTrackerTests.m; sourceTree = ""; };
+ FC85ACF5258D19C100A64F7D /* VideoAdViewabilityTrackerTestVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoAdViewabilityTrackerTestVC.m; sourceTree = ""; };
+ FC85ACF6258D19C100A64F7D /* VideoAdViewabilityTrackerTestVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoAdViewabilityTrackerTestVC.h; sourceTree = ""; };
+ FC85ACF7258D19C100A64F7D /* VideoAdViewabilityTrackerTestVC.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = VideoAdViewabilityTrackerTestVC.storyboard; sourceTree = "