---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/ios/app-open-ad.md
  - https://ads.yandex.com/helpcenter/pt/dev/ios/app-open-ad.md
  - https://ads.yandex.com/helpcenter/ru/dev/ios/app-open-ad.md
  - https://ads.yandex.com/helpcenter/zh/dev/ios/app-open-ad.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/zh/llms.txt

# 开屏广告

<!-- source: zh/dev/_includes/app-open-ad.md -->
应用开屏广告是一种用于通过应用加载界面实现变现的特殊广告格式。此类广告可随时关闭，并设计用于在以下场景中展示：
* 应用启动时。
* 应用被调至前台时。
* 从后台返回应用时。
<!-- endsource: zh/dev/_includes/app-open-ad.md -->

本指南介绍了在打开 iOS 应用时显示广告的集成过程。 除了代码示例和说明之外，它还包含特定格式的建议和其他资源的链接。


## 布局

开屏广告提供 **Go to the app** 按钮，以便用户知道他们正在使用您的应用，并且可以关闭广告。 以下是广告的示例：

<iframe width="200" height="405.5" allow="autoplay" src="https://runtime.strm.yandex.ru/player/video/vplvlddx5n2gyycnvb6g?autoplay=1&mute=0&loop=1" frameborder="0" allowfullscreen></iframe>


## 前提条件 {#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 -->

### 术语和定义

* **冷启动**是指启动一个不在 RAM 中的应用，创建一个新的应用会话。
* **热启动**是指当应用在 RAM 中暂停时，将应用从后台模式切换到前台模式。

## 实施 {#implement}

1. 在应用启动时初始化 SDK。
2. 创建并配置 `AppOpenAdLoader` 广告加载器。
3. 加载广告。
4. 使用 AppDelegate 类方法 `applicationDidBecomeActive(_ application: UIApplication)` 可在应用打开时展示广告。
5. 在展示广告之前，请设置 `AppOpenAd` 回调委托 `AppOpenAdDelegate`。
6. 使用 `show` 方法展示广告。

### 主要步骤

1. 在应用启动时初始化 SDK。

   ```swift
   // 等待 sdk 初始化完成再加载广告
   YandexAds.initializeSDK(completionHandler: completionHandler)
   ```
2. 创建并配置 `AppOpenAdLoader` 广告加载器。

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

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

   ```swift
    private lazy var appOpenAdLoader: AppOpenAdLoader = {
        let loader = AppOpenAdLoader()
        return loader
    }()
   ```
3. 加载广告。

   {% list tabs %}

   - Swift Concurrency

      ```swift
      func loadAd() async {
          // 将 demo-appopenad-yandex 替换为实际广告单元 ID
          let request = AdRequest(adUnitID: "demo-appopenad-yandex")
          do {
              let ad = try await appOpenAdLoader.loadAd(with: request)
              appOpenAd = ad
              appOpenAd?.delegate = self
          } catch {
              // 广告无法加载。 强烈建议不要尝试从此处加载新广告。
          }
      }
      ```

   - Completion handler

      ```swift
      func loadAd() {
          // 将 demo-appopenad-yandex 替换为实际广告单元 ID
          let request = AdRequest(adUnitID: "demo-appopenad-yandex")
          self.appOpenAdLoader.loadAd(with: request) { [weak self] result in
              switch result {
              case .success(let ad):
                  self?.appOpenAd = ad
                  self?.appOpenAd?.delegate = self
              case .failure:
                  // 广告加载失败。 强烈建议不要尝试从此处加载新广告。
                  break
              }
          }
      }
      ```

   {% endlist %}

4. 使用 `AppDelegate` 类方法可在应用激活时展示广告。

   ```swift
   func applicationDidBecomeActive(_ application: UIApplication)
   ```

