2021. 2. 10. 12:09ㆍXamarin
개요
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 |