ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Xamarin.Forms 자마린에서 애드몹 Admob 사용하기 *(Android)
    Xamarin 2021. 2. 10. 12:09
    반응형

    개요

    Xamarin Forms에서 애드몹을 사용하기 위해서, 또 각기 다른 애드몹 광고 단위에 대하여 다른 코드를 작성해야한다.

    Xamarin Forms 솔루션을 만들면 하위 프로젝트에 공용 프로젝트, Android용이 나온다.

    이때, 우리는 AdMob을 사용하기 위해서 Xamarin.GooglePlayService.Ads를 각각의 IOS, Android 프로젝트에 다운로드해야한다.

    그러고 난 후, 배너광고(Banner)를 위한 컨트롤과, 전면광고(InInterstitial)를 위한 Android용 코드를 짜겠다.

    주의

    간혹가다 Android.Gms.Ads를 찾을수 없다거나, System, Xamarin.Essential 등, 다른 모든 것들을 찾을 수 없다고 하는 경우가 있다. 이때 솔루션 코드 정리를 사용하거나, Bin, Obj 폴더를 다 삭제한후, 컴퓨터를 껏다 키거나 Visual Studio를 껏다가 키는 것을 반복하다 보면 잘 작동된다.

    간혹, AndroidX.Legacy 등의 NuGet 패키지를 설치하라 하는데, Xamarin.GooglePlayService.Ads 만 있어도 잘 작동한다. 심지어 그런 메세지는 어느순간 사라진다.

    설치

    Android 프로젝트의 NuGet 패키지 관리를 열고, Xamarin.GooglePlayService.Ads를 검색하여 71.1720.4 버전을 설치한다. -대부분 새 프로젝트를 만들면 Essential과 Forms의 버전이 낮다는 것을 알 수 있다. 그러므로 낮춰서 다운로드한다-

    설정

    Properties 아래 AndroidManifest.xml을 열어, Application 태그 안에 아래의 태그를 넣는다.

    <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="앱 ID" />
    <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />

    MainActivity.cs

    Android 프로젝트 아래 MainActivity.cs를 열고, OnCreate 메소드 안에 아래의 코드를 추가한다.

    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;
    
    base.OnCreate(savedInstanceState);
                
    MobileAds.Initialize(ApplicationContext, "앱 ID");
    
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());

    배너 광고 구현

    Android 프로젝트에 AdMobViewRenderer.cs를 만들고, 공용 프로젝트에 AdMobView.cs를 만들자.

    AdMobViewRenderer.cs

    [assembly: ExportRenderer(typeof(AdMobView), typeof(AdMobViewRenderer))]
    namespace Project.Droid
    {
    	public class AdMobViewRenderer : ViewRenderer<AdMobView, AdView>
    	{
    		public AdMobViewRenderer(Context context) : base(context) { }
    
    		protected override void OnElementChanged(ElementChangedEventArgs<AdMobView> e)
    		{
    			base.OnElementChanged(e);
    
    			if (e.NewElement != null && Control == null)
    			{
    				SetNativeControl(CreateAdView());
    			}
    		}
    
    		protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    		{
    			base.OnElementPropertyChanged(sender, e);
    
    			if (e.PropertyName == nameof(AdView.AdUnitId))
    				Control.AdUnitId = Element.AdUnitId;
    		}
    
    		private AdView CreateAdView()
    		{
    			var adView = new AdView(Context)
    			{
    				AdSize = AdSize.SmartBanner,
    				AdUnitId = Element.AdUnitId
    			};
    
    			adView.LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent);
    
    			adView.LoadAd(new AdRequest
    							.Builder()
    							.Build());
    
    			return adView;
    		}
    
    	}
    }

    AdMobView.cs

    namespace Project
    {
    	public class AdMobView:View
    	{
    		public static readonly BindableProperty AdUnitIdProperty = BindableProperty.Create(
    					   nameof(AdUnitId),
    					   typeof(string),
    					   typeof(AdMobView),
    					   string.Empty);
    
    		public string AdUnitId
    		{
    			get => (string)GetValue(AdUnitIdProperty);
    			set => SetValue(AdUnitIdProperty, value);
    		}
    	}
    }
    

    광고넣기를 희망하는 Page의 구조를 아래와 같이 바꿔주자.

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:d="http://xamarin.com/schemas/2014/forms/design"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 mc:Ignorable="d"
                 xmlns:local ="clr-namespace:프로젝트 이름"
                 x:Class="프로젝트이름.페이지이름">
        <ContentPage.Content>
            <Grid RowSpacing="0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <StackLayout Grid.Row="0">
                <!--이곳이 광고 영역을 제외한 본문-->
                </StackLayout>
                <Grid Grid.Row="1">
                    <local:AdMobView AdUnitId="광고단위 ID"/>
                </Grid>
            </Grid>
        </ContentPage.Content>
    </ContentPage>

    전면 광고 구현

    Android 프로젝트에 AdInterstitialRenderer.cs를 추가한다.

    Using namespaces 부분을 보아야한다. 같은 함수라도 다른 네임스페이스끼리라서 혼동하는 경우가 있다.

    using Android.Gms.Ads;
    using HeVibrates.Droid;
    using Xamarin.Forms;
    
    [assembly: Dependency(typeof(AdInterstitialRenderer))]
    namespace Project.Droid
    {
        public class AdInterstitialRenderer:IAdInterstitial
        {
            InterstitialAd interstitialAd;
    
            public AdInterstitialRenderer()
            {
                interstitialAd = new InterstitialAd(Android.App.Application.Context);
                interstitialAd.AdUnitId = "전면광고 광고 단위 ID";
                LoadAd();
            }
    
            void LoadAd()
            {
                var requestbuilder = new AdRequest.Builder();
                interstitialAd.LoadAd(requestbuilder.Build());
            }
    
            public void ShowAd()
            {
                if (interstitialAd.IsLoaded)
                    interstitialAd.Show();
    
                LoadAd();
            }
        }
    }

    공용 프로젝트에 IAdInterstitial.cs 인터페이스를 추가한다.

    namespace HeVibrates
    {
        public interface IAdInterstitial
        {
            void ShowAd();
        }
    }

    원하는 페이지의 코드에 아래와 같이 사용가능하다. 가령 Clicked 이벤트아래에서 말이다.

    IAdInterstitial adInterstitial = DependencyService.Get<IAdInterstitial>();
    adInterstitial.ShowAd();

     

    반응형
Designed by Tistory.