5. 在展示广告之前，请设置广告回调委托 `AppOpenAdDelegate`。

   ```swift
    extension AppOpenAdController: AppOpenAdDelegate {
        func appOpenAd(_ appOpenAd: AppOpenAd, didFailToShow error: Error) {
            // 广告无法展示时调用。

            // 广告因错误无法展示后加载下一个广告
            loadAd()
        }

        func appOpenAdDidShow(_ appOpenAd: AppOpenAd) {
            // 广告展示时调用。
        }

        func appOpenAdDidDismiss(_ appOpenAd: AppOpenAd) {
            // 广告关闭时调用。

            // 广告关闭后加载下一个广告
            loadAd()
        }

        func appOpenAdDidClick(_ appOpenAd: AppOpenAd) {
            // 记录广告点击时调用。
        }

        func appOpenAd(_ appOpenAd: AppOpenAd, didTrackImpression impressionData: ImpressionData?) {
            // 记录广告展示时调用。
        }
    }
   ```

6. 使用 `show` 方法展示广告。

   ```swift
   self.appOpenAd?.show(from: self)
   ```

   <!-- source: zh/dev/_includes/app-open-ad.md -->
   {% note info %}

   如果广告已经投放，调用 `show(from:)` 方法将在 `AppOpenAdDelegate.appOpenAd(_:didFailToShowError:)`中返回显示错误。

   {% endnote %}
   <!-- endsource: zh/dev/_includes/app-open-ad.md -->

## 开屏广告集成的特性 {#features}

1. 所有 Yandex Mobile Ads SDK 方法调用都必须在主线程中进行。
2. 加载可能需要一段时间，因此如果广告尚未加载，请勿增加冷启动时间。
3. 预加载广告以便后续在热启动期间显示。
4. 我们不建议您在应用启动期间同时加载开屏广告和其他广告格式，因为此时应用可能正在下载运行数据。 这可能会使设备和互联网连接超载，从而导致广告加载时间变长。
5. 如果加载失败（Completion handler 中的 `.failure`，或 Swift Concurrency 中的 `catch`），请不要立即尝试加载新广告。 如果必须这样做，请限制广告重新加载尝试的次数。 这将有助于避免出现限制时持续出现不成功的请求和连接问题。

## 在发布时测试广告集成 {#test}

<!-- source: zh/dev/_includes/test-ios-app-open-ad.md -->
### 使用演示广告单元进行广告测试 {#demo-blocks}

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

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

演示广告单元 ID：`demo-appopenad-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-app-open-ad.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 -->

## 建议

1. 不要在启动画面之前渲染开屏广告。

   通过显示启动画面，您可以增强用户的应用体验，使其更加流畅，令用户愉悦。 这将避免用户感到惊讶或困惑，并确保他们打开了正确的应用。 在同一屏幕上，您可以提醒用户即将展示的广告。 使用加载指示器或简单的文本信息告知用户他们将在广告结束后继续查看应用内容。

2. 如果广告请求与广告渲染之间存在延迟，用户可能会短暂打开您的应用，然后意外地看到与内容无关的广告。 这会对用户体验产生负面影响，因此需要避免。 一种解决方案是在显示主应用内容之前使用启动画面，并从该屏幕开始广告渲染。 如果应用在启动画面后打开一些内容，则最好不要渲染广告。

3. 等到新用户打开应用并使用几次后，再渲染开屏广告。 仅向应用中满足特定条件（例如，通过了特定关卡、打开了特定次数的应用或未参与奖励活动）的用户渲染广告。 不要在用户安装应用后立即渲染广告。

4. 根据应用用户行为调节广告渲染频率。 不要在每次冷/热应用启动时渲染广告。

5. 仅当应用在后台运行一段时间（如 30 秒、2 分钟、15 分钟）后才渲染广告。

6. 确保运行了彻底的测试，因为每款应用都是独特的，并且需要特殊的方法来最大限度地提高收入，而不降低用户留存率或应用使用时长。 用户行为和参与度可能会随着时间的推移而发生变化，因此我们建议定期测试您用于开屏广告的策略。

## 其他资源 {#resources}

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