Benutzerdefinierte Ereignisse erstellen

Mit benutzerdefinierten Ereignissen können Publisher, die die AdMob-Vermittlung verwenden, die abfolgebasierte Vermittlung für ein Drittanbieter-Werbenetzwerk hinzufügen, das nicht zu den unterstützten Werbenetzwerken gehört. In diesem Leitfaden wird erläutert, wie Sie ein vorhandenes benutzerdefiniertes Ereignis, das für Android und iOS erstellt wurde, in einem Unity-Projekt verwenden.

Voraussetzungen

  • Folgen Sie der Anleitung unter Jetzt starten. Das Unity-Plug-in für Google Mobile Ads sollte bereits in Ihre Unity-App importiert sein.

  • Benutzerdefinierte Ereignisadapter, die bereits für Android und iOS entwickelt wurden. Informationen zum Erstellen benutzerdefinierter Ereignisadapter finden Sie in unseren Leitfäden zu benutzerdefinierten Ereignissen unterAndroid undiOS.

Benutzerdefiniertes Ereignis definieren

Damit ein benutzerdefiniertes Ereignis an der Vermittlung teilnehmen kann, muss es in der Weboberfläche AdMob definiert werden. Den Android- und iOS-Vermittlungsgruppen ein benutzerdefiniertes Ereignis hinzufügen

Auf diesem Screenshot sind einige Beispieleinstellungen für benutzerdefinierte Ereignisse zu sehen:

Parameter ausfüllen
Kursname (iOS)

Geben Sie für iOS den Namen der Klasse ein, in der das benutzerdefinierte Ereignis implementiert ist.

Wenn Ihre Klasse in Swift implementiert ist, müssen Sie dem Klassennamen den Namen der zugehörigen App / des zugehörigen Framework-Moduls voranstellen (z. B. appName.className).

Zielname ist erforderlich, wenn Sie mehrere Ziele in Ihrem Projekt haben oder wenn sich der Projektname vom Zielnamen unterscheidet. Mit dem Zielnamen würde er so aussehen: appName_targetName.className. Denken Sie auch daran, alle nicht alphanumerischen Zeichen wie Bindestriche durch Unterstriche zu ersetzen.

Klassenname (Android) Achten Sie bei Android darauf, dass der Wert, den Sie für Class Name angeben, der voll qualifizierte Klassenname für Android ist (z. B. com.google.ads.mediation.sample.customevent.SampleCustomEvent).
Label Geben Sie einen eindeutigen Namen für das Ereignis ein.
Parameter Wenn Sie ein Stringargument an Ihr benutzerdefiniertes Ereignis übergeben möchten, z. B. eine Anzeigenblock-ID.

Benutzerdefinierte Ereignisbibliotheken importieren

Benutzerdefinierte Ereignisse benötigen möglicherweise zusätzliche Bibliotheken, damit sie ordnungsgemäß funktionieren. Beispielsweise müssen Sie möglicherweise die folgenden Bibliotheken einbeziehen:

  • Android-SDK eines Drittanbieters
  • Benutzerdefiniertes Android-Ereignis eines Drittanbieters
  • iOS-SDK für Drittanbieteranzeigen
  • Benutzerdefiniertes iOS-Ereignis (Drittanbieter)

Arten von Bibliotheken

Es gibt mehrere Möglichkeiten, Android- oder iOS-Code in ein Unity-Projekt zu importieren:

  • Vordefinierte Android- oder iOS-Artefakte mithilfe des External Abhängigency Managers für Unity importieren
  • AAR-Plug-ins und Android-Bibliotheken importieren
  • Java- und Kotlin-Quelldateien importieren
  • iOS-Quelldateien und statische Bibliotheken importieren

Je nachdem, wie die verwendeten Bibliotheken gepackt sind, benötigen Sie möglicherweise für jede Bibliothek eine andere Importstrategie. Jede Option wird später noch ausführlicher erläutert.

(Empfohlen) Vorgefertigte Android- oder iOS-Artefakte importieren

