Определите, когда Google Banner Ad загружается в SwiftUI - PullRequest
1 голос
/ 05 апреля 2020

Это закодировано в Swift

Я успешно добавил рекламный баннер Google на страницу настроек в своем приложении. Я реализовал это ниже:

import Foundation
import SwiftUI
import GoogleMobileAds

struct AdView : UIViewRepresentable
{
    @Binding var AdLoaded : Bool

    func makeUIView(context: UIViewRepresentableContext<AdView>) -> GADBannerView
    {
        let banner = GADBannerView(adSize: kGADAdSizeBanner)
        banner.adUnitID = "realAdId"
        banner.rootViewController = UIApplication.shared.windows.first?.rootViewController
        banner.load(GADRequest())
        return banner
    }

    func updateUIView(_ uiView: GADBannerView, context: UIViewRepresentableContext<AdView>){}

    public func adViewDidReceiveAd(_ bannerView: GADBannerView)
    {
        AdLoaded = true
        if (DEBUG_ADS ) { print("Banner Ad Did Find Ad!") }
    }

    public func adView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: GADRequestError)
    {
        AdLoaded = false
        if (DEBUG_ADS ) { print(error) }
    }
}

Я знаю, что, поскольку у меня нет GADBannerViewDelegate в этой структуре, у меня нет доступа к функциям, которые я реализовал (adViewDidReceiveAd и adView...didFailToReceiveAdWithError). Они никогда не вызываются как есть.

Я много возился, но не могу найти правильный способ реализации этих функций делегата.

Моя предполагаемая функциональность заключается в реализации этого AdView в моих настройках. страница как таковая:

if ( someBindingVariable??? )
{
    AdView(AdLoaded: self.$AdLoaded)
}

В настоящее время она работает так, что для AdView остается место до его загрузки. Как только реклама загружена, пространство заполняется рекламой. Я хочу, чтобы пространство добавлялось только после загрузки объявления.

Спасибо за помощь, и дайте мне знать, если мне что-то не понятно!

1 Ответ

0 голосов
/ 06 апреля 2020

Из комментария @Asperi я реализовал координатор с моим AdView, и он сработал!

См. Ниже:

import Foundation
import SwiftUI
import GoogleMobileAds

struct AdView : UIViewRepresentable
{
    @Binding public var AdLoaded : Bool
    public var bannerId : String

    func makeCoordinator() -> Coordinator
    {
        Coordinator(self)
    }

    func makeUIView(context: UIViewRepresentableContext<AdView>) -> GADBannerView
    {
        let banner = GADBannerView(adSize: kGADAdSizeBanner)
        banner.adUnitID = bannerId
        banner.rootViewController = UIApplication.shared.windows.first?.rootViewController
        banner.load(GADRequest())
        banner.delegate = context.coordinator
        return banner
    }

    func updateUIView(_ uiView: GADBannerView, context: UIViewRepresentableContext<AdView>){}

    class Coordinator: NSObject, GADBannerViewDelegate
    {
        var parent: AdView

        init(_ parent: AdView)
        {
            self.parent = parent
        }

        func adViewDidReceiveAd(_ bannerView: GADBannerView)
        {
            parent.AdLoaded = true
            if ( DEBUG_ADS ) { print("Ad View Did Receive Ad For ID: \(parent.bannerId)")}
        }

        func adView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: GADRequestError)
        {
            parent.AdLoaded = false
            if ( DEBUG_ADS ) { print("Ad View Failed To Receive Ad For ID: \(parent.bannerId)")}
        }
    }
}
...