---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.0
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/ios/swiftui/adaptive-inline-banner.md
  - https://ads.yandex.com/helpcenter/ru/dev/ios/swiftui/adaptive-inline-banner.md
  - https://ads.yandex.com/helpcenter/zh/dev/ios/swiftui/adaptive-inline-banner.md
  - href: zh/dev/ios/swiftui/adaptive-inline-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

[//]: # (This page is also translated into Brazilian Portuguese — pt-BR)

<!--
Used in Boost: boost/ru/ad-monetization/dev/ios
-->

# 自适应内联横幅 (SwiftUI)

<!-- source: zh/dev/_includes/adaptive-inline-banner.md -->
自适应内嵌横幅广告是一种灵活的横幅广告格式，通过针对每台设备优化广告尺寸，确保投放效果达到最优。
<!-- endsource: zh/dev/_includes/adaptive-inline-banner.md -->

<!-- source: zh/dev/_includes/adaptive-inline-banner.md -->
借助这种广告类型，开发者可设置广告允许的最大宽度和高度，系统将自动确定最佳广告尺寸。为了选择最佳广告尺寸，自适应内嵌横幅广告采用最大高度而非固定高度，这有助于提升广告表现。
<!-- endsource: zh/dev/_includes/adaptive-inline-banner.md -->

此格式通常用于基于信息流的应用，或可接受主要关注广告的场景。

{% cut "外观" %}

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

{% endcut %}

本指南展示了如何使用 **SwiftUI** 将自适应内联横幅集成到 iOS 应用中。 除了代码示例和说明之外，它还提供使用此广告格式的建议和其他资源的链接。

## 前提条件 {#pre}

<!-- source: zh/dev/_includes/pre-ios.md -->
1. 请按照 [快速入门](https://ads.yandex.com/helpcenter/zh/dev/ios/quick-start.md) 中描述的 SDK 集成步骤进行操作。
2. 提前 [初始化](https://ads.yandex.com/helpcenter/zh/dev/ios/quick-start.md#init) 您的广告 SDK。
3. 确保您运行的是最新的 [Yandex Mobile Ads SDK](https://ads.yandex.com/helpcenter/zh/dev/platforms.md) 版本。如果您使用聚合，请同时确保您运行的是最新版本的 [统一构建](https://ads.yandex.com/helpcenter/zh/dev/platforms.md)。
<!-- endsource: zh/dev/_includes/pre-ios.md -->

## 实施 {#implement}

在 SwiftUI 中集成自适应内联横幅的关键步骤：

- 创建尺寸为 `BannerSize.inline(width:maxHeight:)` 的 `BannerState`，以及具有广告单元 ID 的 `AdRequest`。
- 将 `Banner(state:)` 添加到视图层次结构中，并传递 `BannerState`。
- 通过 `.onAdLoad`、`.onAdFailure` 修饰符订阅事件，并且可选择通过 `.onAdClick`、`.onAdImpression` 订阅事件。
- 如果您通过 Adfox 工作（通过 `BannerState` 内的 `AdRequest` 参数），请传递[其他设置](https://ads.yandex.com/helpcenter/zh/dev/ios/target-adfox.md)。
- 展示广告：当屏幕上出现设置为 `BannerState` 的 `Banner` 时，加载将开始；加载成功后，广告高度将更新。

## 自适应内联横幅集成说明 {#features}

1. 强烈建议在 `.onAdFailure` 回调中收到错误时不要尝试加载新广告。 如果需要从 `.onAdFailure` 中加载广告，请限制重新加载尝试次数，以避免在网络连接受限的情况下广告请求连续失败。

2. 为确保自适应内联横幅正常运行，请通过 SwiftUI 设置尺寸：使用 `BannerSize.inline(width:maxHeight:)` 和父容器约束（宽度、内边距）。 仅固定外层 `frame` 而不考虑自适应高度可能会导致广告渲染错误。

3. 自适应内联横幅在充分利用可用宽度时效果最佳。 在大多数情况下，这将是设备的屏幕全宽。 确保考虑应用自身的内边距及显示安全区域。

4. 自适应内联横幅适合在可滚动内容中展示。 横幅高度可以与设备屏幕高度相当，也可以被限制为最大高度，具体取决于 API。

5. 在 SwiftUI 中，将 `Banner(state:)` 与 `BannerState(size: .inline(width:maxHeight:), request:)` 用于内联横幅。 `width` 参数是可用的容器宽度，`maxHeight` 是允许的最大广告高度（类似于在 UIKit 中通过 `BannerAdSize.inline(width:maxHeight:)` 计算出的高度）。

6. 对于相同的设备和尺寸参数，生成的广告区域是稳定的：加载后，高度将反映在内部 `Banner` 布局中。

## 创建并展示横幅

要展示横幅广告，请向 SwiftUI 层次结构添加 `Banner(state:)`，并传递尺寸为 `.inline(width:maxHeight:)` 的 `BannerState` 和具有广告 ID 的 `AdRequest`。

建议将 `width` 设置为屏幕宽度或父容器宽度，并考虑内边距和安全区域。

您还需要从 Yandex Advertising Network 界面获取广告单元 ID (adUnitId)。

示例 SwiftUI 屏幕：

```swift
import SwiftUI
import YandexMobileAds

struct InlineBannerView: View {
    @State private var bannerState: BannerState?

    var body: some View {
        VStack {
            if let bannerState {
                Banner(state: bannerState)
                    .onAdLoad { _ in
                        // 广告已成功加载
                    }
                    .onAdFailure { error in
                        // 加载错误
                    }
            }

            Button("Load banner") {
                bannerState = BannerState(
                    size: .inline(width: 320, maxHeight: 320),
                    request: AdRequest(adUnitID: "R-M-XXXXX-YY")
                )
            }
        }
    }
}
```

## 加载广告

当层次结构中出现设置了 `BannerState` 的 `Banner` ，并且分配了新的 `BannerState` 实例时，加载将开始：每次调用 `BannerState(size:request:)` 都会创建新的状态并开始加载。

要接收加载成功或失败的通知，并跟踪点击和展示数据，请使用 `onAdLoad`、`onAdFailure`、`onAdClick`、`onAdImpression` 修饰符。

您可以通过 `AdRequest` 传递用户兴趣数据、页面上下文数据、位置或其他附加数据来扩展广告请求参数。 请求中的附加上下文数据可以显著提高广告质量。 有关更多信息，请参阅[广告定位](https://ads.yandex.com/helpcenter/zh/dev/ios/target.md)。

示例：设置要加载的新 `BannerState`（`.onAdLoad` 在成功加载后调用）：

```swift
struct InlineBannerView: View {
    @State private var bannerState: BannerState?

    func loadAd() {
        bannerState = BannerState(
            size: .inline(width: 320, maxHeight: 320),
            request: AdRequest(adUnitID: "R-M-XXXXX-YY")
        )
    }

    var body: some View {
        VStack {
            if let bannerState {
                Banner(state: bannerState)
                    .onAdLoad { _ in }
                    .onAdFailure { _ in }
            }
            Button("Load", action: loadAd)
        }
    }
}
```

## 展示广告

成功加载后，广告会在 `Banner` 内展示；接收创意后，尺寸将更新。 将 `Banner` 放置在信息流或堆栈的所需位置，例如在 `ScrollView` + `VStack` 中，并设置适当的内边距。

```swift
struct InlineBannerView: View {
    @State private var bannerState: BannerState?

    var body: some View {
        ScrollView {
            VStack {
                // 信息流内容
                Text("Content")

                if let bannerState {
                    Banner(state: bannerState)
                        .onAdLoad { _ in }
                        .onAdFailure { _ in }
                }
            }
            .padding()
        }
    }
}
```

## 测试自适应内联横幅集成 {#test}

### 使用演示版位进行广告测试

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

## 其他资源 {#resources}

* <!-- source: zh/dev/_includes/github-pubdev-links.md -->
  [GitHub](https://github.com/yandexmobile/yandex-ads-sdk-ios/blob/master/Examples/YandexMobileAdsExample/YandexMobileAdsExample/Yandex/Banner/InlineBannerViewController.swift) 链接。
  <!-- endsource: zh/dev/_includes/github-pubdev-links.md -->
