Utwórz zdarzenia niestandardowe

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 utworzonego wcześniej zdarzenia niestandardowego przeznaczonego na Androida i iOS.

Wymagania wstępne

  • Kliknij Rozpocznij. W aplikacji Unity powinna być już zaimportowana wtyczka reklam mobilnych Google dla środowiska Unity.

  • Adaptery zdarzeń niestandardowych są już dostępne na Androida i iOS. Aby utworzyć niestandardowe adaptery zdarzeń, zapoznaj się z naszymi przewodnikami po zdarzeniach niestandardowych na AndroidiOS.

Definiowanie zdarzenia niestandardowego

Aby zdarzenie niestandardowe mogło uczestniczyć 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 zajęć (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 miejsca docelowego jest wymagana, jeśli w projekcie masz wiele miejsc docelowych lub jeśli nazwa projektu różni się od nazwy miejsca docelowego. 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 klasy (Android) W przypadku Androida upewnij się, że wartość podana w parametrze Class Name to pełna nazwa klasy w Androidzie (np. 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.

Importowanie bibliotek zdarzeń niestandardowych

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

  • Pakiet SDK firmy zewnętrznej na Androida
  • Niestandardowe zdarzenie firmy zewnętrznej na Androidzie
  • Pakiet SDK do reklam firm zewnętrznych na iOS
  • Niestandardowe zdarzenie zewnętrzne w iOS

Rodzaje bibliotek

Kod Androida lub iOS możesz zaimportować do projektu Unity na kilka sposobów, m.in.:

  • Importowanie gotowych 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 w językach Java i Kotlin
  • Importowanie plików źródłowych iOS i bibliotek statycznych

W zależności od sposobu pakowania używanych bibliotek może być konieczne zastosowanie innej strategii importowania w przypadku każdej z nich. Każda z tych opcji zostanie omówiona szczegółowo w dalszej części.

(Zalecane) Importowanie gotowych artefaktów na Androida lub iOS

Importuj gotowe artefakty z Maven lub CocoaPods za pomocą 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 pliku i ścieżka muszą spełniać te wymagania:

  • Plik musi znajdować się w folderze /Editor/.
  • Nazwa pliku musi kończyć się na 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 – wprowadzenie. Poniższy fragment kodu zawiera pakiety 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

Menedżer zależności zewnętrznych automatycznie monitoruje zmiany konfiguracji i rozwiązuje zależności. Możesz też ręcznie rozwiązać problem, 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 projektów bibliotek Androida. Jeśli Twoje niestandardowe zdarzenie na Androida jest spakowane w ten sposób, w instrukcjach w artykule Wtyczki AAR i biblioteki Androida znajdziesz informacje o tym, jak uwzględnić te pliki w projekcie Unity.

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

Jeśli korzystasz z Unity w wersji 2018.2 lub nowszej, a Twój kod zdarzenia niestandardowego na Androida składa się z niekompilowanych plików *.java lub *.kt, możesz używać plików źródłowych Java lub Kotlin jako wtyczek.

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

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

Testowanie zdarzeń niestandardowych za pomocą inspektora reklam

Inspektora reklam można używać do sprawdzania, czy zdarzenia niestandardowe zostały prawidłowo zaimportowane do aplikacji. Inspektora reklam można otworzyć za pomocą gestów lub programowo przy użyciu minimalnej ilości kodu.

(Opcjonalnie) Wywoływanie natywnych metod pakietu SDK innej firmy 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 Androida lub iOS. Aby bezpośrednio wywołać te metody, wykonaj te czynności:

  1. Określanie wspólnego interfejsu dla klientów platformy
  2. Wdrażanie domyślnego klienta na nieobsługiwanych platformach
  3. Implementowanie klienta Androida do wywoływania metod Androida
  4. Implementowanie klienta iOS do wywoływania metod iOS
  5. Wdrażanie fabryki klientów, aby warunkowo przełączać się między klientami iOS i Androida
  6. Określ interfejs API, który umożliwia dostęp do wszystkich funkcji pakietu SDK zewnętrznej sieci reklamowej.

W sekcji poniżej pokazujemy, jak te kroki są wdrażane w przypadku hipotetycznej sieci reklamowej o nazwie „AdPub” w interfejsie C# API, 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

Określanie wspólnego interfejsu dla klientów platformy

Utwórz interfejs IAdPubClient z metodą reprezentującą podstawowy 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);
    }
}

Określanie domyślnego klienta na nieobsługiwanych platformach

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 i iOS.

Assets/AdPub/Common/DefaultClient.cs

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

Wdrażanie klienta platformy iOS

Utwórz klasę iOSAdPubClient implementującą interfejs IAdPubClient w iOS. Ta implementacja używa przestrzeni nazw 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 za pomocą metody CGADUAdPubSetHasUserConsent(), aby obsługiwać wywołanie metody z Unity, i wywołaj AdPubSDK.

AdPubClientBridge to plik źródłowy iOS, który musi znajdować się w folderze Plugins/iOS zgodnie z instrukcjami w przewodniku Unity dotyczącym wtyczek natywnych.

Assets/AdPub/Plugins/iOS/AdPubClientBridge.m

#import <AdPubSDK/AdPubSDK.h>

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

Wdrażanie klienta platformy Android

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

Klasy pomocnicze Java na Androida są dostępne tylko w czasie działania Androida, więc możesz zapobiec błędom kompilacji, używając UNITY_ANDROID dyrektywy kompilatora, aby opakować klasę, jak pokazano we fragmencie kodu. Możesz też 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ą, która zwraca prawidłową implementację klienta.

Teraz, gdy masz implementacje klienta dla każdej platformy, 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, aby zwracać 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 zawiera wywołania metod dla każdej metody klienta w interfejsie IAdPubClient. Ta klasa używa funkcji AdPubClientFactory, aby uzyskać instancję 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ływanie nowo zdefiniowanego interfejsu API

Oto jak możesz wywołać zdefiniowany powyżej interfejs 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);
    }
}

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

Więcej przykładów adapterów zapośredniczenia innych firm implementujących interfejsy API w języku C# do opakowywania wywołań metod iOS i Androida znajdziesz w repozytorium wtyczki reklam mobilnych Google dla Unity w Githubie.