Utwórz zdarzenia niestandardowe

Wybierz platformę: Android Nowy Android iOS Unity

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

Wymagania wstępne

Zanim przejdziesz dalej, wykonaj te czynności:

  • Skonfiguruj Google Mobile Ads Unity Plugin. W Twojej aplikacji Unity powinna być już zaimportowana wtyczka Google Mobile Ads Unity.

  • Adaptery zdarzeń niestandardowych utworzone na Androida i iOS. Aby utworzyć niestandardowe adaptery zdarzeń, zapoznaj się z naszymi przewodnikami dotyczącymi zdarzeń niestandardowych na Android i iOS.

Definiowanie zdarzenia niestandardowego

Aby zdarzenie niestandardowe mogło brać udział w zapośredniczeniu, musi być zdefiniowane w interfejsie internetowym AdMob. Dodaj zdarzenie niestandardowe do obu grup zapośredniczenia – na Androida i iOS.

Ten zrzut ekranu przedstawia przykładowe ustawienia zdarzenia niestandardowego:

Jak wypełniać parametry
Nazwa klasy (iOS)

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

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

Nazwa docelowa jest wymagana, jeśli w projekcie masz wiele celów lub jeśli nazwa projektu różni się od nazwy docelowej. W przypadku nazwy docelowej będzie to wyglądać tak: appName_targetName.className. Pamiętaj też, aby zastąpić wszystkie znaki inne niż alfanumeryczne, np. myślniki, podkreśleniami.

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

Importowanie bibliotek zdarzeń niestandardowych

Aby zdarzenia niestandardowe działały prawidłowo, może być konieczne dołączenie dodatkowych bibliotek. Może być na przykład konieczne dołączenie tych bibliotek:

  • pakiet SDK firmy zewnętrznej na Androida,
  • zdarzenie niestandardowe firmy zewnętrznej na Androida,
  • pakiet SDK do wyświetlania reklam firmy zewnętrznej na iOS,
  • zdarzenie niestandardowe firmy zewnętrznej na iOS.

Typy bibliotek

Istnieje kilka sposobów importowania kodu na Androida lub iOS do projektu Unity, m.in.:

  • importowanie wstępnie utworzonych artefaktów na Androida lub iOS za pomocą narzędzia External Dependency Manager for 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 sposobu spakowania używanych bibliotek może być konieczne zastosowanie innej strategii importowania w przypadku każdej z nich. Każda opcja zostanie omówiona bardziej szczegółowo w dalszej części.

(Zalecane) Importowanie wstępnie utworzonych artefaktów na Androida lub iOS

Importuj wstępnie utworzone artefakty z Maven lub CocoaPods za pomocą narzędzia External Dependency Manager for Unity. Ta wtyczka jest dołączona do wtyczki GoogleMobileAds.

Aby zaimportować istniejące artefakty, utwórz plik konfiguracyjny, w którym zdefiniujesz importy. Nazwa i ścieżka pliku muszą spełniać te wymagania:

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

Aby na przykład zaimportować adaptery zdarzeń niestandardowych dla 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 importów znajdziesz w artykule External Dependency Manager for Unity – pierwsze kroki. Ten fragment kodu zawiera pakiet SDK na Androida i iOS oraz biblioteki zdarzeń niestandardowych dla 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 ma już zależność od wymaganego pakietu SDK sieci reklamowej, nie musisz definiować zależności pakietu SDK w sposób jawny: Przykład

Narzędzie External Dependency Manager automatycznie monitoruje zmiany konfiguracji i rozwiązuje zależności. Możesz też ręcznie rozwiązać zależności za pomocą 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 projektów bibliotek Androida. Jeśli Twoje zdarzenie niestandardowe na Androida jest spakowane w ten sposób, zapoznaj się z instrukcjami dotyczącymi wtyczek AAR i bibliotek Androida, aby dowiedzieć się jak dołączyć te pliki do projektu Unity.

Importowanie plików źródłowych Java i Kotlin

