> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kontext.so/llms.txt
> Use this file to discover all available pages before exploring further.

# 广告生命周期

> 请求、加载或拒绝、展示、结束。SDK 为你持有什么、何时放手，以及你要实现的那一个回调。

每个广告都经历同样的阶段，每个阶段就是一次调用。SDK 为每种格式最多持有一个未展示的广告，所以你可以提前请求、保留它，并在时机到来时展示。

![format()、load()、show()、didEnd 依次排列；reject() 和展示前结束为旁路](https://mintcdn.com/kontext/a1TZynXEvVvAGivH/images/video/lifecycle-zh.svg?fit=max\&auto=format\&n=a1TZynXEvVvAGivH\&q=85\&s=e2853a709e83bd2f4d04b6b27872902a)

## 1. 请求

`format()` 向服务器请求一个广告并返回它。它唯一的参数是你要的格式：`.overlay`、`.pause` 或 `.linear`。在剧集打开时请求，而不是等到你想展示广告的那一刻。

* **每种格式一个未展示的广告。** 对同一格式再次调用 `format()` 返回同一个广告，直到它被展示、拒绝或丢弃。
* **无填充是正常的。** 服务器没有广告时 `format()` 抛出 `noFill(reason:)`。SDK 从不自行重试；在你的下一个时刻再问。原因列在 [API 参考](https://docs.kontext.so/zh/video/sdk/swift/api.md#videoaderror-nofillreason)中。

## 2. 加载或拒绝

* `load()` 在屏幕外渲染素材，就绪后返回：图片已可绘制，视频已缓冲第一帧。加载不触发任何计费事件。再次调用立即返回；两次并发调用共享一次加载。
* `reject()` 告诉服务器你不会使用这个广告，无论是否已加载。服务器告知广告主。

## 3. 展示

`show()` 要么抛错（什么都没发生），要么广告已在屏幕上。从那一刻起，无论你如何处理自己的引用，SDK 都持有该广告、计数曝光、追踪之后的每个事件并测量可见性。

* **整个应用同一时间只有一个广告在屏幕上。** 第二次 `show()` 抛出 `anotherAdShowing`，该广告保持就绪。
* **一个广告只展示一次。** 对同一个广告再次调用 `show()` 会抛出 `alreadyShown`；请求下一个。
* **视图很重要。** 叠加和暂停广告放进内容播放所在的视图；SDK 按它定尺寸，宁可抛出 `containerTooSmall` 也不绘制无法辨认的素材。

## 4. 屏幕上

广告在屏幕上时，SDK 替你运行它，并把发生的事告诉你的代理：曝光计数时、每次点击广告时，以及素材损坏时的失败。`show()` 之前什么都不会到达，在广告结束之前你无需做任何事。

## 5. 结束

每个已展示的广告恰好一次 `didEnd(reason)`，无论是谁结束了它。把恢复逻辑放在这里，别处不放。叠加和暂停广告同步执行，即使结束来自你自己的 `dismiss()` 或 `destroy()` 调用；线性广告在全屏关闭动画结束后执行，所以在其中呈现你的下一个页面是安全的。原因说明是谁结束了它；全部原因见 [API 参考](https://docs.kontext.so/zh/video/sdk/swift/api.md#videoad-endreason)。

## 过期

每个广告都有服务器设定的有效期。过期后，`load()` 和 `show()` 抛出 `invalidated(.expired)`，下一次 `format()` 返回新的广告；已经在屏幕上的广告永远不受影响。

## 销毁

观众离开视频时调用 `ads.destroy()`。所有持有的广告被丢弃并告知广告主未使用，屏幕上的广告以 `didEnd(.destroyed)` 结束，WebView 被释放，进行中的请求或加载抛出 `destroyed`。

## 下一步

> **[定向](https://docs.kontext.so/zh/video/concepts/targeting.md)**
>
> 发送什么，让广告与剧集和观众相匹配。

> **[展示第一个广告](https://docs.kontext.so/zh/video/sdk/swift/first-ad.md)**
>
> 用代码走一遍生命周期，十分钟。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.