1414// limitations under the License.
1515//
1616
17+ // [START imports]
1718import AVFoundation
1819import GoogleInteractiveMediaAds
1920
21+ // [END imports]
22+
23+ // [START player_variables]
2024class PlayerContainerViewController : UIViewController , IMAAdsLoaderDelegate , IMAAdsManagerDelegate {
21- static let contentURL = URL (
22- string: " https://storage.googleapis.com/gvabox/media/samples/stock.mp4 " ) !
2325
24- static let adTagURLString =
25- " https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/ "
26- + " single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90& "
27- + " gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator= "
26+ private var contentPlayer = AVPlayer ( url: PlayerContainerViewController . contentURL)
2827
28+ private lazy var playerLayer : AVPlayerLayer = {
29+ AVPlayerLayer ( player: contentPlayer)
30+ } ( )
31+ // [END player_variables]
32+
33+ // [START ima_variables]
2934 private let adsLoader = IMAAdsLoader ( )
3035 private var adsManager : IMAAdsManager ?
31- private var contentPlayer = AVPlayer ( url: PlayerContainerViewController . contentURL)
3236
37+ private lazy var contentPlayhead : IMAAVPlayerContentPlayhead = {
38+ IMAAVPlayerContentPlayhead ( avPlayer: contentPlayer)
39+ } ( )
40+ // [END ima_variables]
41+
42+ // [START player_setup]
3343 private lazy var videoView : UIView = {
3444 let videoView = UIView ( )
3545 videoView. translatesAutoresizingMaskIntoConstraints = false
@@ -45,13 +55,13 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
4555 return videoView
4656 } ( )
4757
48- private lazy var contentPlayhead : IMAAVPlayerContentPlayhead = {
49- IMAAVPlayerContentPlayhead ( avPlayer: contentPlayer)
50- } ( )
58+ static let contentURL = URL (
59+ string: " https://storage.googleapis.com/gvabox/media/samples/stock.mp4 " ) !
5160
52- private lazy var playerLayer : AVPlayerLayer = {
53- AVPlayerLayer ( player: contentPlayer)
54- } ( )
61+ static let adTagURLString =
62+ " https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/ "
63+ + " single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90& "
64+ + " gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator= "
5565
5666 // MARK: - View controller lifecycle methods
5767
@@ -61,11 +71,13 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
6171 videoView. layer. addSublayer ( playerLayer)
6272 adsLoader. delegate = self
6373
74+ // [START set_content_observer]
6475 NotificationCenter . default. addObserver (
6576 self ,
6677 selector: #selector( contentDidFinishPlaying ( _: ) ) ,
6778 name: . AVPlayerItemDidPlayToEndTime,
6879 object: contentPlayer. currentItem)
80+ // [END set_content_observer]
6981 }
7082
7183 override func viewDidAppear( _ animated: Bool ) {
@@ -88,9 +100,11 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
88100 func playButtonPressed( ) {
89101 requestAds ( )
90102 }
103+ // [END player_setup]
91104
92105 // MARK: - IMA integration methods
93106
107+ // [START request_ads]
94108 private func requestAds( ) {
95109 // Create ad display container for ad rendering.
96110 let adDisplayContainer = IMAAdDisplayContainer (
@@ -104,18 +118,22 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
104118
105119 adsLoader. requestAds ( with: request)
106120 }
121+ // [END request_ads]
107122
108123 // MARK: - Content player methods
109124
125+ // [START content_complete]
110126 @objc func contentDidFinishPlaying( _ notification: Notification ) {
111127 // Make sure we don't call contentComplete as a result of an ad completing.
112128 if notification. object as? AVPlayerItem == contentPlayer. currentItem {
113129 adsLoader. contentComplete ( )
114130 }
115131 }
132+ // [END content_complete]
116133
117134 // MARK: - IMAAdsLoaderDelegate
118135
136+ // [START ads_loader_delegate]
119137 func adsLoader( _ loader: IMAAdsLoader , adsLoadedWith adsLoadedData: IMAAdsLoadedData ) {
120138 // Grab the instance of the IMAAdsManager and set ourselves as the delegate.
121139 adsManager = adsLoadedData. adsManager
@@ -135,16 +153,20 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
135153 }
136154 contentPlayer. play ( )
137155 }
156+ // [END ads_loader_delegate]
138157
139158 // MARK: - IMAAdsManagerDelegate
140159
160+ // [START ads_manager_delegate]
141161 func adsManager( _ adsManager: IMAAdsManager , didReceive event: IMAAdEvent ) {
142162 // When the SDK notifies us the ads have been loaded, play them.
143163 if event. type == IMAAdEventType . LOADED {
144164 adsManager. start ( )
145165 }
146166 }
167+ // [END ads_manager_delegate]
147168
169+ // [START ads_manager_error]
148170 func adsManager( _ adsManager: IMAAdsManager , didReceive error: IMAAdError ) {
149171 // Something went wrong with the ads manager after ads were loaded.
150172 // Log the error and play the content.
@@ -153,7 +175,9 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
153175 }
154176 contentPlayer. play ( )
155177 }
178+ // [END ads_manager_error]
156179
180+ // [START pause_resume_requests]
157181 func adsManagerDidRequestContentPause( _ adsManager: IMAAdsManager ) {
158182 // The SDK is going to play ads, so pause the content.
159183 contentPlayer. pause ( )
@@ -163,6 +187,7 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
163187 // The SDK is done playing ads (at least for now), so resume the content.
164188 contentPlayer. play ( )
165189 }
190+ // [END pause_resume_requests]
166191
167192 // MARK: - deinit
168193
0 commit comments