创建自定义事件

借助自定义事件,发布商可以使用 Ad Manager 中介,为不属于第三方广告联盟的第三方广告联盟添加广告瀑布流中介 所有支持的广告联盟 本指南介绍了如何使用针对 Android 和 在 Unity 项目中实现 iOS。

前提条件

  • 完成入门指南。您的 Unity 应用应该已经导入了 Google 移动广告 Unity 插件。

  • 已经针对 Android 和 iOS 构建了自定义事件适配器。为了创建自定义 请参阅关于 AndroidiOS

定义自定义事件

为了让自定义事件参与中介,该自定义事件必须 在网页界面中定义 Ad Manager 将 自定义事件 Android 和 iOS 中介组。

如何填写参数
类名称 (iOS)

对于 iOS,请输入实现自定义事件的类的名称。

如果您的类是在 Swift 中实现的,则您需要添加类名称作为前缀 其应用 / 框架模块的名称(例如, appName.className)。

如果您的项目中有多个目标,或者如果 项目名称与目标名称不同。有了目标名称后 将如下所示:appName_targetName.className。此外, 请务必将所有非字母数字字符(例如破折号)替换为 下划线。

类名称 (Android) 对于 Android,请确保您为 Class Name 指定的值是 Android 的完全限定类名称(例如 com.google.ads.mediation.sample.customevent.SampleCustomEvent)。
标签 为该事件输入一个具有唯一性的名称。
参数 如果您希望向自定义事件传递字符串参数(例如 广告单元 ID。

导入自定义事件库

自定义事件可能需要添加额外的库才能正常运行 正确。例如,您可能需要添加以下库:

  • Android 第三方 SDK
  • Android 第三方自定义事件
  • iOS 第三方广告 SDK
  • iOS 第三方自定义事件

库类型

您可以通过多种方式将 Android 或 iOS 代码导入 Unity 项目, 包括:

  • 使用外部依赖项导入预构建的 Android 或 iOS 工件 Unity 经理
  • 导入 AAR 插件和 Android 库
  • 导入 Java 和 Kotlin 源文件
  • 导入 iOS 源文件和静态库

根据您所使用的库的打包方式,您可能需要 导入策略我们稍后会更详细地介绍每种方法。

(推荐)导入预构建的 Android 或 iOS 工件

使用 External Dependency Manager for Unity。 此插件包含在 GoogleMobileAds 插件中。

要导入现有工件,请创建一个配置文件 导入。文件名和路径应满足以下要求:

  • 该文件必须位于 /Editor/ 文件夹中。
  • 文件名必须以 Dependencies.xml 结尾。

例如,为假设的广告联盟导入自定义事件适配器 创建名为 AdPub 的文件:

Assets/AdPub/Editor/AdPubDependencies.xml

接下来,在 AdPubDependencies.xml 文件中定义依赖项。规则 即可访问 通过 Unity 获取外部依赖项管理器 已开始。通过 以下代码段包含 Android 和 iOS SDK 以及自定义事件 一个假设的“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 依赖项: 示例

External Dependency Manager 会自动监控配置更改 以及解析依赖项您还可以使用 以下菜单命令:

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 的原生代码指南 插件

使用广告检查器测试自定义事件

广告检查器可用于测试 确认自定义事件已正确导入您的应用。广告 只需手势即可打开检查器,也可以使用极少的代码以编程方式打开检查器。

(可选)从 C# 脚本调用第三方 SDK 原生方法

第三方广告联盟 SDK 可能有特殊要求, 直接调用 Android 或 iOS 方法调用这些方法的过程 如下所示:

  1. 为平台客户端定义通用接口
  2. 为不受支持的平台实现默认客户端
  3. 实现用于调用 Android 方法的 Android 客户端
  4. 实现用于调用 iOS 方法的 iOS 客户端
  5. 实施客户端 工厂 在 iOS 和 Android 客户端之间切换
  6. 定义一个用于访问所有第三方广告联盟 SDK 功能的 API

以下部分展示了如何针对假设性 名为“AdPub”的广告联盟使用可调用 Android 上的方法的 C# API 编写 和 iOS:

Android

package com.adpub.android;

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

iOS

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

为平台客户端定义通用接口

创建一个 IAdPubClient 接口,使用一个表示底层方法的方法 Android 和 iOS API。

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 iOS AdPubSdk 类中的 setHasUserConsent() 方法。

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() 方法 。使用 C 方法创建 AdPubClientBridge.m 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()

由于 Android Java 帮助程序类仅在 Android 运行时,您可以使用 UNITY_ANDROID 编译器 指令 类,如代码段中所示。或者,您可以使用 Assembly 定义 以解决此问题。

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 移动广告 Unity 插件 GitHub 代码库 查看实现 C# API 的第三方中介适配器的其他示例 来封装对 iOS 和 Android 方法的调用。