自适应粘性横幅 (SwiftUI)

自适应固定横幅广告是一种小型广告,会自动更新,并显示在应用屏幕的顶部或底部。它不会遮挡主要内容,常用于游戏应用中。

自适应固定横幅广告会针对每台设备优化广告尺寸,从而实现最佳效果。借助这种广告类型,开发者可设置广告允许的最大宽度,系统将自动确定最佳广告尺寸。

外观

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

前提条件

  1. 请按照 快速入门 中描述的 SDK 集成步骤进行操作。
  2. 提前 初始化 您的广告 SDK。
  3. 确保您运行的是最新的 Yandex Mobile Ads SDK 版本。如果您使用聚合,请同时确保您运行的是最新版本的 统一构建。

实施

在 SwiftUI 中集成自适应粘性横幅的关键步骤:

  • 创建尺寸为 BannerSize.sticky(width:) 的 BannerState(默认情况下,宽度取自容器),以及具有广告单元 ID 的 AdRequest。
  • 将 Banner(state:) 添加到视图层次结构中,并传递 BannerState。
  • 通过 .onAdLoad、.onAdFailure 修饰符订阅事件,并且可选择通过 .onAdClick、.onAdImpression 订阅事件。
  • 如果您通过 Adfox 工作(通过 BannerState 内的 AdRequest 参数),请传递其他设置。
  • 使用 SwiftUI 工具将横幅定位到屏幕的所需区域(例如,在 VStack 底部,通过 safeAreaInset、overlay)。

自适应粘性横幅集成说明

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

  2. 为确保自适应粘性横幅正常运行,请通过 BannerSize.sticky(width:) 和父容器约束设置宽度。 不正确的尺寸固定可能会导致广告渲染错误。

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

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

  5. 在 SwiftUI 中,将 Banner(state:) 与 BannerState(size: .sticky(width:), request:) 用于粘性横幅。 如果使用 width: nil,宽度将被限制为容器宽度(类似于在 UIKit 中通过 BannerAdSize.sticky(containerWidth:) 计算出的宽度)。

  6. 对于相同的设备和宽度,加载后生成的广告区域保持稳定。

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

创建并展示横幅

要展示横幅广告,请添加 Banner(state:),并传递尺寸为 .sticky(...) 的 BannerState 和 AdRequest。

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

示例 SwiftUI 屏幕:

import SwiftUI
import YandexMobileAds

struct StickyBannerView: 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: .sticky(),
                    request: AdRequest(adUnitID: "R-M-XXXXX-YY")
                )
            }
        }
    }
}

加载广告

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

要接收广告加载成功或失败的通知,并跟踪生命周期事件,请使用 onAdLoad、onAdFailure 和其他修饰符。

您可以通过 AdRequest 传递用户兴趣数据、页面上下文数据、位置或其他附加数据来扩展广告请求参数。 请求中的附加上下文数据可以显著提高广告质量。 有关更多信息,请参阅广告定位。

以下示例展示了如何启动自适应粘性横幅的加载。 加载成功后,将调用 .onAdLoad:

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

    func loadAd() {
        bannerState = BannerState(
            size: .sticky(),
            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 放置在界面的所需位置。 在 SwiftUI 中,可能如下:

  • 布局中的固定位置 — VStack,横幅位于底部或顶部,Spacer() 用于将其推到边缘。
  • SwiftUI 工具 — safeAreaInset(edge: .bottom)、overlay(alignment:) 等。

在 UIKit 中,原生视图提供了 displayAtTop(in:) 和 displayAtBottom(in:) 方法。 在 SwiftUI 中,要实现同样的行为,需要将 Banner 放置在层次结构中(例如,位于根 ZStack 或 VStack 底部、内容上方的横幅)。

示例:位于屏幕底部、内容上方的横幅:

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

    var body: some View {
        ZStack(alignment: .bottom) {
            ScrollView {
                Text("Content")
            }
            if let bannerState {
                Banner(state: bannerState)
                    .onAdLoad { _ in }
                    .onAdFailure { _ in }
            }
        }
    }
}

测试自适应粘性横幅集成

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

我们建议使用测试广告来测试您的广告集成和应用本身。

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

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

重要

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

您可以在 用于测试的演示广告单元 部分找到可用的演示广告版位 ID 列表。

验证广告集成的正确性

您可以使用本机控制台工具测试广告集成。

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

YMAMobileAds.enableLogging()

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

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

其他资源