# 迁移到 iOS 横幅广告单元 API

> 通过使用广告单元 ID 来加载和显示横幅广告服务，切换到 LevelPlay Banner API。

本指南介绍如何使用广告单元 ID 集成 LevelPlay API 来加载和显示横幅广告服务。

## 先决条件##prerequisites

* 支持的最小 SDK 为 8.6.0。您可以在[此处](/grow/levelplay/sdk/ios/sdk-integration.md)下载最新的 SDK。
* 确保使用 LevelPlay Initialization API 初始化 SDK。
* 在 LevelPlay 后台中找到 AdUnitID。

## 创建横幅广告对象并设置大小##create-banner-ad-object-and-set-size

横幅广告对象的创建应在接收 **onInitSuccess** 回调后完成。

1. **Objective-C**

   ```objective-c
   // 创建横幅视图并设置广告单元 ID
   self.bannerAdView = [[LPMBannerAdView alloc] initWithAdUnitId:@"adUnitId"];
   ```

2. **Swift**

   ```swift
   // 创建横幅视图并设置广告单元 ID
   self.bannerAdView = LPMBannerAdView(adUnitId: "adUnitId")
   ```

### 横幅大小##banner-sizes

| **旧版**                  | **Ad Unit（广告单元）（新）** | **dp 中的尺寸**               |
| ----------------------- | -------------------- | ------------------------- |
| **ISBannerSize**        | **LPMAdSize**        | **（Width X Height）**      |
| ISBannerSize\_BANNER    | bannerSize           | 320 x 50                  |
| ISBannerSize\_LARGE     | largeSize            | 320 x 90                  |
| ISBannerSize\_RECTANGLE | mediumRectangleSize  | 300 x 250                 |
| ISBannerSize\_SMART     | 替换为自适应广告大小（见下文）      | 自动渲染广告服务以调整移动端和平板电脑的大小和方向 |

要创建广告大小，请遵循以下选项之一： 

### 适应屏幕宽度的自适应广告大小（推荐）##adaptive-ad-size-that-adjusts-to-the-screen-width-(recommended)

此选项根据设备类型返回 BANNER 或 LEADERBOARD。支持自适应功能的网络（Google、Yandex）将根据其优化逻辑返回高度。

1. **Objective-C**

   ```objective-c
   LPMAdSize *bannerSize = [LPMAdSize createAdaptiveAdSize];
   [self.bannerAdView setAdSize: bannerSize];
   ```

2. **Swift**

   ```swift
   let bannerSize = LPMAdSize.createAdaptive()
   self.bannerAdView.setAdSize(bannerSize)
   ```

\*\*指定的横幅大小：\*\*此选项允许您设置指定的横幅大小：横幅、大型、中等矩形。

1. **Objective-C**

   ```objective-c
   LPMAdSize *bannerSize = [LPMAdSize largeSize];
   [self.bannerAdView setAdSize: bannerSize];
   ```

2. **Swift**

   ```swift
   let bannerSize = LPMAdSize.large()
   self.bannerAdView.setAdSize(bannerSize)
   ```

## 广告位##placements

我们支持在横幅广告中[放置](/grow/levelplay/platform/settings/placements.md)仅用于举报。应在 **loadAd** 之前设置广告位，以影响所有重新加载的广告服务。

1. **Objective-C**

   ```objective-c
   // 设置放置/位置名称
   [self.bannerAdView setPlacementName:@"PlacementName"];
   ```

2. **Swift**

   ```swift
   // 设置放置/位置名称
   self.bannerAdView.setPlacementName("PlacementName")
   ```

## 设置横幅委托##set-banner-delegates

在代码中实现 **LPMBannerAdViewDelegate** 而不是 **LevelPlayBannerDelegate**，从而了解广告投放情况。 

* 建议在加载横幅广告之前设置委托。
* 每个横幅广告视图都应有自己的委托实现。
* 回调在主线程上运行。

