自适应内联横幅(SwiftUI)

自适应内联横幅是一种灵活的横幅广告格式,通过优化每个设备上的广告尺寸,实现最大效率。

这种广告类型允许开发者设置广告的最大允许宽度和高度,但最佳广告尺寸仍然是自动确定的。为了选择最佳广告尺寸,内置自适应横幅使用最大高度而不是固定高度。这为提高广告效果提供了空间。

该格式通常用于基于内容流的应用,或允许以广告为主要关注点的场景。

外观

本指南介绍如何在 iOS 应用中使用 SwiftUI 集成自适应内联横幅。除代码示例外,还包含格式使用建议及其他资源链接。

前提条件

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

实施

在 SwiftUI 中集成自适应内联横幅的主要步骤:

  • 使用尺寸 BannerSize.inline(width:maxHeight:) 与含广告位 ID 的 AdRequest 创建 BannerState
  • Banner(state:) 加入视图层次结构并传入该 BannerState
  • 通过 .onAdLoad.onAdFailure 修饰符订阅事件,可选 .onAdClick.onAdImpression
  • 若通过 Adfox 投放,请传入其他设置(在 BannerState 内的 AdRequest 参数中)。
  • 展示广告:Banner 在屏幕上出现且已设置 BannerState 时开始加载;加载成功后更新广告高度。

自适应内联横幅集成说明

  1. 强烈不建议在 .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.inlineSize(withWidth:maxHeight:) 计算类似)。

  6. 在同一设备与尺寸参数下,加载后的广告区域稳定,高度体现在 Banner 内部布局中。

创建与展示横幅

在 SwiftUI 层次中加入 Banner(state:),并传入尺寸为 .inline(width:maxHeight:)BannerState 以及含广告 ID 的 AdRequest

建议将 width 设为屏幕宽度或父容器宽度,并考虑内边距与安全区。

还需要在 Yandex Advertising Network 中获取的广告位 ID(adUnitId)。

SwiftUI 界面示例:

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("加载横幅") {
                bannerState = BannerState(
                    size: .inline(width: 320, maxHeight: 320),
                    request: AdRequest(adUnitID: "R-M-XXXXX-YY")
                )
            }
        }
    }
}

加载广告

当带有已设置 BannerStateBanner 出现在视图层级中,或分配新的 BannerState 实例时开始加载:每次调用 BannerState(size:request:) 都会创建新状态并开始加载。

要接收加载成功或失败的通知,以及跟踪点击和展示,请使用 onAdLoadonAdFailureonAdClickonAdImpression 修饰符。

可通过 AdRequest 传入用户兴趣、页面上下文、位置等数据扩展请求参数。请求中的额外上下文数据可显著提升广告质量。详见广告定向

示例:设置新的 BannerState 以加载(加载成功后调用 .onAdLoad):

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("加载", action: loadAd)
        }
    }
}

展示广告

加载成功后,广告在 Banner 内展示;收到创意素材后会更新尺寸。将 Banner 放在信息流或堆栈中的合适位置,例如在带适当内边距的 ScrollView + VStack 中。

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

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

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

测试自适应内联横幅集成

使用演示广告位测试

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

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

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

重要

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

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

验证广告集成是否正确

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

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

YMAMobileAds.enableLogging()

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

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

其他资源