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

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

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

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

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

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

Чтобы пользовательское событие могло участвовать в медиации, оно должно быть определено в веб-интерфейсе Ad Manager . Добавьте специальное событие в группы медиации 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 с помощью диспетчера внешних зависимостей для Unity . Этот плагин включен в плагин GoogleMobileAds.

Чтобы импортировать существующие артефакты, создайте файл конфигурации, чтобы определить импорт. К имени файла и пути предъявляются следующие требования:

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

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

Assets/AdPub/Editor/AdPubDependencies.xml

Затем определите свои зависимости внутри файла AdPubDependencies.xml . Правила настройки импорта можно найти в разделе Диспетчер внешних зависимостей для Unity Getting Started . Следующий фрагмент кода включает 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:

Андроид

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 с методом C GADUAdPubSetHasUserConsent() для обработки вызова метода из 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. Эта реализация использует вспомогательные классы Android Java для вызова статического метода 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.