-
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();
끝
반응형'Xamarin' 카테고리의 다른 글
Xamarin.Forms 자마린의 기초(4) - APK 만들기 (PlayConsole에 업로드 가능함) (0) 2021.02.12 Xamarin.Forms 자마린의 기초(3) - 네이티브 기능 사용 - 진동 기능 사용 (0) 2021.02.12 Xamarin.Forms 자마린의 기초(2) - 아이콘 변경 (0) 2021.02.12 Xamarin.Forms 자마린의 기초(1) - 내부 이미지 사용 (0) 2021.02.12