Xamarin.iOS应用中未展示AdMob横幅广告

时间:2018-10-08 16:58:53

标签: c# ios xamarin xamarin.forms admob

我知道这个确切的问题已经问了数百遍了,但是每个用户都有一个不同的问题,而且我已经尝试了许多解决方案,但是一无所获。

好消息是横幅测试广告(如此处的LINK)可以正确显示…并且我已经在AdMob中注册了单元横幅(尚未连接FireBase)

这是我的代码,摘自互联网上的各种示例……对于每个人来说,这是一个非常标准的代码模式:

MainPage.xaml

// Settings Button
val settingsButton = gvrView.findViewById<ImageButton>(R.id.ui_settings_button)
settingsButton.visibility = View.GONE

// Back Button
val backButton = gvrView.findViewById<ImageButton>(R.id.ui_back_button)
backButton.visibility = View.GONE

// Alignment Marker
val alignmentMarker = gvrView.findViewById<RelativeLayout>(R.id.ui_alignment_marker)
alignmentMarker.visibility = View.GONE

AdView

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:TestAd"
         xmlns:localIOS="clr-namespace:TestAd.iOS"
         xmlns:vm="clr-namespace:TestAd.ViewModels"
         x:Class="TestAd.MainPage">
<ContentPage.BindingContext>
    <vm:AppViewModel/>
</ContentPage.BindingContext>
<StackLayout>
    <Grid …>
    </Grid>

    <localIOS:AdMobView AdUnitId="ca-app-pub-XXXXXXXXXXXXXXX/XXXXXXXXXX"/>
    <ListView ...>
    </ListView>
</StackLayout>

AdViewRenderer

public class AdMobView : View
{

    public static readonly BindableProperty AdUnitIdProperty = BindableProperty.Create(
               nameof(AdUnitId),
               typeof(string),
               typeof(AdMobView),
               string.Empty);

    public string AdUnitId
    {
        get => (string)GetValue(AdUnitIdProperty);
        set => SetValue(AdUnitIdProperty, value);
    }
}

AppDelegate.cs

[assembly: ExportRenderer(typeof(AdMobView), typeof(AdMobViewRenderer))]
namespace AppReminderIOS.iOS
{
public class AdMobViewRenderer : ViewRenderer<AdMobView, BannerView>
{
    protected override void OnElementChanged(ElementChangedEventArgs<AdMobView> e)
    {
        base.OnElementChanged(e);
        if (Control == null)
        {
            SetNativeControl(CreateBannerView());
        }
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == nameof(BannerView.AdUnitID))
            Control.AdUnitID = "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXX"; //Even tried: "Element.AdUnitId;"
    }

    private BannerView CreateBannerView()
    {
        var bannerView = new BannerView(AdSizeCons.SmartBannerPortrait)
        {
            AdUnitID = "ca-app-pub-XXXXXXXXXXXXXXXXXX/XXXXXXXXX", //Even tried: "Element.AdUnitId,"
            RootViewController = GetVisibleViewController()
        };

        bannerView.LoadRequest(GetRequest());

        Request GetRequest()
        {
            var request = Request.GetDefaultRequest();
            return request;
        }

        return bannerView;
    }

    private UIViewController GetVisibleViewController()
    {
        var windows = UIApplication.SharedApplication.Windows;
        foreach (var window in windows)
        {
            if (window.RootViewController != null)
            {
                return window.RootViewController;
            }
        }
        return null;
    }
}
}

这是主要代码……您怎么看? 我的AdMob帐户可能有问题吗? 测试广告可以正确显示,甚至在我旋转设备时也会刷新自我……所以我不知道该怎么想。

感谢您对我的帮助。

1 个答案:

答案 0 :(得分:0)

如果您最近(在24小时内)创建了AD单元ID,则可能需要一些时间和多个AD请求来建立AD资源。因此,您可能不会立即看到实际的演示文稿。当您的应用程序多次请求时,您应该看到更加一致的结果。请注意,测试广告通过与实际广告相同的渠道运行。如果测试广告返回,则表明您的应用程序正在与网络正确通信。