KeiStory

MAUI 에서 AdMob 처리하기 - .NET 8 기준

 
 
이전 포스팅에서 광고적용 코드를 알아보았는데 .NET6 기준이라 현재 사용하는데 문제가 있습니다
2024.05.09 - [코딩/.NET MAUI] - .NET MAUI AdMob 광고 적용하기 (전면, 배너, 보상)
 
.NET8 버전으로 알아보겠습니다.
 

Nuget 패키지 설치

먼저 아래 Nuget Package 를 설치합니다.

Plugin.MauiMTAdmob
Xamarin.Google.iOS.MobileAds

 

csproj 파일 편집

Plugin.MauiMTAdmob 패키지는 ios, android 만 지원하여 csproj 파일 편집이 필요합니다.

csproj 파일의 PropertyGroup 에서 TargetFrameworks 를 아래처럼 android, ios 만 두고 모두 삭제합니다.

<TargetFrameworks>net8.0-android;net8.0-ios</TargetFrameworks>


SupportedOSPlatformVersion 또한 android, ios  만 두고 모두 삭제합니다.

<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>

 

MauiProgram 에 코드 추가

MauiProgram.cs 에 .UseMauiMTAdmob() 을 추가합니다.

using Microsoft.Extensions.Logging;

using Plugin.MauiMTAdmob;

namespace AdmobTest
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .UseMauiMTAdmob() // 추가
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });

#if DEBUG
            builder.Logging.AddDebug();
#endif

            return builder.Build();
        }
    }
}

 

Admob 광고 ID 발급

먼저 AdMob 사이트로 가서 광고 ID 를 발급받아야합니다.

https://admob.google.com/

 

Google AdMob: 모바일 앱 수익 창출

인앱 광고를 사용하여 모바일 앱에서 더 많은 수익을 창출하고, 사용이 간편한 도구를 통해 유용한 분석 정보를 얻고 앱을 성장시켜 보세요.

admob.google.com

test 앱을 추가해 ios, android 별 광고 ID 를 추가해야합니다.

여기에서 ca-app-pub.... 항목을 사용하게됩니다.

 

프랫폼별 처리

Android 는 AndroidManifest.xml 에 APPLICATION_ID 에 Android 용 Admob 광고 ID 를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
	<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true">
		<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-2643538289217660~5183062697" />
	</application>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>

 
iOS 는 info.list 에 GADApplicationIdentifier 에 iOS 용 Admob 광고 ID 를 추가합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UIDeviceFamily</key>
	<array>
		<integer>1</integer>
		<integer>2</integer>
	</array>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>arm64</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>XSAppIconAssets</key>
	<string>Assets.xcassets/appicon.appiconset</string>
	<key>GADApplicationIdentifier</key>
	<string>ca-app-pub-2643538289217660~9889428618</string>
</dict>
</plist>

 

광고앱 ID 설정이 끝나면 CrossMauiMTAdmob.Current.Init 메서드를 호출해 줘야합니다.

호출하지 않으면 아래와 같은 에러 메세지가 발생됩니다.

System.Exception: 'MTAdmob not initialised. You need to initialise it using CrossMauiMTAdmob.Current.Init in your platform projects!'

 
Android 는 MainActivity.cs 에 아래처럼 처리합니다.

using Foundation;

using Plugin.MauiMTAdmob;

using UIKit;

namespace AdmobTest
{
    [Register("AppDelegate")]
    public class AppDelegate : MauiUIApplicationDelegate
    {
        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

        public AppDelegate()
        {
            // 추가
            CrossMauiMTAdmob.Current.Init();
        }

        // 추가
        public override void OnActivated(UIApplication application)
        {
            base.OnActivated(application);
            CrossMauiMTAdmob.Current.OnResume();
        }
    }
}

 
iOS 는 AppDelegate.cs 에 아래처럼 처리합니다.

using Foundation;

