Start Debugging
2018-04-08 Обновлено 2023-11-05 uwpxamarinxamarin-forms Edit on GitHub

Расширяем AdMob-renderer Xamarin Forms для показа Microsoft Ads в UWP

Узнайте, как расширить ваш AdMob-renderer Xamarin Forms, чтобы показывать Microsoft Ads в UWP с помощью Microsoft Advertising SDK.

До сих пор мы показывали рекламу только на Android и iOS через AdMob и наш AdMob-renderer. Google полностью прекратил поддержку Windows Phone и не стал работать с UWP, поэтому AdMob тут не подходит.

К счастью, Microsoft тоже занимается рекламой и теперь хорошо интегрировала всё в developer dashboard и Visual Studio, что делает довольно лёгким показ рекламы в приложении. Возьмём за основу наш существующий AdMob-код из статьи выше и расширим его так, чтобы на UWP использовать Microsoft Advertising SDK для показа рекламы.

Для начала зайдите в Windows developer dashboard, выберите своё приложение — Monetize — In-app ads и создайте новый banner unit.

Затем добавьте NuGet-пакет Microsoft.Advertising.XAML в ваш UWP-проект.

Затем щёлкните правой кнопкой по References — Add references, перейдите в Universal Windows — Extensions, поставьте галочку “Microsoft Advertising SDK for XAML” и нажмите OK. Замечание: возможно, после этих двух шагов придётся перезапустить Visual Studio, чтобы он подхватил все изменения (например, если он не зарегистрирует namespaces для следующего фрагмента кода).

С настройкой проекта закончили, теперь время для renderer. Пойдём пошагово, но если вам нужен только код - он целиком в конце поста.

Первый шаг - создать AdControl. Для этого нужны application ID и AdUnitId из dev center (заполните их в коде ниже). Также я добавил несколько test ID, которые Microsoft предоставляет в документации, чтобы можно было проверить нашу реализацию.


var ad = new Microsoft.Advertising.WinRT.UI.AdControl
{
#if !DEBUG
    ApplicationId = "",
    AdUnitId = "",
#endif

#if DEBUG
    ApplicationId = "3f83fe91-d6be-434d-a0ae-7351c5a997f1",
    AdUnitId = "test"
#endif
};

Далее нам нужно определить доступную ширину, чтобы максимально использовать экран. У Microsoft есть 4 размера горизонтальных баннеров - 300, 320, 640 и 728 пикселей в ширину. Нужно выбрать подходящий для нашего сценария.

Это зависит от трёх вещей:

Узнать ширину окна несложно. Если ваш app использует MasterDetail в качестве root, то на десктопах боковое меню всегда отображается (то есть не скрывается) и занимает место в доступной ширине. В Xamarin Forms ширина sidebar равна 320px, поэтому вычтем её из доступной ширины. В renderer добавим две константы для управления этой настройкой.

private const bool _hasSideMenu = true;
private const int _sideBarWidth = 320;
var availableWidth = Window.Current.Bounds.Width;
if (_hasSideMenu)
{
var isDesktop = AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop";
if (isDesktop)
{
availableWidth = Window.Current.Bounds.Width - _sideBarWidth;
}
}

Затем выбираем ширину и высоту рекламы по доступной ширине и задаём height request элементу Xamarin Forms, чтобы для отображения хватало места на странице.

if (availableWidth >= 728)
{
    ad.Width = 728;
    ad.Height = 90;
}
else if (availableWidth >= 640)
{
    ad.Width = 640;
    ad.Height = 100;
}
else if (availableWidth >= 320)
{
    ad.Width = 320;
    ad.Height = 50;
}
else if (availableWidth >= 300)
{
    ad.Width = 300;
    ad.Height = 50;
}

e.NewElement.HeightRequest = ad.Height;

SetNativeControl(ad);

Вот и всё. Как обещали, ниже полный код.

using GazetaSporturilor.Controls;
using GazetaSporturilor.UWP.Renderers;
using Microsoft.Advertising.WinRT.UI;
using Windows.System.Profile;
using Windows.UI.Xaml;
using Xamarin.Forms.Platform.UWP;

[assembly: ExportRenderer(typeof(AdMobView), typeof(AdMobRenderer))]

namespace GazetaSporturilor.UWP.Renderers
{
    public class AdMobRenderer : ViewRenderer<AdMobView, AdControl>
    {
        private const bool _hasSideMenu = true;
        private const int _sideBarWidth = 320;

        public AdMobRenderer()
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<AdMobView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement == null)
            {
                return;
            }

            if (Control == null)
            {
                var ad = new Microsoft.Advertising.WinRT.UI.AdControl
                {
#if !DEBUG
                    ApplicationId = "",
                    AdUnitId = "",
#endif

#if DEBUG
                    ApplicationId = "3f83fe91-d6be-434d-a0ae-7351c5a997f1",
                    AdUnitId = "test"
#endif
                };

                var availableWidth = Window.Current.Bounds.Width;
                if (_hasSideMenu)
                {
                    var isDesktop = AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop";
                    if (isDesktop)
                    {
                        availableWidth = Window.Current.Bounds.Width - _sideBarWidth;
                    }
                }

                if (availableWidth >= 728)
                {
                    ad.Width = 728;
                    ad.Height = 90;
                }
                else if (availableWidth >= 640)
                {
                    ad.Width = 640;
                    ad.Height = 100;
                }
                else if (availableWidth >= 320)
                {
                    ad.Width = 320;
                    ad.Height = 50;
                }
                else if (availableWidth >= 300)
                {
                    ad.Width = 300;
                    ad.Height = 50;
                }

                e.NewElement.HeightRequest = ad.Height;

                SetNativeControl(ad);
            }
        }
    }
}

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад