---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/unity/adaptive-sticky-banner.md
  - https://ads.yandex.com/helpcenter/ru/dev/unity/adaptive-sticky-banner.md
  - https://ads.yandex.com/helpcenter/zh/dev/unity/adaptive-sticky-banner.md
  - href: zh/dev/unity/adaptive-sticky-banner.md
    type: text/markdown
    title: Markdown version
  - href: llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/zh/llms.txt

# 自适应粘性横幅

<!-- source: zh/dev/_includes/adaptive-sticky-banner.md -->
自适应固定横幅广告是一种小型广告，会自动更新，并显示在应用屏幕的顶部或底部。它不会遮挡主要内容，常用于游戏应用中。
<!-- endsource: zh/dev/_includes/adaptive-sticky-banner.md -->

<!-- source: zh/dev/_includes/adaptive-sticky-banner.md -->
自适应固定横幅广告会针对每台设备优化广告尺寸，从而实现最佳效果。借助这种广告类型，开发者可设置广告允许的最大宽度，系统将自动确定最佳广告尺寸。
<!-- endsource: zh/dev/_includes/adaptive-sticky-banner.md -->

{% cut "外观" %}

<img src="https://yastatic.net/s3/doc-binary/src/docs/support/mobile-ads/zh/monetization/_images/banner-sticky-zh-ex.png" width="200">

{% endcut %}

## 前提条件 {#pre}

<!-- source: zh/dev/_includes/pre-unity.md -->
1. 按照 [快速入门](https://ads.yandex.com/helpcenter/zh/dev/unity/quick-start.md) 中的流程集成 Yandex Mobile Ads Unity 插件。
2. 确保您运行的是最新的 [Yandex Mobile Ads Unity 插件](https://ads.yandex.com/helpcenter/zh/dev/platforms.md) 版本。如果您使用聚合，请同时确保您运行的是最新版本的 [统一构建](https://ads.yandex.com/helpcenter/zh/dev/platforms.md)。
<!-- endsource: zh/dev/_includes/pre-unity.md -->

## 实施 {#implement}

集成自适应粘性横幅的关键步骤：

* 创建并配置横幅广告对象。
* 注册回调方法监听器。
* 加载广告。
* 如果您使用 Adfox，请传递 [其他设置](https://ads.yandex.com/helpcenter/zh/dev/unity/target-adfox.md)。

## 自适应粘性横幅集成的特点 {#features}

1. 如果您在 `onAdFailedToLoad` 事件中收到错误，请不要尝试再次加载新广告。如果没有其他选项，请限制广告加载重试次数。这将有助于避免出现限制时持续出现不成功的请求和连接问题。

2. 自适应粘性横幅在使用所有可用宽度时效果最佳。通常情况下，这是设备屏幕的全宽度。确保包括适用于您的应用程序的所有内边距和安全显示区域。

3. 要获取广告尺寸，请使用 `BannerAdSize.stickySize(adWidth)` 方法，该方法接受广告容器的可用宽度作为参数。

4. `BannerAdSize` 对象是使用 `BannerAdSize.stickySize(adWidth)` 方法计算的，其中包含相同设备的广告宽度和高度的常量值。在特定设备上测试应用布局后，您可以确定广告尺寸将保持不变。

5. 自适应粘性横幅的高度不应超过屏幕高度的 15%，并且应至少为 50 dp。

## 向项目中添加横幅

要在应用中展示横幅，请在附加到 `GameObject` 的脚本 (C#) 中创建一个 `Banner` 对象。
```c#
using UnityEngine;
using YandexMobileAds;
using YandexMobileAds.Base;

public class YandexMobileAdsStickyBannerDemoScript : MonoBehaviour
{
    private Banner banner;

    private int GetScreenWidthDp()
    {
        int screenWidth = (int)Screen.safeArea.width;
        return ScreenUtils.ConvertPixelsToDp(screenWidth);
    }

    private void RequestStickyBanner()
    {   
        string adUnitId = "demo-banner-yandex"; // 替换为 "R-M-XXXXXX-Y"
        BannerAdSize bannerMaxSize = BannerAdSize.StickySize(GetScreenWidthDp());
        banner = new Banner(adUnitId, bannerMaxSize, AdPosition.BottomCenter);
    }
}
```

`Banner` 构造函数包含以下参数：

* `AdUnitId`：在 Yandex Advertising Network 界面中发布的唯一标识符，如下所示：R-M-XXXXXX-Y。

   {% note tip %}

   出于测试目的，您可以使用演示单元 ID："demo-banner-yandex"。在发布广告之前，请确保将演示单元 ID 替换为真实的广告单元 ID。

   {% endnote %}

* `BannerAdSize`：要展示的横幅的大小。
* `AdPosition`：屏幕上的位置。
* `StickySize(int width)`：横幅尺寸。

您需要设置无边距的全屏宽度。广告将适合这些尺寸。广告的最佳尺寸将自动确定。自适应粘性横幅的高度不应超过屏幕高度的 15%。

## 加载和呈现广告

创建并配置 `Banner` 类的对象后，您需要加载广告。要加载广告，请使用 `LoadAd` 方法，该方法将 `AdRequest` 对象作为参数。

在加载自适应粘性横幅之前，还必须针对每个设备计算广告尺寸。
这是通过 SDK API 自动执行的：`BannerAdSize.stickySize(adWidth)`。

您可以通过 `AdRequest.Builder()` 在请求中传递用户兴趣、上下文应用数据、位置详细信息或其他数据来扩展广告请求参数。在请求中提供额外的上下文数据可以显著提高您的广告质量。请参阅[广告定位](https://ads.yandex.com/helpcenter/zh/dev/unity/target.md)版块了解更多信息。

要在广告加载或加载失败时发出通知并跟踪自适应粘性横幅的生命周期，请为 `BannerAd` 类对象设置回调函数。

```c#
private void RequestStickyBanner()
{
    // ...

    AdRequest request = new AdRequest.Builder().Build();
    banner.LoadAd(request);
}
```

## 横幅广告事件

要跟踪横幅广告中发生的事件，请为适当的 `EventHandler` 注册委托，如下所示：
```c#
using System;
// ...

private void RequestStickyBanner()
{
    // ...
    // 激励广告加载时调用
    banner.OnAdLoaded += HandleAdLoaded;

    // 加载广告出错时调用
    banner.OnAdFailedToLoad += HandleAdFailedToLoad;

    // 当用户点击广告时调用
    banner.OnAdClicked += HandleAdClicked;

    // 记录广告展示时调用
    banner.OnImpression += HandleImpression;
    // ...
}

private void HandleAdLoaded(object sender, EventArgs args)
{
    Debug.Log("AdLoaded event received");
    banner.Show();
}

private void HandleAdFailedToLoad(object sender, AdFailureEventArgs args)
{
    Debug.Log($"AdFailedToLoad event received with message: {args.Message}");
    // 我们强烈建议不要使用此方法加载新广告
}

private void HandleAdClicked(object sender, EventArgs args)
{
    Debug.Log("AdClicked event received");
}

private void HandleImpression(object sender, ImpressionData impressionData)
{
    var data = impressionData == null ? "null" : impressionData.rawData;
    Debug.Log($"HandleImpression event received with data: {data}");
}
```

## 测试自适应粘性横幅集成 {#test}

{% list tabs %}

- Android

   <!-- source: zh/dev/_includes/test-android-sticky-banner.md -->
   ### 使用演示广告单元进行广告测试 {#demo-blocks}

   使用测试广告来检查您的自适应固定横幅广告集成和应用本身。为了确保每次广告请求都能返回测试广告，您可以使用一个特殊的演示广告版位 ID。

   演示广告单元 ID：`demo-banner-yandex`.

   {% note warning %}

   在应用商店发布应用前，请务必将演示广告版位 ID 替换为您在 Yandex Advertising Network 接口中获取的真实 ID。

   {% endnote %}

   有关所有可用演示广告版位 ID 的列表，请参阅[用于测试的演示广告单元](https://ads.yandex.com/helpcenter/zh/dev/android/demo-blocks.md)。

   ### 测试广告集成 {#test-int}

   您可以使用 SDK 的内置分析工具检查自适应固定横幅广告是否已正确集成。日志中将显示包含测试结果的详细报告。

   要查看报告，请在 Android 应用调试工具 [Logcat](https://developer.android.com/studio/command-line/logcat) 中搜索关键词“YandexAds”。

   ```bash
   adb logcat -v brief '*:S YandexAds'
   ```

   如果集成成功，将返回以下消息：
   ```bash
   adb logcat -v brief '*:S YandexAds'
   mobileads$ adb logcat -v brief '*:S YandexAds'
   I/YandexAds(13719): [Integration] Ad type banner was integrated successfully
   ```

   如果存在任何横幅广告集成问题，您将收到详细的问题报告和故障排除建议。
   <!-- endsource: zh/dev/_includes/test-android-sticky-banner.md -->

- iOS

   ### 使用演示广告单元进行广告测试

   <!-- source: zh/dev/_includes/test-ios-inline-banner.md -->
   我们建议使用测试广告来测试您的广告集成和应用本身。

   为了保证为每个广告请求返回测试广告，我们创建了一个特殊的演示广告版位 ID。用它来检查您的广告集成。

   演示广告单元 ID：`demo-banner-yandex`.

   {% note warning %}

   在商店中发布您的应用程序之前，确保将演示版位 ID 替换为您在 Yandex Advertising Network 界面中获得的真实 ID。

   {% endnote %}

   您可以在 [用于测试的演示广告单元](https://ads.yandex.com/helpcenter/zh/dev/ios/demo-blocks.md) 部分找到可用的演示广告版位 ID 列表。
   <!-- endsource: zh/dev/_includes/test-ios-inline-banner.md -->

   ### 测试广告集成

   <!-- source: zh/dev/_includes/test-integration-ios.md -->
   您可以使用本机控制台工具测试广告集成。

   要查看详细日志，请调用 `YMAMobileAds` 类的 `enableLogging` 方法。

   ```swift
   YMAMobileAds.enableLogging()
   ```

   要查看 SDK 日志，请前往控制台工具并设置 `Subsystem = com.mobile.ads.ads.sdk`。您还可以按类别和错误级别过滤日志。

   如果您在集成广告时遇到问题，您将获得有关问题的详细报告以及如何解决这些问题的建议。

   <img src= "https://yastatic.net/s3/doc-binary/src/dev/mobile-ads/common/integration-ios-2.png">
   <!-- endsource: zh/dev/_includes/test-integration-ios.md -->

{% endlist %}

## 提示

### 广告预加载

<!-- source: zh/dev/_includes/preload.md -->
加载广告可能需要几秒钟的时间，具体取决于移动聚合中对接的广告网络数量和用户的互联网速度。我们建议在展示广告之前预加载广告。
<!-- endsource: zh/dev/_includes/preload.md -->

您可以在应用启动时或在展示之前加载广告。确保使用 `DontDestroyOnLoad(gameObject)` 调用保留场景之间的对象。这可确保加载的广告不会在场景更改时随 `gameObject` 一起删除。

当您需要呈现横幅时，请调用 `banner.Show()`。

<!-- source: zh/dev/_includes/cash-ads.md -->
如果您在太多不太可能显示的屏幕上缓存广告，您的广告效果可能会下降。例如，如果用户每次会话完成 2-3 个游戏关卡，则您不应缓存 6-7 个屏幕的广告。否则，您的广告可见性可能会降低，并且广告系统可能会降低您的应用的优先级。

为确保您为应用程序找到良好的平衡，请在 Yandex Advertising Network 界面中跟踪“收视数比例”或“可见收视数比例”指标。如果它低于 20%，可能需要修改您的缓存算法。收视数比例越高越好。
<!-- endsource: zh/dev/_includes/cash-ads.md -->

### 清除未使用的内存

我们建议在每次广告请求之前调用 `banner?.Destroy()` 并重新创建 `Banner` 对象。这可确保清除所有已使用的内存，并且应用可以多次请求和展示广告，而不会使设备过载。这还可以防止与重复广告加载和生命周期中断相关的代码错误。

## 其他资源 {#resources}

* <!-- source: zh/dev/_includes/github-pubdev-links.md -->
  [GitHub](https://github.com/yandexmobile/yandex-ads-unity-plugin) 链接。
  <!-- endsource: zh/dev/_includes/github-pubdev-links.md -->