Importieren Sie vorgefertigte Artefakte von Maven oder CocoaPods mit dem External Dependency Manager for Unity. Dieses Plug-in ist im GoogleMobileAds-Plug-in enthalten.

Erstellen Sie zum Importieren vorhandener Artefakte eine Konfigurationsdatei, um Ihre Importe zu definieren. Für Dateiname und Pfad gelten die folgenden Anforderungen:

  • Die Datei muss sich im Ordner /Editor/ befinden.
  • Der Dateiname muss mit Dependencies.xml enden.

Wenn Sie beispielsweise Adapter für benutzerdefinierte Ereignisse für ein hypothetisches Werbenetzwerk mit dem Namen AdPub importieren möchten, erstellen Sie die Datei:

Assets/AdPub/Editor/AdPubDependencies.xml

Definieren Sie als Nächstes Ihre Abhängigkeiten in der Datei AdPubDependencies.xml. Regeln zum Konfigurieren der Importe finden Sie unter Externer Abhängigkeitsmanager für Unity – Erste Schritte. Das folgende Code-Snippet enthält das Android- und iOS-SDK sowie benutzerdefinierte Ereignisbibliotheken für ein hypothetisches "AdPub"-Werbenetzwerk.

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>

Wenn Ihr benutzerdefiniertes Ereignisartefakt bereits eine Abhängigkeit vom erforderlichen Werbenetzwerk-SDK hat, müssen Sie die SDK-Abhängigkeit nicht explizit definieren: Beispiel

Der externe Abhängigkeitsmanager überwacht automatisch auf Konfigurationsänderungen und löst Abhängigkeiten auf. Sie können die manuelle Auflösung auch mit dem folgenden Menübefehl ausführen:

Assets > External Dependency Manager > Android Resolver > Force Resolve

AAR-Plug-ins und Android-Bibliotheken importieren

Unity unterstützt das Importieren von *.aar-Dateien und Android-Bibliotheksprojekten. Wenn Ihr benutzerdefiniertes Android-Ereignis auf diese Weise gepackt ist, finden Sie unter AAR-Plug-ins und Android-Bibliotheken eine Anleitung dazu, wie Sie diese Dateien in Ihr Unity-Projekt aufnehmen können.

Java- und Kotlin-Quelldateien importieren

Wenn Ihr benutzerdefinierter Android-Ereigniscode ab Unity 2018.2 aus nicht kompilierten *.java- oder *.kt-Dateien besteht, können Sie Java- oder Kotlin-Quelldateien als Plug-ins verwenden.

iOS-Quelldateien und statische Bibliotheken importieren

Unity unterstützt *.framework-Artefakte, *.h- und *.m-Quelldateien. Das Importieren von iOS-Artefakten und Quelldateien wird im Unity-Leitfaden für native Plug-ins erläutert.

Benutzerdefinierte Ereignisse mit dem Anzeigenprüftool testen

Mit dem Anzeigenprüftool können Sie testen, ob benutzerdefinierte Ereignisse korrekt in Ihre App importiert wurden. Das Anzeigenprüftool kann mit Gesten oder programmatisch mit minimalem Code geöffnet werden.

Optional: Native Methoden des Drittanbieter-SDKs über C#-Skripts aufrufen

Für SDKs von Drittanbieter-Werbenetzwerken können besondere Anforderungen gelten, die einen direkten Aufruf von Android- oder iOS-Methoden erfordern. So rufen Sie diese Methoden direkt auf:

  1. Eine gemeinsame Schnittstelle für Plattformclients definieren
  2. Standardclient für nicht unterstützte Plattformen implementieren
  3. Android-Client zum Aufrufen von Android-Methoden implementieren
  4. iOS-Client zum Aufrufen von iOS-Methoden implementieren
  5. Client Factory implementieren, um bedingt zwischen iOS- und Android-Clients zu wechseln
  6. API für den Zugriff auf alle Funktionen von Drittanbieter-Werbenetzwerk-SDKs definieren

