Xamarin
DFP

Xamarin.iOSでDFPの広告が表示できない -> できた!

10/26追記

やっとできました。
RendererのもととなるViewをWebViewを継承したものにして、その他を切り替えていくことで表示できました(実際のプロダクトコードではContentViewを使っていました)

おそらくこのことによりUserAgentなどが切り替わり、DFPのサーバ側からコンテンツが返ってくるようになったのではないかと推測しています。こんなのわかるか!!という思いでいっぱいですが、知見だけ残しておきます。


Xamarin.iOSでDFP(DoubleClick for Developer)のバナー広告を出そうとがんばってもう数週間。

BindingLibraryを作ったり、Web上のサンプルをあさってコードを書いてみるも動かない・・
ここで公開されているサンプルを元に実装しました
https://github.com/sharmapranav/Xamarin

有識者の方、何かヒントや気づきでもありましたらコメントいただけると非常に助かります。

やってみたこと

  • BannerViewはGADBannerViewではなくDFPBannerViewなどDFP用のものを使うようにした
  • DFP用はテスト広告(/6499/example/banner)も何も表示されない
  • もちろん用意した本物の広告も表示されない ※swiftやobjective-cのデモアプリでは表示されている。AndroidもOK
  • シミュレータと実機(Debug)いずれもダメ
  • ただし、Admobはテスト、本物いずれも表示される

エラー

Description:Error Domain=com.google.ads Code=1 "Request Error: No ad to show." UserInfo={NSLocalizedDescription=Request Error: No ad to show., NSLocalizedFailureReason=Request Error: No ad to show.}

書き換えたBanner部分のコード

using System;
using CoreGraphics;
using Google.MobileAds;
using Ads;
using Ads.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using System.Diagnostics;

[assembly: ExportRenderer(typeof(AdBanner), typeof(AdBanner_iOS))]
namespace Ads.iOS
{
    public class AdBanner_iOS : ViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<View> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement == null)
            {
                Google.MobileAds.DoubleClick.BannerView bannerView = null;

                switch ((Element as AdBanner).Size)
                {
                    case AdBanner.Sizes.Standardbanner:
                        bannerView = new Google.MobileAds.DoubleClick.BannerView(AdSizeCons.Banner, new CGPoint(0, 0));
                        break;
                    case AdBanner.Sizes.LargeBanner:
                        bannerView = new Google.MobileAds.DoubleClick.BannerView(AdSizeCons.LargeBanner, new CGPoint(0, 0));
                        break;
                    case AdBanner.Sizes.MediumRectangle:
                        bannerView = new Google.MobileAds.DoubleClick.BannerView(AdSizeCons.MediumRectangle, new CGPoint(0, 0));
                        break;
                    case AdBanner.Sizes.FullBanner:
                        bannerView = new Google.MobileAds.DoubleClick.BannerView(AdSizeCons.FullBanner, new CGPoint(0, 0));
                        break;
                    case AdBanner.Sizes.Leaderboard:
                        bannerView = new Google.MobileAds.DoubleClick.BannerView(AdSizeCons.Leaderboard, new CGPoint(0, 0));
                        break;
                    case AdBanner.Sizes.SmartBannerPortrait:
                        bannerView = new Google.MobileAds.DoubleClick.BannerView(AdSizeCons.SmartBannerPortrait, new CGPoint(0, 0));
                        break;
                    default:
                        bannerView = new Google.MobileAds.DoubleClick.BannerView(AdSizeCons.Banner, new CGPoint(0, 0));
                        break;
                }

                // TODO: change this id to your admob id
                //bannerView.AdUnitID = "ca-app-pub-3940256099942544/2934735716";
                bannerView.AdUnitID = "/6499/example/banner";

                foreach (UIWindow uiWindow in UIApplication.SharedApplication.Windows)
                {
                    if (uiWindow.RootViewController != null)
                    {
                        bannerView.RootViewController = uiWindow.RootViewController;
                    }
                }
                bannerView.ReceiveAdFailed += (sender, args) =>
                {
                    Debug.WriteLine($"DFPエラー発生。{Environment.NewLine}Description:{args.Error.Description}");
                };
                bannerView.AdReceived += (sender, args) =>
                {
                    AddSubview(bannerView);
                };

                var request = new Google.MobileAds.DoubleClick.Request();

                bannerView.LoadRequest(request);

                SetNativeControl(bannerView);
            }
        }
    }
}