상세 컨텐츠

본문 제목

Xamarin.Forms 자마린에서 애드몹 Admob 사용하기 *(Android)

Xamarin

by 경밤 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();

 

반응형

관련글 더보기