自适应内联横幅(SwiftUI)
自适应内联横幅是一种灵活的横幅广告格式,通过优化每个设备上的广告尺寸,实现最大效率。
这种广告类型允许开发者设置广告的最大允许宽度和高度,但最佳广告尺寸仍然是自动确定的。为了选择最佳广告尺寸,内置自适应横幅使用最大高度而不是固定高度。这为提高广告效果提供了空间。
该格式通常用于基于内容流的应用,或允许以广告为主要关注点的场景。
外观
本指南介绍如何在 iOS 应用中使用 SwiftUI 集成自适应内联横幅。除代码示例外,还包含格式使用建议及其他资源链接。
前提条件
- 请按照 快速入门 中描述的 SDK 集成步骤进行操作。
- 提前 初始化 您的广告 SDK。
- 确保您运行的是最新的 Yandex Mobile Ads SDK 版本。如果您使用聚合,请同时确保您运行的是最新版本的 统一构建。
实施
在 SwiftUI 中集成自适应内联横幅的主要步骤:
- 使用尺寸
BannerSize.inline(width:maxHeight:)与含广告位 ID 的AdRequest创建BannerState。 - 将
Banner(state:)加入视图层次结构并传入该BannerState。 - 通过
.onAdLoad、.onAdFailure修饰符订阅事件,可选.onAdClick、.onAdImpression。 - 若通过 Adfox 投放,请传入其他设置(在
BannerState内的AdRequest参数中)。 - 展示广告:
Banner在屏幕上出现且已设置BannerState时开始加载;加载成功后更新广告高度。
自适应内联横幅集成说明
-
强烈不建议在
.onAdFailure收到错误后立即加载新广告。若必须在此回调中加载,请限制重试次数,以免因网络限制导致连续失败请求。 -
为使自适应内联横幅正确显示,请在 SwiftUI 中通过
BannerSize.inline(width:maxHeight:)与父容器约束(宽度、内边距)设置尺寸。若仅固定外层frame而未考虑自适应高度,可能导致渲染异常。 -
自适应内联横幅宜使用全部可用宽度,多数情况下为设备全屏宽度,请考虑应用内边距与安全区。
-
该格式适合放在可滚动内容中;横幅高度可与屏幕高度一致或由 API 限制最大高度。
-
在 SwiftUI 中,内联横幅使用
Banner(state:)与BannerState(size: .inline(width:maxHeight:), request:)。width为容器可用宽度,maxHeight为允许的最大广告高度(与 UIKit 中通过BannerAdSize.inlineSize(withWidth:maxHeight:)计算类似)。 -
在同一设备与尺寸参数下,加载后的广告区域稳定,高度体现在
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")
)
}
}
}
}
加载广告
当带有已设置 BannerState 的 Banner 出现在视图层级中,或分配新的 BannerState 实例时开始加载:每次调用 BannerState(size:request:) 都会创建新状态并开始加载。
要接收加载成功或失败的通知,以及跟踪点击和展示,请使用 onAdLoad、onAdFailure、onAdClick、onAdImpression 修饰符。
可通过 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。您还可以按类别和错误级别过滤日志。
如果您在集成广告时遇到问题,您将获得有关问题的详细报告以及如何解决这些问题的建议。
其他资源
-
GitHub 链接。