Создавайте собственные события

Выберите платформу: Android (бета-версия)Новый Android iOS Unity

Пользовательские события позволяют издателям, использующим медиацию AdMob, добавлять каскадную медиацию для сторонней рекламной сети, которая не входит в число поддерживаемых рекламных сетей . В этом руководстве объясняется, как использовать существующее пользовательское событие, созданное для Android и iOS, в проекте Unity.

Предварительные требования

Прежде чем продолжить, выполните следующие действия:

  • Настройте Google Mobile Ads Unity Plugin . В вашем приложении Unity уже должен быть импортирован плагин Google Mobile Ads Unity.

  • Для Android и iOS уже созданы пользовательские адаптеры событий. Чтобы создать собственные адаптеры событий, обратитесь к нашим руководствам по созданию пользовательских событий для Android и iOS .

Определите пользовательское событие

Для того чтобы пользовательское событие участвовало в медиации, его необходимо определить в веб-интерфейсе AdMob. Добавьте пользовательское событие в группы медиации как для Android, так и для iOS.

На этом скриншоте показаны примеры пользовательских настроек событий:

Как заполнить параметры
Название класса (iOS)

Для iOS введите имя класса, реализующего пользовательское событие.

Если ваш класс реализован на Swift, вам необходимо добавить к имени класса префикс в виде имени его модуля приложения/фреймворка (например, appName.className ).

Имя целевого объекта необходимо указать, если в вашем проекте несколько целевых объектов или если имя проекта отличается от имени целевого объекта. Имя целевого объекта будет выглядеть так: appName_targetName.className . Кроме того, не забудьте заменить все небуквенно-цифровые символы, такие как дефисы, на подчеркивания.

Название класса (Android) Для Android убедитесь, что значение, указанное в поле " Class Name , является полным именем класса для Android (например, com.google.ads.mediation.sample.customevent.SampleCustomEvent ).
Этикетка Введите уникальное название для мероприятия.
Параметр Если вы хотите передать строковый аргумент в ваше пользовательское событие, например, идентификатор рекламного блока.

Импортировать пользовательские библиотеки событий

Для корректной работы пользовательских событий может потребоваться подключение дополнительных библиотек. Например, вам может понадобиться подключить следующие библиотеки:

  • Сторонний SDK для Android
  • Пользовательское событие стороннего разработчика Android
  • SDK для сторонних рекламных кампаний iOS
  • Пользовательское событие стороннего разработчика iOS

Типы библиотек

Существует несколько способов импортировать код Android или iOS в проект Unity, в том числе:

  • Импорт предварительно собранных артефактов Android или iOS с помощью менеджера внешних зависимостей для Unity.
  • Импорт плагинов AAR и библиотек Android.
  • Импорт исходных файлов Java и Kotlin
  • Импорт исходных файлов iOS и статических библиотек

В зависимости от способа упаковки используемых вами библиотек, вам может потребоваться разная стратегия импорта для каждой библиотеки. Каждый вариант более подробно рассматривается далее.

(Рекомендуется) Импортируйте предварительно собранные артефакты Android или iOS.

Импортируйте предварительно собранные артефакты из Maven или CocoaPods, используя External Dependency Manager for Unity . Этот плагин входит в состав плагина GoogleMobileAds.

Для импорта существующих артефактов создайте конфигурационный файл, определяющий параметры импорта. Имя файла и путь к нему должны соответствовать следующим требованиям:

  • Файл должен находиться в папке /Editor/ .
  • Имя файла должно заканчиваться на Dependencies.xml .

Например, чтобы импортировать адаптеры пользовательских событий для гипотетической рекламной сети AdPub , создайте файл:

Assets/AdPub/Editor/AdPubDependencies.xml

Далее определите зависимости в файле AdPubDependencies.xml . Правила настройки импорта можно найти в разделе «Начало работы с менеджером внешних зависимостей для Unity» . Следующий фрагмент кода включает SDK для Android и iOS, а также пользовательские библиотеки событий для гипотетической рекламной сети «AdPub».

Assets/AdPub/Editor/AdPubDependencies.xml

<dependencies>
  <androidPackages>
    <androidPackage spec="com.adpub.android:adpub-sdk:1.0.0" />
    <androidPackage spec="com.adpub.android:adpub-custom-event:1.0.0">
      <repositories>
        <repository>https://repo.maven.apache.org/maven2/</repository>
        <repository>https://dl.google.com/dl/android/maven2/</repository>
      </repositories>
    </androidPackage>
  </androidPackages>
  <iosPods>
    <iosPod name="AdPubSDK" version="1.0" />
    <iosPod name="AdPubCustomEvent" version="1.0">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>

