記事一覧

Xamarinos.AdMob.FormsPlugin の不具合を修正する。 | Xamarin.Forms


Xamarin.iOS アプリに広告を表示させようと AdMob を簡単に実装できる NuGet パッケージである Xamarinos.AdMob.FormsPlugin を利用してきましたが、iOSで2度目のアプリ起動以降、広告が表示されないことが分かりました。しかしながら、Androidアプリでは通常通り表示ができています。
実際、Visual Studio のコンソール出力に、以下のように表示れています。

<Google> You must set the rootViewController property of <GADBannerView: 16進数; frame = (0 0; 320 50); clipsToBounds = YES; layer = <CALayer: 16進数>> before loading a request.


この原因を調べていくと、なんと不具合があることが判明しましたので解説していきたいと思います。



前提条件
・Windows10
・Visual Studio 2015 Community Update3
・Xamarin 4.2.0.719 (NuGet Xamarin.Forms 2.3.2.127)
・macOS Sierra 10.12.1 / Xcode8.1 / Xamarin.iOS 10.2.0.4


参考サイト
https://stackoverflow.com/questions/40391604/xamarin-forms-and-firebase-admob-for-ios



1.NuGetパッケージを削除します。

まず、NuGetパッケージのXamarinos.AdMob.FormsPluginを削除します。



2.ソースをダウンロードし、プロジェクトに追加します。

以下のURLからソースをダウンロードし、既存プロジェクトとして追加します。
https://github.com/LosXamarinos/Xamarinos.AdMob.FormsPlugin

追加したらこのような形になります。
 XamarinosAdMobFormsPlugin_01.png



3.参照設定を追加します。

PCLに Xamarinos.AdMob.Forms.FormsPlugin.Abstractions を追加
Androidに Xamarinos.AdMob.Forms.FormsPlugin.Abstractions を追加
Androidに Xamarinos.AdMob.Forms.FormsPlugin.Android を追加
iOSに Xamarinos.AdMob.Forms.FormsPlugin.Abstractions を追加
iOSに Xamarinos.AdMob.Forms.FormsPlugin.iOS を追加



4.NuGetパッケージを手動で復元します

ソリューションに追加した各プロジェクトファイルをメモ帳で開き、パスやバージョンをソリューションに合わせた形に変更します。
以下のページで復元方法の詳細をご紹介しておりますので、参考にしてください。
http://itblogdsi.blog.fc2.com/blog-entry-71.html



5.ソースを修正します。

Xamarinos.AdMob.Forms.FormsPlugin.iOS の AdBannerRenderer.cs を修正します。

public class AdBannerRenderer : ViewRenderer
{
    public static void Init()
    {
        var init = true;
    }

    public AdBannerRenderer()
    {

    }

    UIViewController viewCtrl = null; //追加します。
    BannerView adView;
    bool viewOnScreen = false;

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.View> e)
    {
        base.OnElementChanged(e);
        if (Control == null)
        {
//このforeachブロックを追加します。
            foreach (UIWindow v in UIApplication.SharedApplication.Windows)
            {
                if (v.RootViewController != null)
                {
                    viewCtrl = v.RootViewController;
break;
                }
            }
//またはこれでも取得可能の場合があります。
if (viewCtrl == null)
{
viewCtrl = UIApplication.SharedApplication.KeyWindow.RootViewController;
}

            var adsbanner = (AdBanner)Element;
            adView = new BannerView(size: AdSizeCons.Banner, origin: new CGPoint(0, 0))
            {
                AdUnitID = adsbanner.AdID,
                RootViewController = viewCtrl   //UIApplication.SharedApplication.Windows[0].RootViewController
        //ループして取得したRootViewControllerに変更します。
            };
・・・


アプリの構成や仕様によりUIApplication.SharedApplication.Windows[0]がNULLになることがあるようです。よってUIApplication.SharedApplication.Windows[0].RootViewController で設定せずに、ループしてNULLでないUIApplication.SharedApplication.Windowsを取得し、そのRootViewControllerを設定する必要がありました。


今回修正しましたソースは以下のURLにてダウンロード可能です。
http://file.blog.fc2.com/itblogdsi/download/Xamarinos.AdMob.FormsPlugin_Source.zip

ビルド済みのDLLのみは以下のURLになります。
http://file.blog.fc2.com/itblogdsi/download/Xamarinos.AdMob.FormsPlugin_build.zip




当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

アルバム

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。