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
追加したらこのような形になります。
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パッケージを手動で復元します
ソリューションに追加した各プロジェクトファイルをメモ帳で開き、パスやバージョンをソリューションに合わせた形に変更します。
以下のページで復元方法の詳細をご紹介しておりますので、参考にしてください。
https://itblog.dynaspo.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にてダウンロード可能です。
https://file.blog.fc2.com/itblogdsi/download/Xamarinos.AdMob.FormsPlugin_Source.zip
ビルド済みのDLLのみは以下のURLになります。
https://file.blog.fc2.com/itblogdsi/download/Xamarinos.AdMob.FormsPlugin_build.zip
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
https://itblog.dynaspo.com/blog-entry-81.html
- 関連記事
-