1. **Objective-C**

   ```objective-c
   // 设置委托实现
   [self.bannerAdView setDelegate:self];
   #pragma mark - LPMBannerAdViewDelegate
   - (void)didLoadAdWithAdInfo:(nonnull LPMAdInfo *)adInfo { }
      //广告已成功加载
   }
   - (void)didFailToLoadAdWithAdUnitId：(nonnull NSString *)adUnitId 报错：(nonnull NSError *)报错 {
      // 广告加载失败
   }
   - (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo { }
      // 广告被点击
   }
   - (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo { }
      // 广告已显示并在屏幕上可见
   }
   - (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo 报错：(NSError *)报错 {
      // 广告无法在屏幕上显示
   }
   - (void)didLeaveAppWithAdInfo:(LPMAdInfo *)adInfo { }
      // 用户按下广告后被导航出 app
   }
   - (void)didExpandAdWithAdInfo:(LPMAdInfo *)adInfo { }
      // 广告以全屏打开
   }
   - (void)didCollapseAdWithAdInfo:(LPMAdInfo *)adInfo { }
      // 广告恢复为其原始大小
   }
   ```

2. **Swift**

   ```swift
   // 设置委托实现
   self.bannerAdView.setDelegate(self)
   func didLoadAd（包含 adInfo：LPMAdInfo) {
      //广告已成功加载
   }
   func didFailToLoadAd(withAdUnitId adUnitId：字符串，报错：报错) {
      // 广告加载失败
   }
   func didClickAd（包含 adInfo：LPMAdInfo) {
      // 广告被点击
   }
   func didDisplayAd（包含 adInfo：LPMAdInfo) {
      // 广告已显示并在屏幕上可见
   }
   func didFailToDisplayAd（包含 adInfo：LPMAdInfo，报错：报错) {
      // 广告无法在屏幕上显示
   }
   func didLeaveApp（包含 adInfo：LPMAdInfo) {
      // 用户按下广告后被导航出 app
   }
   func didExpandAd（包含 adInfo：LPMAdInfo) {
      // 广告以全屏打开
   }
   func didCollapseAd（包含 adInfo：LPMAdInfo) {
      // 广告恢复为其原始大小
   }
   ```

### LevelPlay 广告信息##levelplay-ad-info

**LPMAdInfo** 参数包含有关加载的广告的信息。

|    | IronSource 旧版 API             | 广告单元 API                     |
| -- | ----------------------------- | ---------------------------- |
| 委托 | LevelPlayBannerDelegate       | LPMBannerAdViewDelegate      |
| 事件 | didLoad                       | didLoadAdWithAdInfo          |
|    | didFailToLoadWithError        | didFailToLoadAdWithAdUnitId  |
|    | didClickWithAdInfo            | didClickAdWithAdInfo         |
|    | didPresentScreenWithAdInfo    | didExpandAdWithAdInfo        |
|    | didDismissScreenWithAdInfo    | didCollapseAdWithAdInfo      |
|    | didLeaveApplicationWithAdInfo | didLeaveAppWithAdInfo        |
|    | -                             | didDisplayAdWithAdInfo       |
|    | -                             | didFailToDisplayAdWithAdInfo |

## 加载横幅广告##load-banner-ad

要加载横幅广告，请使用 **loadAd** 而不是 **IronSource.loadBanner**。

1. **Objective-C**

   ```objective-c
   // 加载横幅广告
   [self.bannerAdView loadAdWithViewController:self];
   ```

2. **Swift**

   ```swift
   // 加载横幅广告
   self.bannerAdView.loadAd(with: self)
   ```

## 暂停和恢复横幅刷新##pause-and-resume-banner-refresh

如果在平台中定义了刷新值，则可以在代码中暂停横幅刷新。使用以下方法可停止横幅广告的自动刷新，或在暂停后重新启用。 

> **Note:**
>
> 再次显示横幅时，它将完成从暂停时间到刷新的时间。 

