Utwórz zdarzenia niestandardowe

Zdarzenia niestandardowe umożliwiają wydawcom korzystającym AdMob z zapośredniczenia dodawanie zapośredniczenia kaskadowego w przypadku zewnętrznej sieci reklamowej, która nie należy do obsługiwanych sieci reklamowych. Z tego przewodnika dowiesz się, jak użyć w projekcie Unity istniejącego zdarzenia niestandardowego utworzonego na Androida i iOS.

Wymagania wstępne

  • Wykonaj czynności Pierwsze kroki. Twoja aplikacja na Unity powinna już mieć zaimportowaną wtyczkę reklam mobilnych Google dla Unity.

  • Adaptery zdarzeń niestandardowych są już opracowane na Androida i iOS. Aby utworzyć adaptery zdarzeń niestandardowych, zajrzyj do przewodników po zdarzeniach niestandardowychAndroid iiOS.

Definiowanie zdarzenia niestandardowego

Aby zdarzenie niestandardowe mogło uczestniczyć w zapośredniczeniu, musisz je zdefiniować w AdMob interfejsie internetowym. Dodaj zdarzenie niestandardowe do grup zapośredniczenia na urządzeniach z Androidem i iOS.

Zrzut ekranu z przykładowymi ustawieniami zdarzenia niestandardowego:

Jak wypełnić parametry
Nazwa zajęć (iOS)

W iOS wpisz nazwę klasy, która implementuje zdarzenie niestandardowe.

Jeśli klasa została zaimplementowana w kodzie Swift, przed jej nazwą musisz dodać nazwę odpowiedniej aplikacji lub modułu platformy (np. appName.className).

Nazwa celu jest wymagana, jeśli w projekcie masz wiele środowisk docelowych lub jeśli nazwa projektu różni się od nazwy projektu. Docelowa nazwa wygląda tak: appName_targetName.className. Pamiętaj też o zastąpieniu znaków innych niż alfanumeryczne, np. myślników, znakami podkreślenia.

Nazwa zajęć (Android) W przypadku Androida upewnij się, że wartość podana dla Class Name jest w pełni kwalifikowaną nazwą klasy Androida (na przykład com.google.ads.mediation.sample.customevent.SampleCustomEvent).
Etykieta Wpisz niepowtarzalną nazwę zdarzenia.
Parametr Jeśli chcesz przekazać do zdarzenia niestandardowego argument w postaci ciągu znaków, np. identyfikator jednostki reklamowej.

Importuj biblioteki zdarzeń niestandardowych

Prawidłowe działanie zdarzeń niestandardowych może wymagać dołączenia dodatkowych bibliotek. Na przykład możesz potrzebować tych bibliotek:

  • Pakiet SDK na Androida firmy zewnętrznej
  • Zdarzenie niestandardowe innej firmy na Androida
  • Pakiet SDK do wyświetlania reklam firmy zewnętrznej na iOS
  • Zewnętrzne zdarzenie niestandardowe na iOS

Rodzaje bibliotek

Kody na Androida lub iOS można zaimportować do projektu Unity na kilka sposobów, np.:

  • Importowanie gotowych artefaktów Androida lub iOS przy użyciu zewnętrznego menedżera zależności dla Unity
  • Importowanie wtyczek AAR i bibliotek Androida
  • Importowanie plików źródłowych Java i Kotlin
  • Importowanie plików źródłowych i bibliotek statycznych na iOS

W zależności od tego, jak uporządkowane są używane biblioteki, dla każdej z nich możesz potrzebować innej strategii importowania. Każda opcja zostanie omówiona szczegółowo później.

(Zalecane) Importowanie gotowych artefaktów Androida lub iOS

Zaimportuj gotowe artefakty z Maven lub CocoaPods za pomocą zewnętrznego menedżera zależności dla Unity. Ta wtyczka jest dołączana do wtyczki GoogleMobileAds.

Aby zaimportować istniejące artefakty, utwórz plik konfiguracji w celu zdefiniowania importów. Oto wymagania dotyczące nazwy pliku i ścieżki:

  • Plik musi znajdować się w folderze /Editor/.
  • Nazwa pliku musi kończyć się na Dependencies.xml.

Aby np. zaimportować adaptery zdarzeń niestandardowych do hipotetycznej sieci reklamowej o nazwie AdPub, utwórz plik:

Assets/AdPub/Editor/AdPubDependencies.xml

Następnie zdefiniuj zależności w pliku AdPubDependencies.xml. Reguły konfigurowania importu można znaleźć w External Dependency Manager for Unity started (Rozpoczęcie pracy z Unity). Ten fragment kodu zawiera pakiet SDK na Androida i iOS oraz biblioteki zdarzeń niestandardowych na potrzeby hipotetycznej sieci reklamowej „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>

Jeśli artefakt zdarzenia niestandardowego jest już zależny od wymaganego pakietu SDK sieci reklamowej, nie musisz wyraźnie określać zależności od tego pakietu: Przykład

Zewnętrzny menedżer zależności automatycznie monitoruje zmiany w konfiguracji i rozwiązuje zależności. Możesz też znaleźć rozwiązanie ręcznie, korzystając z tego polecenia menu:

Assets > External Dependency Manager > Android Resolver > Force Resolve

Importowanie wtyczek AAR i bibliotek Androida

Unity obsługuje importowanie plików *.aar oraz projekty bibliotek na Androidzie. Jeśli Twoje niestandardowe zdarzenie Androida jest spakowane w ten sposób, na stronie wtyczek AAR i bibliotek Androida znajdziesz instrukcje włączania tych plików do projektu Unity.