Im folgenden Abschnitt sehen Sie, wie diese Schritte für ein hypothetisches Werbenetzwerk namens „AdPub“ in einer C# API implementiert werden, die die Methoden unter Android und iOS aufrufen kann:

Android

package com.adpub.android;

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

iOS

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

Eine gemeinsame Schnittstelle für Plattformclients definieren

Erstellen Sie eine IAdPubClient-Schnittstelle mit einer Methode, die die zugrunde liegende Android- und iOS-API darstellt.

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

Standardclient für nicht unterstützte Plattformen festlegen

Erstellen Sie eine DefaultClient-Klasse, die die IAdPubClient-Schnittstelle implementiert, die nur den Methodennamen protokolliert. Verwenden Sie diese Implementierung für den Unity-Editor und alle Plattformen außer Android oder iOS.

Assets/AdPub/Common/DefaultClient.cs

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

iOS-Plattformclient implementieren

Erstellen Sie eine iOSAdPubClient-Klasse, in der die IAdPubClient-Schnittstelle unter iOS implementiert wird. Diese Implementierung verwendet InteropServices, um die Methode setHasUserConsent() in der iOS-Klasse AdPubSdk aufzurufen.

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

Implementieren Sie als Nächstes die Methode GADUAdPubSetHasUserConsent(), die oben definiert wurde. Erstellen Sie AdPubClientBridge.m mit der C-Methode GADUAdPubSetHasUserConsent(), um den Methodenaufruf von Unity zu verarbeiten, und rufen Sie AdPubSDK auf.

AdPubClientBridge ist eine iOS-Quelldatei und muss im Ordner Plugins/iOS abgelegt werden, wie im Unity-Leitfaden für native Plug-ins erläutert.

Assets/AdPub/Plugins/iOS/AdPubClientBridge.m

#import <AdPubSDK/AdPubSDK.h>

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

Android-Plattform-Client implementieren

Erstellen Sie eine AndroidAdPubCient-Klasse, die die IAdPubClient-Schnittstelle unter Android implementiert. Diese Implementierung verwendet die Android-Java-Hilfsklassen, um die statische Android-Methode setHasUserConsent() aufzurufen.

Da die Java-Hilfsklassen für Android nur während der Android-Laufzeit verfügbar sind, können Sie Kompilierungsfehler mithilfe der Compiler-Anweisung UNITY_ANDROID verhindern, um die Klasse zu umschließen, wie im Code-Snippet gezeigt. Alternativ können Sie Assembly-Definitionen ab Unity 2017.4 verwenden, um dieses Problem zu beheben.

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

Factory-Methode erstellen, um die korrekte Clientimplementierung zurückzugeben

Da Sie nun Implementierungen des Clients für jede Plattform haben, erstellen Sie eine AdPubClientFactory-Klasse, um die korrekte Implementierung der IAdPubClient-Schnittstelle abhängig von der Laufzeitplattform zurückzugeben. Diese Klasse verwendet Compiler-Anweisungen, um den richtigen IAdPubClient-Client zurückzugeben.

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

Definieren Sie eine öffentliche API für jede Schnittstellenmethode

Erstellen Sie eine AdPubApi-Klasse, die Methodenaufrufe für jede Clientmethode in der IAdPubClient-Schnittstelle hat. Diese Klasse verwendet den AdPubClientFactory, um eine Instanz von IAdPubClient abzurufen, und ruft diesen Client für die zugrunde liegenden SDK-Funktionen auf.

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

Neu definierte API aufrufen

So können Sie die oben definierte API aufrufen:

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

Weitere Beispiele für Werbenetzwerkadapter von Drittanbietern

Im GitHub-Repository für das Unity-Plug-in für Google Mobile Ads finden Sie weitere Beispiele für Vermittlungsadapter von Drittanbietern, die C#-APIs implementieren, um Aufrufe an iOS- und Android-Methoden zu kapseln.