Xamarin
Xamarin.iOS

Xamarin.iOSのAdMob対応 (インタースティシャル、リワード)


背景

Xamarin.Firebase.iOS.AdMobを使った場合のお話です

XamarinでAdMobのインタースティシャル、リワード広告について、日本語の記事がググってもパッと出なかったので載せることにしました。


前提

Firebase, AdMob側の設定は済みの前提です。

AdMobだけ使うとしてもGoogleService-Info.plistは必要なのでFirebaseの設定が必要です。


実装

Xamarin.Firebase.iOS.AdMobのnugetを追加

image.png


FinishedLaunchingで初期化

            MobileAds.Configure(アプリID);

                        // 共通部側から広告を呼び出したいのでDependencyServiceとして実装
DependencyService.Get<適当なクラス>().LoadAd();


広告を出す時に実行

何かしらのDependencyServiceとして実装

        Interstitial interstitial;

public void LoadAd()
{
                        // インタースティシャルの場合
interstitial = new Interstitial(広告ID);
interstitial.LoadRequest(Request.GetDefaultRequest());

                        // リワードの場合
RewardBasedVideoAd.SharedInstance.LoadRequest(Request.GetDefaultRequest(), 広告ID);
}

public void ShowAdInterstitial()
{
                        // インタースティシャルの場合
if (interstitial.IsReady)
{
interstitial.ScreenDismissed += (s, e) => LoadAd();
interstitial.PresentFromRootViewController(GetTopViewController());
}
}

public void ShowAdReward()
{
                        // リワードの場合はこちらを実行
if (RewardBasedVideoAd.SharedInstance.IsReady)
{
RewardBasedVideoAd.SharedInstance.Closed += (s, e) => LoadAd();
RewardBasedVideoAd.SharedInstance.UserRewarded += (object sender, RewardBasedVideoAdRewardEventArgs e) =>
{
_rewardReceive?.Invoke(e.Reward.Amount.Int32Value);
};
RewardBasedVideoAd.SharedInstance.PresentFromRootViewController(GetTopViewController());
}
else
{
// 万が一、広告が配信されていない場合救済処置
ShowToast("表示可能な広告がありませんでした");
_rewardReceive?.Invoke(5);
}
}

public void SetRewardCallback(Action<int> action)
{
_rewardReceive = action;
}

public static UIViewController GetTopViewController()
{
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
vc = vc.PresentedViewController;

if (vc is UINavigationController navController)
vc = navController.ViewControllers.Last();

return vc;
}


こんなエラーが起きたら

以前のプロジェクトから適当にコピペして、ビルドすると・・・

image.png

Native linking failedと出て、何かが足りずにリンクできない模様

あれやこれや試すも解決せず

ライブラリ提供元のIssueを眺めてると解決方法分かりました

image.png

これの最後の行のFirebase.Core.App.Configure()を書けばビルドが通るようになりました

実装が足りないと上手くリンカーが動かないんですね

#ちなみにプロジェクト設定のリンカーの動作は何を選んでもダメでした

#ちなみに2年前ぐらいにも「呼ばれることないけどこれを書けば上手くいくよ」的なものに遭遇しましたが、そういうものなんでしょうか