Importuj pliki źródłowe Java i Kotlin

Jeśli Twój niestandardowy kod zdarzeń w Androidzie w wersji Unity 2018.2 lub nowszej zawiera nieskompilowane pliki *.java lub *.kt, możesz używać plików źródłowych Java lub Kotlin jako wtyczek.

Importowanie plików źródłowych i bibliotek statycznych na iOS

Unity obsługuje artefakty *.framework, pliki źródłowe *.h i *.m. Importowanie artefaktów i plików źródłowych z iOS zostało wyjaśnione w przewodniku Unity dotyczącym wtyczek natywnych.

Testowanie zdarzeń niestandardowych za pomocą inspektora reklam

Inspektora reklam możesz użyć do sprawdzenia, czy zdarzenia niestandardowe zostały prawidłowo zaimportowane do aplikacji. Inspektora reklam można otworzyć tylko gestami lub automatycznie, używając minimalnej ilości kodu.

(Opcjonalnie) Wywołuj metody natywne pakietów SDK innych firm ze skryptów w języku C#

Pakiety SDK zewnętrznych sieci reklamowych mogą mieć specjalne wymagania, które wymagają bezpośredniego wywoływania metod na Androida lub iOS. Proces bezpośredniego wywoływania tych metod wygląda tak:

  1. Zdefiniuj wspólny interfejs dla klientów platformy
  2. Wdrażanie domyślnego klienta na nieobsługiwanych platformach
  3. Zaimplementuj klienta Androida do wywoływania metod Androida
  4. Zaimplementuj klienta iOS do wywoływania metod iOS
  5. Zaimplementuj fabrykę klienta, aby warunkowo przełączać się między klientami na iOS i Androida.
  6. Definiowanie interfejsu API umożliwiającego dostęp do wszystkich funkcji pakietów SDK zewnętrznych sieci reklamowych

Z tej sekcji dowiesz się, jak implementować te czynności w przypadku hipotetycznej sieci reklamowej o nazwie „AdPub” w interfejsie API w języku C#, który może wywoływać metody na Androidzie i iOS:

Android

package com.adpub.android;

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

iOS

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

Zdefiniuj wspólny interfejs dla klientów platformy

Utwórz interfejs IAdPubClient za pomocą metody, która reprezentuje bazowy interfejs API Androida i 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);
    }
}

Definiowanie domyślnego klienta dla nieobsługiwanych platform

Utwórz klasę DefaultClient implementującą interfejs IAdPubClient, która rejestruje tylko nazwę metody. Użyj tej implementacji w edytorze Unity oraz na wszystkich platformach innych niż Android i iOS.

Assets/AdPub/Common/DefaultClient.cs

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

Wdróż klienta na platformie iOS

Utwórz klasę iOSAdPubClient implementującą interfejs IAdPubClient na urządzeniu z iOS. Ta implementacja korzysta z InteropServices do wywoływania metody setHasUserConsent() w klasie AdPubSdk iOS.

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

Następnie zaimplementuj zdefiniowaną powyżej metodę GADUAdPubSetHasUserConsent(). Utwórz AdPubClientBridge.m przy użyciu metody C GADUAdPubSetHasUserConsent() do obsługi wywołania metody z Unity i wywołania AdPubSDK.

AdPubClientBridge to plik źródłowy iOS, który należy umieścić w folderze Plugins/iOS zgodnie z opisem w przewodniku Unity dotyczącym wtyczek natywnych.

Assets/AdPub/Plugins/iOS/AdPubClientBridge.m

#import <AdPubSDK/AdPubSDK.h>

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

Wdróż klienta platformy Android

Utwórz klasę AndroidAdPubCient implementującą interfejs IAdPubClient na urządzeniu z Androidem. Ta implementacja korzysta z klas pomocniczych w języku Java na Androida do wywoływania statycznej metody Androida setHasUserConsent().

Klasy pomocnicze w języku Java na Androida są dostępne tylko w środowisku wykonawczym Androida, więc możesz zapobiec błędom kompilacji za pomocą dyrektywy kompilatora UNITY_ANDROID do zawijania klasy w sposób pokazany we fragmencie kodu. Aby rozwiązać ten problem, możesz też użyć definicji asemblera w Unity 2017.4 lub nowszych.

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

Utwórz metodę fabryczną, aby zwrócić prawidłową implementację klienta

Masz już implementacje klienta dla każdej platformy, więc utwórz klasę AdPubClientFactory, która będzie zwracać prawidłową implementację interfejsu IAdPubClient w zależności od platformy środowiska wykonawczego. Ta klasa używa dyrektyw kompilatora do zwrócenia prawidłowego klienta 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
        }
    }
}

Zdefiniuj publiczny interfejs API dla każdej metody interfejsu

Utwórz klasę AdPubApi zawierającą wywołania metod dla każdej metody klienta w interfejsie IAdPubClient. Ta klasa korzysta z AdPubClientFactory do pobierania instancji IAdPubClient i wywołuje tego klienta na potrzeby bazowych funkcji pakietu 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);
        }
    }
}

Wywoływanie nowo zdefiniowanego interfejsu API

Aby wywołać interfejs API zdefiniowany powyżej:

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);
    }
}

Dodatkowe przykłady adapterów zewnętrznych sieci reklamowych

W repozytorium wtyczki Unity Google do reklam mobilnych Google na GitHubie znajdziesz dodatkowe przykłady adapterów zapośredniczenia innych firm, które implementują interfejsy API C# do pakowania wywołań metod na iOS i Androida.