Если ваш пользовательский артефакт события уже имеет зависимость от необходимого SDK рекламной сети, вам не нужно явно указывать зависимость от SDK: Пример

Менеджер внешних зависимостей автоматически отслеживает изменения конфигурации и разрешает зависимости. Вы также можете выполнить разрешение вручную с помощью следующей команды меню:

Assets > External Dependency Manager > Android Resolver > Force Resolve

Импорт плагинов AAR и библиотек Android.

Unity поддерживает импорт файлов *.aar , а также проектов библиотек Android. Если ваше пользовательское событие Android упаковано таким образом, см. разделы «Плагины AAR» и «Библиотеки Android» для получения инструкций по включению этих файлов в ваш проект Unity.

Импорт исходных файлов Java и Kotlin.

Начиная с Unity 2018.2 и выше, если ваш код пользовательских событий Android состоит из нескомпилированных файлов *.java или *.kt , вы можете использовать исходные файлы Java или Kotlin в качестве плагинов .

Импорт исходных файлов iOS и статических библиотек.

Unity поддерживает артефакты *.framework , исходные файлы *.h и *.m . Импорт артефактов и исходных файлов iOS описан в руководстве Unity для нативных плагинов .

Протестируйте пользовательские события с помощью инспектора рекламы.

Инспектор рекламы можно использовать для проверки корректности импорта пользовательских событий в ваше приложение. Инспектор рекламы может открываться с помощью жестов или программно с минимальным количеством кода.

(Необязательно) Вызов нативных методов сторонних SDK из скриптов C#.

SDK сторонних рекламных сетей могут предъявлять особые требования, которые предполагают прямой вызов методов Android или iOS. Процесс прямого вызова этих методов выглядит следующим образом:

  1. Определить общий интерфейс для клиентов платформы.
  2. Реализовать клиент по умолчанию для неподдерживаемых платформ.
  3. Реализуйте Android-клиент для вызова методов Android.
  4. Реализуйте iOS-клиент для вызова методов iOS.
  5. Реализуйте фабрику клиентов для условного переключения между клиентами iOS и Android.
  6. Определите API для доступа ко всем функциям SDK сторонних рекламных сетей.

В следующем разделе показано, как эти шаги реализованы для гипотетической рекламной сети под названием "AdPub" в API на C#, который может вызывать методы на Android и iOS:

Android

package com.adpub.android;

public class AdPubSdk
{
    public static void setHasUserConsent(boolean hasUserConsent);
}

iOS

@interface AdPubSdk : NSObject
+ (void)setHasUserConsent:(BOOL)hasUserConsent;
@end

Определить общий интерфейс для клиентов платформы.

Создайте интерфейс IAdPubClient с методом, представляющим базовый API для Android и iOS.

Assets/AdPub/Common/IAdPubClient.cs

namespace AdPub.Common
{
    public interface IAdPubClient
    {
        ///<summary>
        /// Sets a flag indicating if the app has user consent for advertisement.
        ///</summary>
        void SetHasUserConsent(bool hasUserConsent);
    }
}

Определите клиент по умолчанию для неподдерживаемых платформ.

Создайте класс DefaultClient , реализующий интерфейс IAdPubClient , который просто выводит в консоль имя метода. Используйте эту реализацию для редактора Unity и всех платформ, кроме Android и iOS.

Assets/AdPub/Common/DefaultClient.cs

namespace AdPub.Common
{
    public class DefaultClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
            Debug.Log("SetHasUserConsent was called.");
        }
    }
}

Разработать клиент для платформы iOS.

Создайте класс iOSAdPubClient , реализующий интерфейс IAdPubClient в iOS. Эта реализация использует InteropServices для вызова метода setHasUserConsent() в классе iOS AdPubSdk .

Assets/AdPub/Platforms/iOS/iOSAdPubClient.cs

// Wrap this class in a conditional operator to make sure it only runs on iOS.
#if UNITY_IOS

// Reference InteropServices to include the DLLImportAttribute type.
using System.Runtime.InteropServices;

using AdPub.Common;

namespace AdPub.Platforms.Android
{
    public class iOSAdPubClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
            GADUAdPubSetHasUserConsent(hasUserConsent);
        }

        [DllImport("__Internal")]
        internal static extern void GADUAdPubSetHasUserConsent(bool hasUserConsent);
    }
}
#endif

