-
Notifications
You must be signed in to change notification settings - Fork 11
/
NativeAdmobTableViewController.swift
131 lines (110 loc) · 4.44 KB
/
NativeAdmobTableViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//
// NativeAdmobScrollViewController.swift
// TeadsSampleApp
//
// Created by Paul Nicolas on 26/07/2021.
// Copyright © 2021 Teads. All rights reserved.
//
import GoogleMobileAds
import TeadsAdMobAdapter
import TeadsSDK
import UIKit
class NativeAdmobTableViewController: TeadsViewController {
@IBOutlet var tableView: UITableView!
let headerCell = "TeadsContentCell"
let teadsAdCellIndentifier = "AdmobNativeAdTableViewCell"
let fakeArticleCell = "FakeArticleNativeTableViewCell"
let adRowNumber = 3
private var elements = [GADNativeAd?]()
var adLoader: GADAdLoader!
override func viewDidLoad() {
super.viewDidLoad()
(0 ..< 8).forEach { _ in
elements.append(nil)
}
adLoader = GADAdLoader(
// FIXME: This id below should be replaced by your own AdMob application and ad block/unit ids
adUnitID: pid,
rootViewController: self,
adTypes: [.native],
options: nil
)
adLoader?.delegate = self
let settings = TeadsAdapterSettings { settings in
settings.enableDebug()
settings.pageUrl("http://teads.tv")
}
let request = GADRequest()
request.register(settings)
adLoader.load(request)
}
func closeSlot() {
elements.removeAll { $0 != nil }
}
}
extension NativeAdmobTableViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
return elements.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: headerCell, for: indexPath)
return cell
} else if let ad = elements[indexPath.row] {
guard let cell = tableView.dequeueReusableCell(withIdentifier: teadsAdCellIndentifier, for: indexPath) as? AdmobNativeAdTableViewCell else {
return UITableViewCell()
}
cell.nativeAdView.bind(ad, videoControllerDelegate: nil)
return cell
} else {
guard let cell = tableView.dequeueReusableCell(withIdentifier: fakeArticleCell, for: indexPath) as? FakeArticleNativeTableViewCell else {
return UITableViewCell()
}
cell.setMockValues()
return cell
}
}
func tableView(_: UITableView, heightForRowAt _: IndexPath) -> CGFloat {
return 250
}
}
extension NativeAdmobTableViewController: GADAdLoaderDelegate {
func adLoader(_: GADAdLoader, didFailToReceiveAdWithError error: Error) {
print("didFailToReceiveAdWithError: \(error.localizedDescription)")
}
}
extension NativeAdmobTableViewController: GADNativeAdLoaderDelegate {
func adLoader(_: GADAdLoader, didReceive nativeAd: GADNativeAd) {
elements.insert(nativeAd, at: adRowNumber)
let indexPaths = [IndexPath(row: adRowNumber, section: 0)]
tableView.insertRows(at: indexPaths, with: .automatic)
nativeAd.delegate = self
}
}
extension NativeAdmobTableViewController: GADNativeAdDelegate {
func nativeAdDidRecordClick(_: GADNativeAd) {
// you may want to use this callback for your own analytics
}
func nativeAdDidRecordImpression(_: GADNativeAd) {
// you may want to use this callback for your own analytics
}
}
extension GADNativeAdView {
func bind(_ ad: GADNativeAd, videoControllerDelegate: GADVideoControllerDelegate? = nil) {
nativeAd = ad
// Populate the native ad view with the native ad assets.
// The headline and mediaContent are guaranteed to be present in every native ad.
(headlineView as? UILabel)?.text = ad.headline
mediaView?.mediaContent = ad.mediaContent
mediaView?.isAccessibilityElement = true
// Some native ads will include a video asset, while others do not. Apps can use the
// GADVideoController's hasVideoContent property to determine if one is present, and adjust their
// UI accordingly.
let mediaContent = ad.mediaContent
if mediaContent.hasVideoContent, let delegate = videoControllerDelegate {
// By acting as the delegate to the GADVideoController, this ViewController receives messages
// about events in the video lifecycle.
mediaContent.videoController.delegate = delegate
}
}
}