如何使用 GADBannerViewDelegate 对 adViewDidReceiveAd 执行操作

How to use GADBannerViewDelegate to perform action on adViewDidReceiveAd

我有一个横幅视图并且想要一个自定义关闭按钮。我的问题是在加载和显示广告之前显示了按钮。

class RootVC: UIViewController, GADBannerViewDelegate {

    var googleAdBanner: GADBannerView!
    var googleBannerCloseBtn: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        googleAdBanner = GADBannerView(frame:CGRectMake(0,0,100,100))
        googleAdBanner.center = CGPointMake(self.view.bounds.size.width  / 2, self.view.bounds.size.height / 2)
        googleAdBanner.adUnitID = "xx"
        googleAdBanner.rootViewController = self
        googleAdBanner.loadRequest(GADRequest())
        adViewWillPresentScreen(googleAdBanner)
        googleAdBanner.delegate = self
        self.view.addSubview(googleAdBanner)
    }

    func adViewWillPresentScreen(bannerView: GADBannerView!) {
        googleBannerCloseBtn = UIButton(frame: CGRectMake( 5 , 5, 25, 25))
        googleBannerCloseBtn.backgroundColor = UIColor.clearColor()
        googleBannerCloseBtn.setImage(UIImage(named: "closeBtn"), forState: .Normal)
        googleBannerCloseBtn.setTitle("Click Me", forState: UIControlState.Normal)
        googleBannerCloseBtn.addTarget(self, action: #selector(RootVC.buttonAction(_:)), forControlEvents: UIControlEvents.TouchUpInside)
        googleBannerCloseBtn.tag = 1
        googleAdBanner.addSubview(googleBannerCloseBtn)
    }

如何仅在 GADBannerView 已加载广告并显示时显示按钮?

adViewDidReceiveAd 相同的行为。该按钮可见,即使 GADBannerView 是 "invisible",因为当前没有加载广告。

按要求进行屏幕显示。如您所见,GADBannerView 中的 subView 按钮在广告本身显示之前显示。

我已经注释掉了这个例子中的很多逻辑。我唯一没有提到的是您需要创建两个广告单元 ID。一份给你的 GADBannerView,一份给你 AdMob.com 上的 GADInterstitial

import UIKit
import GoogleMobileAds // Import AdMob

class ViewController: UIViewController, GADBannerViewDelegate, GADInterstitialDelegate { // Include our delegates

    // Create our ads
    var banner = GADBannerView(adSize: kGADAdSizeBanner) // kGADAdSizeBanner is a default banner size
    var interstitial = GADInterstitial(adUnitID: "YourInterstitialAdUnitID")

    override func viewDidLoad() {
        super.viewDidLoad()
        // View has loaded so lets setup our ads initially
        setupAds()
    }


    // MARK: - Setup Ads
    func setupAds() {
        // Setup our banner ad
        banner.adUnitID = "YourBannerAdUnitID"
        banner.rootViewController = self
        banner.delegate = self
        // Hide our banner initially until it loads an ad
        // Not doing this is why your close button was visible
        // GADBannerView's with no ad are essentially "clear", not hidden
        banner.alpha = 0.0
        banner.loadRequest(GADRequest())
        // Position banner on bottom of view
        banner.frame = CGRect(x: 0.0,
                              y: view.frame.height - banner.frame.height,
                              width: view.frame.width,
                              height: banner.frame.height)
        // Create your button here and add it as a subview to banner
        // banner.addSubview(closeButton)
        view.addSubview(banner)

        // Setup our interstitial ad initially
        interstitial.delegate = self
        interstitial.loadRequest(GADRequest())
    }


    // MARK: - Load Interstitial Ad
    func loadFullScreenAd() {
        // GADInterstitial's are single use. You have to create a new GADInterstitial for each presentation
        // So, if you'd like to show more than one GADInterstitial in your apps session we need this
        // This func will be used to create a new GADInterstitial after one has been displayed and dismissed
        interstitial = GADInterstitial(adUnitID: "YourInterstitialAdUnitID")
        interstitial.delegate = self
        interstitial.loadRequest(GADRequest())
    }


    // MARK: - Show Interstitial Ad
    func showFullScreenAd() {
        // Call this function when you want to present the interstitial ad
        // ie. game over, transition to another vc, etc...
        // Make sure you give atleast a few seconds for this ad to load before atempting to present it
        // For example, don't try to present this ad in viewDidAppear

        // Check if the interstitial ad is loaded before trying to present it
        if interstitial.isReady {
            interstitial.presentFromRootViewController(self)
        }
    }


    // MARK: - Close Button Action
    func closeButtonAction() {
        // This is where we will handle your close button that you've added to your GADBannerView
        // You can handle this two ways and it depends on what you'd like to do
        // If you don't want to show the banner ad again during the entire app session you would hide the banner
        // This way even if we change the alpha values in our delegate methods the banner will remain hidden
        banner.hidden = true

        // Another way you can handle the close button would be to hide the banner until another banner ad is loaded
        // I believe the refresh rate for banner ads is 45-60 seconds. You can customize the refresh time on AdMob.com
        // So, this way if the user tapped the close button the banner would fade out
        // But, when another banner ad is loaded the banner would fade back in because of the code in our adViewDidReceiveAd delegate method
        UIView.animateWithDuration(0.2) {
            self.banner.alpha = 0.0
        }

        /////* Choose which way you'd like to handle the close button and remove the code for the other */////
    }


    // MARK: - GADBannerView Delegate Methods
    func adViewDidReceiveAd(bannerView: GADBannerView!) {
        print("adViewDidReceiveAd")
        // We received an ad so lets show it
        // You could even fade in the banner if you'd like
        UIView.animateWithDuration(0.2) { 
            self.banner.alpha = 1.0
        }
    }

    func adView(bannerView: GADBannerView!, didFailToReceiveAdWithError error: GADRequestError!) {
        print("banner didFailToReceiveAdWithError: \(error)")
        // We received an error when trying to load our GADBannerView
        // Lets hide it because we don't have an ad
        // You could also fade this out if you'd like
        UIView.animateWithDuration(0.2) {
            self.banner.alpha = 0.0
        }
    }


    // MARK: - GADInterstitial Delegate Methods
    func interstitialDidReceiveAd(ad: GADInterstitial!) {
        print("interstitialDidReceiveAd")
    }

    func interstitialWillPresentScreen(ad: GADInterstitial!) {
        print("interstitialWillPresentScreen")
        // If you needed to pause anything in your app this would be the place to do it
        // ie. sounds, game state, etc...
    }

    func interstitialDidDismissScreen(ad: GADInterstitial!) {
        print("interstitialDidDismissScreen")
        // The GADInterstitial has been shown and dismissed by the user
        // Lets load another one for the next time we want to show a GADInterstitial
        loadFullScreenAd()

        // If you paused anything in the interstitialWillPresentScreen delegate method this is where you would resume it
    }

    func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
        print("interstitial didFailToReceiveAdWithError: \(error)")
    }
}

此外,如果您计划在您的应用程序中经常展示 GADInterstitial,我建议您在 AdMob.com 上为该广告单元 ID 禁用视频广告。 AdMob 插页式视频广告禁用关闭按钮 5 秒,有点像 YouTube 上的跳过按钮,会立即激怒您的用户。如果您很少展示 GADInterstitial,那么我会启用视频广告。