以Xamarin形式立即显示Google Admob非页内广告

时间:2018-08-31 13:32:11

标签: c# xamarin xamarin.forms

我正在研究Xamarin表单项目,并且已经在所有三个平台上实施了非页内广告(Google admob不支持UWP)。广告运作正常,但显示时间延迟4到5秒。我想要的是结束延迟,以便他们可以立即显示。

PCL类。

public interface IAdmobInterstitial
{
    void Show(string adUnit);
}

机器人代码。

public class InterstitialAdListener : AdListener
{
    readonly InterstitialAd _ad;

    public InterstitialAdListener(InterstitialAd ad)
    {
        _ad = ad;
    }

    public override void OnAdLoaded()
    {
        base.OnAdLoaded();

        if (_ad.IsLoaded)
            _ad.Show();
    }
}

public class AdmobInterstitial : Controls.IAdmobInterstitial
{
    InterstitialAd _ad;

    public void Show(string adUnit)
    {
        var context = Android.App.Application.Context;
        _ad = new InterstitialAd(context);
        _ad.AdUnitId = adUnit;

        var intlistener = new InterstitialAdListener(_ad);
        intlistener.OnAdLoaded();
        _ad.AdListener = intlistener;

        var requestbuilder = new AdRequest.Builder().AddTestDevice("302E90D530B2193F59FDD7F22A11B45A");
        _ad.LoadAd(requestbuilder.Build());
    }
}

iOS代码。

public class AdmobInterstitial : IAdmobInterstitial
{
    Interstitial _adInterstitial;

    public void Show(string adUnit)
    {
        _adInterstitial = new Interstitial(adUnit);
        var request = Request.GetDefaultRequest();
        _adInterstitial.AdReceived += (sender, args) =>
        {
            if (_adInterstitial.IsReady)
            {
                var window = UIApplication.SharedApplication.KeyWindow;
                var vc = window.RootViewController;
                while (vc.PresentedViewController != null)
                {
                    vc = vc.PresentedViewController;
                }
                _adInterstitial.PresentFromRootViewController(vc);
            }
        };
        _adInterstitial.LoadRequest(request);

    }
}

在PCL页面上调用插页式广告。

DependencyService.Get<IAdmobInterstitial>().Show("(id will come here)");
Navigation.PushAsync(new Page());

广告展示完美,但有延迟。我想先显示广告,然后再显示页面。

1 个答案:

答案 0 :(得分:0)

所以我刚刚解决了这个问题。 这是代码。

PCL类别。在界面中添加其他功能。

public interface IAdmobInterstitial
{
    void Show(string adUnit);

    void Give();
}

机器人代码。将_ad.Show()放入新函数中。

public class InterstitialAdListener : AdListener
{
    readonly InterstitialAd _ad;

    public InterstitialAdListener(InterstitialAd ad)
    {
        _ad = ad;
    }

    public override void OnAdLoaded()
    {
        base.OnAdLoaded();

        //if (_ad.IsLoaded)
        //    _ad.Show();
    }
}

public class AdmobInterstitial : Controls.IAdmobInterstitial
{
    InterstitialAd _ad;

    public void Show(string adUnit)
    {
        var context = Android.App.Application.Context;
        _ad = new InterstitialAd(context);
        _ad.AdUnitId = adUnit;

        var intlistener = new InterstitialAdListener(_ad);
        intlistener.OnAdLoaded();
        _ad.AdListener = intlistener;

        var requestbuilder = new AdRequest.Builder().AddTestDevice("302E90D530B2193F59FDD7F22A11B45A");
        _ad.LoadAd(requestbuilder.Build());
    }

    public void Give()
    {
        if (_ad.IsLoaded)
            _ad.Show();
    }
}

现在,在PCL的MainPage构造函数中调用函数Show(),并在按下下一页按钮时调用函数Give()。

public MainPage()
    {
        InitializeComponent();

        DependencyService.Get<IAdmobInterstitial>().Show("ca-app-pub-3940256099942544/1033173712");
    }

private void button_Clicked(object sender, EventArgs e)
    {
        DependencyService.Get<IAdmobInterstitial>().Give();
        Navigation.PushAsync(new Percentage());
    }

这仅适用于Android。 iOS也是如此。

我希望它可以帮助其他程序员。 :)