Далее реализуйте метод GADUAdPubSetHasUserConsent() , определенный выше. Создайте файл AdPubClientBridge.m с методом GADUAdPubSetHasUserConsent() C для обработки вызова метода из Unity и вызовите AdPubSDK .

AdPubClientBridge — это исходный файл для iOS, и его необходимо разместить в папке Plugins/iOS , как описано в руководстве Unity для нативных плагинов .

Assets/AdPub/Plugins/iOS/AdPubClientBridge.m

#import <AdPubSDK/AdPubSDK.h>

void GADUAdPubSetHasUserConsent(BOOL hasUserConsent) {
  [AdPubSDK setHasUserConsent:hasUserConsent];
}

Разработать клиент для платформы Android.

Создайте класс AndroidAdPubCient , реализующий интерфейс IAdPubClient в Android. Эта реализация использует вспомогательные классы Java для Android , вызывающие статический метод Android setHasUserConsent() .

Поскольку вспомогательные классы Java для Android доступны только во время выполнения Android, вы можете предотвратить ошибки компиляции, используя директиву компилятора UNITY_ANDROID для обертывания класса, как показано в фрагменте кода. В качестве альтернативы вы можете использовать определения сборок в Unity 2017.4 и более поздних версиях для решения этой проблемы.

Assets/AdPub/Platforms/Android/AndroidAdPubClient.cs

// Wrap this class in a conditional operator to make sure it only runs on Android.
#if UNITY_ANDROID

// Reference the UnityEngine namespace which contains the JNI Helper classes.
using UnityEngine;

using AdPub.Common;

namespace AdPub.Platforms.Android
{
    public class AndroidAdPubClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
             // Make a reference to the com.adpub.AdPubSDK.
            AndroidJavaClass adPubSdk = new AndroidJavaClass("com.adpub.AdPubSdk");

            // Call the native setHasUserConsent method of com.adpub.AdPubSDK.
            adPubSdk.CallStatic("setHasUserConsent", hasUserConsent);
        }
    }
}
#endif

Создайте фабричный метод для возврата правильной реализации клиента.

Теперь, когда у вас есть реализации клиента для каждой платформы, создайте класс AdPubClientFactory , который будет возвращать правильную реализацию интерфейса IAdPubClient в зависимости от платформы выполнения. Этот класс использует директивы компилятора для возврата правильного клиента IAdPubClient .

Assets/AdPub/Common/AdPubClientFactory.cs

namespace AdPub.Common
{
    public class AdPubClientFactory
    {
        // Return the correct platform client.
        public static IAdPubClient GetClient()
        {
#if   !UNITY_EDITOR && UNITY_ANDROID
            return new AdPub.Platforms.Android.AndroidAdPubClient();
#elif !UNITY_EDITOR && UNITY_IOS
            return new AdPub.Platforms.iOS.iOSAdPubClient();
#else
            // Returned for the Unity Editor and unsupported platforms.
            return new DefaultClient();
#endif
        }
    }
}

Определите публичный API для каждого метода интерфейса.

Создайте класс AdPubApi , содержащий вызовы методов для каждого клиентского метода в вашем интерфейсе IAdPubClient . Этот класс использует AdPubClientFactory для получения экземпляра IAdPubClient и вызывает этот клиент для доступа к функциям базового SDK.

Assets/AdPub/AdPubApi.cs

using AdPub.Common;

namespace AdPub
{
    public class AdPubApi
    {
        private static readonly IAdPubClient client = GetAdPubClient();

        // Returns the correct client for the current runtime platform.
        private static IAdPubClient GetAdPubClient()
        {
            return AdPubClientFactory.GetClient();
        }

        // Sets the user consent using the underlying SDK functionality.
        public static void SetHasUserConsent(bool hasUserConsent)
        {
            client.SetHasUserConsent(hasUserConsent);
        }
    }
}

Вызовите созданный вами API.

Вот как можно вызвать описанный выше API:

Assets/Scripts/AdPubController.cs

using UnityEngine;
using AdPub;

public class AdPubController : MonoBehaviour
{
    // TODO: Get consent from the user and update this userConsent field.
    public bool userConsent;

    // Called on startup of the GameObject it's assigned to.
    public void Start()
    {
        // Pass the user consent to AdPub.
        AdPubApi.SetHasUserConsent(userConsent);
    }
}

Дополнительные примеры адаптеров рекламных сетей от сторонних разработчиков

Посетите репозиторий плагина Google Mobile Ads Unity на GitHub, чтобы найти дополнительные примеры сторонних адаптеров медиации, реализующих API на C# для обертывания вызовов методов iOS и Android.