using Plugin.MauiMTAdmob;

using UIKit;

namespace AdmobTest
{
    [Register("AppDelegate")]
    public class AppDelegate : MauiUIApplicationDelegate
    {
        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

        public AppDelegate()
        {
            // 추가
            CrossMauiMTAdmob.Current.Init();
        }

        // 추가
        public override void OnActivated(UIApplication application)
        {
            base.OnActivated(application);
            CrossMauiMTAdmob.Current.OnResume();
        }
    }
}

 

광고표시하기

MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="AdmobTest.MainPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:admob="clr-namespace:Plugin.MauiMTAdmob.Controls;assembly=Plugin.MauiMTAdmob">
    <Grid>
        <StackLayout VerticalOptions="Start">
            <Button
                Margin="10"
                BorderColor="Blue"
                BorderWidth="1"
                Clicked="Button_Clicked"
                HeightRequest="50"
                Text="AdMob Interstitialid Test"
                TextColor="Black"
                VerticalOptions="Start" />
            <Button
                Margin="10"
                BorderColor="Blue"
                BorderWidth="1"
                Clicked="RewardButton_Clicked"
                HeightRequest="50"
                Text="AdMob Reward Test"
                TextColor="Black"
                VerticalOptions="Start" />
        </StackLayout>

        <StackLayout VerticalOptions="End">
            <Label
                HorizontalTextAlignment="Center"
                Text="AdMob Banner Test"
                TextColor="Black"
                VerticalTextAlignment="Center" />
            <admob:MTAdView
                x:Name="mtAdView"
                AdSize="Banner"
                BackgroundColor="Transparent" />
        </StackLayout>
    </Grid>
</ContentPage>

MainPage.xaml.cs

using Plugin.MauiMTAdmob;

namespace AdmobTest
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            /* Test ID

            Android
            https://developers.google.com/admob/android/test-ads?hl=ko
            앱 오프닝 광고	            ca-app-pub-3940256099942544/3419835294
            배너 광고	                ca-app-pub-3940256099942544/6300978111
            전면 광고	                ca-app-pub-3940256099942544/1033173712
            전면 동영상 광고	        ca-app-pub-3940256099942544/8691691433
            보상형 광고	                ca-app-pub-3940256099942544/5224354917
            보상형 전면 광고	        ca-app-pub-3940256099942544/5354046379
            네이티브 광고 고급형	    ca-app-pub-3940256099942544/2247696110
            네이티브 동영상 광고 고급형	ca-app-pub-3940256099942544/1044960115

            iOS
            https://developers.google.com/admob/ios/test-ads#demo_ad_units
            앱 오프닝 광고	            ca-app-pub-3940256099942544/5662855259
            배너 광고	                ca-app-pub-3940256099942544/2934735716
            전면 광고	                ca-app-pub-3940256099942544/4411468910
            전면 동영상 광고	        ca-app-pub-3940256099942544/5135589807
            보상형 광고	                ca-app-pub-3940256099942544/1712485313
            보상형 전면 광고	        ca-app-pub-3940256099942544/6978759866
            네이티브 광고 고급형	    ca-app-pub-3940256099942544/3986624511
            네이티브 동영상 광고 고급형	ca-app-pub-3940256099942544/2521693316
             */

            if (DeviceInfo.Platform.Equals(DevicePlatform.Android))
            {
                this.mtAdView.AdsId = "ca-app-pub-3940256099942544/6300978111";
            }
            else
            {
                this.mtAdView.AdsId = "ca-app-pub-3940256099942544/2934735716";
            }

            // 전면광고 Loaded 완료시 전면광고 표시
            CrossMauiMTAdmob.Current.OnInterstitialLoaded += (s, e) => CrossMauiMTAdmob.Current.ShowInterstitial();
            // 전면광고 Close 시 이벤트
            CrossMauiMTAdmob.Current.OnInterstitialClosed += (s, e) => DisplayAlert("AdMobTest", "Interstitial Close", "OK");

            // 보상광고 Loaded 완료시 보상광고 표시
            CrossMauiMTAdmob.Current.OnRewardedLoaded += (s, e) => CrossMauiMTAdmob.Current.ShowRewarded();
            // 보상광고 Click 시 이벤트
            CrossMauiMTAdmob.Current.OnRewardedClicked += (s, e) => DisplayAlert("AdMobTest", "RewardedClicked", "OK");
            // 보상광고 Close 시 이벤트
            CrossMauiMTAdmob.Current.OnRewardedClosed += (s, e) => DisplayAlert("AdMobTest", "RewardedClosed", "OK");
        }
        private void Button_Clicked(object sender, EventArgs e)
        {
            /* 전면 광고 표시 */

            // 이미 로드되어있는 확인
            bool isInterstitialLoaded = CrossMauiMTAdmob.Current.IsInterstitialLoaded();

            if (!isInterstitialLoaded)
            {
                if (DeviceInfo.Platform.Equals(DevicePlatform.Android))
                {
                    CrossMauiMTAdmob.Current.LoadInterstitial("ca-app-pub-3940256099942544/1033173712");
                }
                else
                {
                    CrossMauiMTAdmob.Current.LoadInterstitial("ca-app-pub-3940256099942544/4411468910");
                }
            }
        }

        private void RewardButton_Clicked(object sender, EventArgs e)
        {
            /* 보상 광고 표시 */

            // 이미 로드되어있는 확인
            bool IsRewardedLoaded = CrossMauiMTAdmob.Current.IsRewardedLoaded();

            if (!IsRewardedLoaded)
            {
                if (DeviceInfo.Platform.Equals(DevicePlatform.Android))
                {
                    CrossMauiMTAdmob.Current.LoadRewarded("ca-app-pub-3940256099942544/5224354917");
                }
                else
                {
                    CrossMauiMTAdmob.Current.LoadRewarded("ca-app-pub-3940256099942544/1712485313");
                }
            }
        }
    }

}


