1414// limitations under the License.
1515//
1616
17+ // [START player_import]
1718import AVFoundation
19+ // [END player_import]
20+ // [START ima_import]
1821import GoogleInteractiveMediaAds
1922
23+ // [END ima_import]
24+
25+ // [START player_variables]
2026class PlayerContainerViewController : UIViewController , IMAAdsLoaderDelegate , IMAAdsManagerDelegate {
2127 static let contentURL = URL (
2228 string: " https://storage.googleapis.com/gvabox/media/samples/stock.mp4 " ) !
2329
30+ private var contentPlayer = AVPlayer ( url: PlayerContainerViewController . contentURL)
31+
32+ private lazy var playerLayer : AVPlayerLayer = {
33+ AVPlayerLayer ( player: contentPlayer)
34+ } ( )
35+ // [END player_variables]
36+
37+ // [START ima_variables]
2438 static let adTagURLString =
2539 " https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/ "
2640 + " single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90& "
2741 + " gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&correlator= "
2842
2943 private let adsLoader = IMAAdsLoader ( )
3044 private var adsManager : IMAAdsManager ?
31- private var contentPlayer = AVPlayer ( url: PlayerContainerViewController . contentURL)
3245
46+ private lazy var contentPlayhead : IMAAVPlayerContentPlayhead = {
47+ IMAAVPlayerContentPlayhead ( avPlayer: contentPlayer)
48+ } ( )
49+ // [END ima_variables]
50+
51+ // [START player_setup]
3352 private lazy var videoView : UIView = {
3453 let videoView = UIView ( )
3554 videoView. translatesAutoresizingMaskIntoConstraints = false
@@ -45,14 +64,6 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
4564 return videoView
4665 } ( )
4766
48- private lazy var contentPlayhead : IMAAVPlayerContentPlayhead = {
49- IMAAVPlayerContentPlayhead ( avPlayer: contentPlayer)
50- } ( )
51-
52- private lazy var playerLayer : AVPlayerLayer = {
53- AVPlayerLayer ( player: contentPlayer)
54- } ( )
55-
5667 // MARK: - View controller lifecycle methods
5768
5869 override func viewDidLoad( ) {
@@ -61,11 +72,13 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
6172 videoView. layer. addSublayer ( playerLayer)
6273 adsLoader. delegate = self
6374
75+ // [START set_content_observer]
6476 NotificationCenter . default. addObserver (
6577 self ,
6678 selector: #selector( contentDidFinishPlaying ( _: ) ) ,
6779 name: . AVPlayerItemDidPlayToEndTime,
6880 object: contentPlayer. currentItem)
81+ // [END set_content_observer]
6982 }
7083
7184 override func viewDidAppear( _ animated: Bool ) {
@@ -88,9 +101,11 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
88101 func playButtonPressed( ) {
89102 requestAds ( )
90103 }
104+ // [END player_setup]
91105
92106 // MARK: - IMA integration methods
93107
108+ // [START request_ads]
94109 private func requestAds( ) {
95110 // Create ad display container for ad rendering.
96111 let adDisplayContainer = IMAAdDisplayContainer (
@@ -104,18 +119,22 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
104119
105120 adsLoader. requestAds ( with: request)
106121 }
122+ // [END request_ads]
107123
108124 // MARK: - Content player methods
109125
126+ // [START content_complete]
110127 @objc func contentDidFinishPlaying( _ notification: Notification ) {
111128 // Make sure we don't call contentComplete as a result of an ad completing.
112129 if notification. object as? AVPlayerItem == contentPlayer. currentItem {
113130 adsLoader. contentComplete ( )
114131 }
115132 }
133+ // [END content_complete]
116134
117135 // MARK: - IMAAdsLoaderDelegate
118136
137+ // [START ads_loader_delegate]
119138 func adsLoader( _ loader: IMAAdsLoader , adsLoadedWith adsLoadedData: IMAAdsLoadedData ) {
120139 // Grab the instance of the IMAAdsManager and set ourselves as the delegate.
121140 adsManager = adsLoadedData. adsManager
@@ -135,16 +154,20 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
135154 }
136155 contentPlayer. play ( )
137156 }
157+ // [END ads_loader_delegate]
138158
139159 // MARK: - IMAAdsManagerDelegate
140160
161+ // [START ads_manager_delegate]
141162 func adsManager( _ adsManager: IMAAdsManager , didReceive event: IMAAdEvent ) {
142163 // When the SDK notifies us the ads have been loaded, play them.
143164 if event. type == IMAAdEventType . LOADED {
144165 adsManager. start ( )
145166 }
146167 }
168+ // [END ads_manager_delegate]
147169
170+ // [START ads_manager_error]
148171 func adsManager( _ adsManager: IMAAdsManager , didReceive error: IMAAdError ) {
149172 // Something went wrong with the ads manager after ads were loaded.
150173 // Log the error and play the content.
@@ -153,7 +176,9 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
153176 }
154177 contentPlayer. play ( )
155178 }
179+ // [END ads_manager_error]
156180
181+ // [START pause_resume_requests]
157182 func adsManagerDidRequestContentPause( _ adsManager: IMAAdsManager ) {
158183 // The SDK is going to play ads, so pause the content.
159184 contentPlayer. pause ( )
@@ -163,6 +188,7 @@ class PlayerContainerViewController: UIViewController, IMAAdsLoaderDelegate, IMA
163188 // The SDK is done playing ads (at least for now), so resume the content.
164189 contentPlayer. play ( )
165190 }
191+ // [END pause_resume_requests]
166192
167193 // MARK: - deinit
168194
0 commit comments