Как использовать GADBannerViewDelegate для выполнения действий над 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 является "невидимым", потому что в настоящее время нет загруженного объявления.

Экраны по запросу. Как видите, кнопка, то есть subView из GADBannerView отображается перед показом самого объявления.

1 ответ

Решение

Я закомментировал много логики в этом примере. Единственное, что я не упомянул, это то, что вам нужно будет создать два идентификатора рекламного блока. Один для вашего GADBannerView и один для вашего GADInterstitial на AdMob.com.

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 для этого идентификатора рекламного блока. Промежуточные видеообъявления AdMob отключают кнопку закрытия на 5 секунд, что-то вроде кнопки пропуска на YouTube, и мгновенно обострит ваших пользователей. Если вы редко показываете GADInterstitial тогда я бы оставил видео рекламу включенной.

введите описание изображения здесь

Другие вопросы по тегам