iOS 디버깅 시 아래 에러가 발생된다면

MT2301	The linker step 'Setup' failed during processing: This version of Microsoft.iOS requires the iOS 17.2 SDK (shipped with Xcode 15.1). Either upgrade Xcode to get the required header files or set the managed linker behaviour to Link Framework SDKs Only in your project's iOS Build Options > Linker Behavior (to try to avoid the new APIs).	AdmobTest (net8.0-ios)	C:\Program Files\dotnet\packs\Microsoft.iOS.Windows.Sdk\17.2.8053\tools\msbuild\iOS\Xamarin.iOS.Common.After.targets	364

프로젝트 속성에서 링커 동작을 '프레임워크 SDK만 링크' 로 바꿔줍니다.

 

결과

Android

Android 배너, 전면, 보상 광고

iOS

iOS 배너, 전면, 보상 광고


MtAdmob 은 라이센스를 구매하는 경우 더 많은 광고를 지원받을수 있습니다.

무료버전은 배너와 전면광고, 보상광고를 사용할 수 있습니다.

https://hightouchinnovation.com/MMTAdmob

 

MTAdmob plugin for MAUI - HighTouch Innovation

Banner Banner ads occupy a spot within an app's layout, usually at the top or bottom of the device screen. The plugin allows to quickly add a banner on your app. It also allows customisation to facilitate and speed up the development of your app Learn more

hightouchinnovation.com

 
소스
https://github.com/kei-soft/AdmobTest

 

GitHub - kei-soft/AdmobTest

Contribute to kei-soft/AdmobTest development by creating an account on GitHub.

github.com

 

참고
https://github.com/marcojak/MauiMTAdmob

 

GitHub - marcojak/MauiMTAdmob

Contribute to marcojak/MauiMTAdmob development by creating an account on GitHub.

github.com

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band