Od Unity 2018.2 lub nowszej wersji, jeśli kod zdarzenia niestandardowego na Androida składa się z nieskompilowanych *.java lub *.kt plików, 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 oraz pliki źródłowe *.h i *.m. Importowanie artefaktów i plików źródłowych na iOS jest opisane w przewodniku Unity dotyczącym wtyczek natywnych.

Testowanie zdarzeń niestandardowych za pomocą inspektora reklam

Inspektor reklam może służyć do testowania czy zdarzenia niestandardowe zostały prawidłowo zaimportowane do aplikacji. Inspektora reklam można otworzyć za pomocą gestów lub programowo za pomocą minimalnej ilości kodu.

(Opcjonalnie) Wywoływanie metod natywnych pakietu SDK firmy zewnętrznej ze skryptów C#

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

  1. Zdefiniuj wspólny interfejs dla klientów platformy.
  2. Zaimplementuj domyślnego klienta dla nieobsługiwanych platform.
  3. Zaimplementuj klienta na Androida do wywoływania metod na Androida.
  4. Zaimplementuj klienta na iOS do wywoływania metod na iOS.
  5. Zaimplementuj fabrykę klientów, aby warunkowo przełączać się między klientami na iOS i Androida.
  6. Zdefiniuj interfejs API umożliwiający dostęp do wszystkich funkcji pakietu SDK sieci reklamowej firmy zewnętrznej.

W tej sekcji pokazujemy, jak zaimplementować te kroki w przypadku hipotetycznej sieci reklamowej o nazwie „AdPub” w interfejsie API C#, który może wywoływać metody na Androida 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 z metodą, która reprezentuje podstawowy interfejs API na 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);
    }
}

Zdefiniuj 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 i na wszystkich platformach innych niż Android lub iOS.

Assets/AdPub/Common/DefaultClient.cs

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

Implementowanie klienta platformy iOS

Utwórz klasę iOSAdPubClient implementującą interfejs IAdPubClient na iOS. Ta implementacja używa InteropServices do wywoływania metody setHasUserConsent() w klasie AdPubSdk na 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 metodę GADUAdPubSetHasUserConsent() zdefiniowaną powyżej. Utwórz AdPubClientBridge.m z metodą C GADUAdPubSetHasUserConsent() do obsługi wywołania metody z Unity i wywołaj AdPubSDK.

AdPubClientBridge to plik źródłowy na iOS, który musi znajdować się w folderze Plugins/iOS jak wyjaśniono w przewodniku Unity dotyczącym wtyczek natywnych.

Assets/AdPub/Plugins/iOS/AdPubClientBridge.m

#import <AdPubSDK/AdPubSDK.h>

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

Implementowanie klienta platformy Android

Utwórz klasę AndroidAdPubCient implementującą interfejs IAdPubClient na Androida. Ta implementacja używa klas pomocniczych Android Java do wywoływania statycznej metody Androida setHasUserConsent().

Ponieważ klasy pomocnicze Android Java są dostępne tylko podczas działania Androida , możesz zapobiec błędom kompilacji, używając UNITY_ANDROID dyrektywy kompilatora do opakowania klasy, jak pokazano we fragmencie kodu. Alternatywnie możesz użyć definicji zestawu w Unity 2017.4 i nowszych wersjach, aby rozwiązać ten problem.

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 zwracać prawidłową implementację klienta

Teraz, gdy masz implementacje klienta dla każdej platformy, utwórz klasę AdPubClientFactory, aby zwracać prawidłową implementację interfejsu IAdPubClient w zależności od platformy działania. Ta klasa używa dyrektyw kompilatora do zwracania prawidłowego IAdPubClientklienta.

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, która ma wywołania metod dla każdej metody klienta w interfejsie IAdPubClient. Ta klasa używa AdPubClientFactory do uzyskania instancji IAdPubClient i wywołuje tego klienta w celu uzyskania dostępu do podstawowych 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łaj nowo zdefiniowany interfejs API

Oto jak możesz 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 sieci reklamowych firm zewnętrznych

W repozytorium wtyczki Google Mobile Ads Unity na GitHubie znajdziesz dodatkowe przykłady adapterów zapośredniczenia firm zewnętrznych, które implementują interfejsy API C# do opakowywania wywołań metod na iOS i Androida.