* **pauseAutoRefresh** - 暂停横幅广告的自动刷新。
* **resumeAutoRefresh** - 暂停横幅广告后恢复自动刷新。

1. **Objective-C**

   ```objective-c
   // 暂停新
   [self.bannerAdView pauseAutoRefresh];
   // 继续刷新
   [self.bannerAdView resumeAutoRefresh];
   ```

2. **Swift**

   ```swift
   // 暂停新
   self.bannerAdView.pauseAutoRefresh()
   // 继续刷新
   self.bannerAdView.resumeAutoRefresh()
   ```

## 销毁横幅广告##destroy-banner-ad

要销毁横幅，请调用 **destroy** 方法。

已销毁的横幅无法再次显示。要显示更多广告服务，请创建一个新的 **LPMBannerAdView** 对象。

1. **Objective-C**

   ```objective-c
   [self.bannerAdView destroy];
   ```

2. **Swift**

   ```swift
   self.bannerAdView.destroy()
   ```

## 多个广告单元横幅 API##multiple-ad-unit-banner-apis

|              | 旧版                           | 广告单元（新）                  |
| ------------ | ---------------------------- | ------------------------ |
| Banner Ad 视图 | ISBannerView                 | LPMBannerAdView          |
| API          | loadBannerWithViewController | loadAdWithViewController |
|              | loadBannerWithViewController | setPlacementName         |
|              | destroyBanner                | destroy                  |
|              | -                            | LPMAdSize.width          |
|              | -                            | LPMAdSize.height         |
|              | -                            | pauseAutoRefresh         |
|              | -                            | resumeAutoRefresh        |

## 横幅广告服务的完整实现示例##full-implementation-example-of-banner-ads

以下是使用自适应横幅大小创建和加载横幅广告的示例。

1. **Objective-C**

   ```objective-c
   NS_ASSUME_NONNULL_BEGIN
   @interface BannerAdViewController () <LPMBannerAdViewDelegate>
   @property(nonatomic, strong) LPMBannerAdView *bannerAd;
   @end
   @implementation BannerAdViewController
   - (void)dealloc {
   [self.bannerAd destroy];
   }
   - (void)createBannerAd {
   // 创建横幅视图并设置广告单元 ID
   self.bannerAd = [[LPMBannerAdView alloc] initWithAdUnitId:@"adUnitId"];

   // Set the placement name (optional)
   [self.bannerAd setPlacementName:@"PlacementName"];

   // Set the ad size
   LPMAdSize *bannerSize = [self getBannerSize];

   // Required when using adaptive ad size
   if (bannerSize == nil) {
       return;
    }

   [self.bannerAd setAdSize:bannerSize];

   // Set the delegate implementation
   [self.bannerAd setDelegate:self];

   // Add the banner view to the view hierarchy with the proper constraints
   [self addBannerViewWithSize:bannerSize];
   }
   - (LPMAdSize *)getBannerSize {
   // 1.推荐 - 适应屏幕宽度的自适应广告大小
   LPMAdSize *bannerSize = [LPMAdSize createAdaptiveAdSize];
   // 2.使用固定宽度广告大小的自适应广告大小
   // self.bannerSize = [LPMAdSize createAdaptiveAdSizeWithWidth:400];
   // 3.指定的横幅大小 - 横幅、大横幅、中矩形
   // self.bannerSize = [LPMAdSize mediumRectangleSize];

   return bannerSize;
   }
   - (void)loadBannerAd {
   [self.bannerAd loadAdWithViewController:self];
   }
   - (void)addBannerViewWithSize：(LPMAdSize *)bannerSize {
   self.bannerAd.translatesAutoresizingMaskIntoConstraints = NO;

   // Add the banner view to the view hierarchy
   [self.view addSubview:self.bannerAd];
   [NSLayoutConstraint activateConstraints：@[
       [self.bannerAd.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor],
       [self.bannerAd.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
       [self.bannerAd.widthAnchor constraintsEqualToConstant:bannerSize.width]、
       [self.bannerAd.heightAnchor constraintsEqualToConstant:bannerSize.height]
   ]];
   }
   #pragma mark - LPMBannerAdViewDelegate
   - (void)didLoadAdWithAdInfo:(nonnull LPMAdInfo *)adInfo {}
   - (void)didFailToLoadAdWithAdUnitId：(nonnull NSString *)adUnitId 报错：(nonnull NSError *)报错 {
   - (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didFailToDisplayAdWithAdInfo：(LPMAdInfo *)adInfo 报错：(NSError *)报错 {
   - (void)didLeaveAppWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didExpandAdWithAdInfo：(LPMAdInfo *)adInfo {}
   - (void)didCollapseAdWithAdInfo:(LPMAdInfo *)adInfo {}
   @end
   NS_ASSUME_NONNULL_END
   ```

