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

# 背景

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

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

# 前提

Firebase, AdMob側の設定は済みの前提です。
AdMobだけ使うとしても`GoogleService-Info.plist`は必要なのでFirebaseの設定が必要です。

# 実装

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/ea6301a0-12c3-b590-9895-26bdcbe70dfb.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](https://qiita-image-store.s3.amazonaws.com/0/201603/105bcd44-8ea4-7c45-35db-a09184c9ca8e.png)

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

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

ライブラリ提供元の[Issue](　https://github.com/xamarin/GoogleApisForiOSComponents/issues/158)を眺めてると解決方法分かりました


![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/f5a85b86-14a6-4530-94ef-2ae85e5a2b39.png)

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

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

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

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