2. **Swift**

   ```swift
   导入 UIKit
   类 BannerAdViewController：UIViewController、LPMBannerAdViewDelegate {
   var bannerAd：LPMBannerAdView!
   deinit {
       self.bannerAd.destroy()
   }
   func createBannerAd() {
       // Create the banner view and set the ad unit id
       self.bannerAd = LPMBannerAdView(adUnitId: "adUnitId")
       
       // Set the placement name (optional)
       self.bannerAd.setPlacementName("PlacementName")
       
       // Set the ad size
       // Null check required when using adaptive ad size
       guard let bannerSize = getBannerSize() else {
           返回
       }
       self.bannerAd.setAdSize(bannerSize)
       
       // Set the delegate implementation
       self.bannerAd.setDelegate(self)
       
       // Add the banner view to the view hierarchy with the proper constraints
       addBannerView(withSize: bannerSize)
   }
   func getBannerSize() -> LPMAdSize? { }
       // 1.推荐 - 适应屏幕宽度的自适应广告大小
       let bannerSize = LPMAdSize.createAdaptive()
       // 2.使用固定宽度广告大小的自适应广告大小
       // bannerSize = LPMAdSize.createAdaptiveAdSize(withWidth:400)
       // 3.指定的横幅大小 - 横幅、大横幅、中矩形
       // bannerSize = LPMAdSize.mediumRectangleSize()
       
       return bannerSize
   }
   func loadBannerAd() {
       self.bannerAd.loadAd(with: self)
   }
   func addBannerView(withSize bannerSize：LPMAdSize) {
       DispatchQueue.main.async {
           self.bannerAd.translatesAutoresizingMaskIntoConstraints = false

           // Add the banner view to the view hierarchy
           self.view.addSubview(self.bannerAd)
           let centerX = self.bannerAd.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)
           let bottom = self.bannerAd.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor)
           let width = self.bannerAd.widthAnchor.constraint(equalToConstant:CGFloat(bannerSize.width))
           let height = self.bannerAd.heightAnchor.constraint(equalToConstant:CGFloat(bannerSize.height))
           NSLayoutConstraint.activate([centerX, bottom, width, height])
       }
   }
   // MARK: - LPMBannerAdViewDelegate
   func didLoadAd（包含 adInfo：LPMAdInfo) {
   func didFailToLoadAd(withAdUnitId adUnitId：字符串，报错：报错) {
   func didClickAd（包含 adInfo：LPMAdInfo) {
   func didDisplayAd（包含 adInfo：LPMAdInfo) {
   func didFailToDisplayAd（包含 adInfo：LPMAdInfo，报错：报错) {
   func didLeaveApp（包含 adInfo：LPMAdInfo) {
   func didExpandAd（包含 adInfo：LPMAdInfo) {
   func didCollapseAd（包含 adInfo：LPMAdInfo) {
   }
   ```

## LevelPlay Mediation 演示应用程序##levelplay-mediation-demo-app

Integration Demo 应用程序演示如何在 app 中集成横幅广告单元 API。

[下载 iOS demo 应用程序](https://github.com/ironsource-mobile/Mediation-Demo-Apps)
