# iOS 的展示级收入集成

> 使用展示级别收入(ILR) SDK API 将展示级别收入数据集成到数据分析服务平台。

## 先决条件##prerequisites

确保已将 LevelPlay SDK 9.5.0+ 正确集成到应用程序中。请参阅 [iOS SDK 集成](/grow/levelplay/sdk/ios/sdk-integration.md)。

有关展示级别收入 (ILR) SDK 功能和先决条件的更多信息，请参阅[展示级别收入服务器端 API](/grow/levelplay/platform/api/impression-level-revenue-server-side.md)。

## 实现 LPMImpressionDataDelegate##implement-the-lpmimpressiondatadelegate

LevelPlay SDK 会触发回传以通知您显示的广告。LPMImpressionDataDelegate 是一个可选的委托，您可以实现此委托来接收展示数据。此监听器将为您提供有关所有广告单位的信息，并且您可以使用展示量收入来识别不同的广告服务。

要将 ImpressionData 监听器添加到应用程序中，请在初始化 LevelPlay SDK 之前声明监听器以避免任何信息丢失。

1. **Objective-C**

   ```objective-c
   + (void)addImpressionDataDelegate:(id<LPMImpressionDataDelegate>)delegate;
   ```

2. **Swift**

   ```swift
   LevelPlay.添加(_ 委托：任何 LPMImpressionDataDelegate)
   ```

LevelPlay SDK 将通知您的委托与展示数据相关的成功回传：

1. **Objective-C**

   ```objective-c
   - (void)impressionDataDidSucceed：(LPMImpressionData *)impressionData;
   ```

2. **Swift**

   ```swift
   func impressionDataDidSucceed(_ impressionData：LPMImpressionData)
   ```

### 设置印象委托##set-up-the-impression-delegate

实现`LPMImpressionDataDelegate`并通过调用 `setImpressionDataDelegate:` 在每个广告对象上进行设置。在构建广告对象之后以及加载或显示广告对象之前立即分配广告对象，这样就不会错过展示量。每个委托仅接收分配给它的实例的展示。

> **Note:**
>
> 广告对象会弱小地保存展示委托。保持对委托的强引用，否则可能会取消分配并停止接收回调。

#### 插页式视频##interstitial

1. **Objective-C**

   ```objective-c
   self.interstitialAd = [[LPMInterstitialAd alloc] initWithAdUnitId:@"adUnitId"];
   [self.interstitialAd setImpressionDataDelegate:self];

   #pragma mark - LPMImpressionDataDelegate Methods
   - (void)impressionDataDidSucceed:(LPMImpressionData *)impressionData { }
       NSLog(@"Interstitial impressionDataDidSucceed: %@", impressionData);
   }
   ```

2. **Swift**

   ```swift
   self.interstitialAd = LPMInterstitialAd(adUnitId: "adUnitId")
   self.interstitialAd.setImpressionDataDelegate(self)

   // MARK:LPMImpressionDataDelegate
   func impressionDataDidSucceed(_ impressionData：LPMImpressionData) {
       print("Interstitial impressionDataDidSucceed: \(impressionData)")
   }
   ```

#### 奖励视频##rewarded

1. **Objective-C**

   ```objective-c
   self.rewardedAd = [[LPMRewardedAd alloc] initWithAdUnitId:@"adUnitId"];
   [self.rewardedAd setImpressionDataDelegate:self];

   #pragma mark - LPMImpressionDataDelegate Methods
   - (void)impressionDataDidSucceed:(LPMImpressionData *)impressionData { }
       NSLog(@"Rewarded impressionDataDidSucceed: %@", impressionData);
   }
   ```

2. **Swift**

   ```swift
   self.rewardedAd = LPMRewardedAd(adUnitId: "adUnitId")
   self.rewardedAd.setImpressionDataDelegate(self)

   // MARK:LPMImpressionDataDelegate
   func impressionDataDidSucceed(_ impressionData：LPMImpressionData) {
       print("Rewarded impressionDataDidSucceed: \(impressionData)")
   }
   ```

#### 横幅广告##banner

1. **Objective-C**

   ```objective-c
   self.bannerAdView = [[LPMBannerAdView alloc] initWithAdUnitId:@"adUnitId"];
   [self.bannerAdView setImpressionDataDelegate:self];

   #pragma mark - LPMImpressionDataDelegate Methods
   - (void)impressionDataDidSucceed:(LPMImpressionData *)impressionData { }
       NSLog(@"Banner impressionDataDidSucceed: %@", impressionData);
   }
   ```

2. **Swift**

   ```swift
   self.bannerAdView = LPMBannerAdView(adUnitId: "adUnitId")
   self.bannerAdView.setImpressionDataDelegate(self)

   // MARK:LPMImpressionDataDelegate
   func impressionDataDidSucceed(_ impressionData：LPMImpressionData) {
       print("Banner impressionDataDidSucceed: \(impressionData)")
   }
   ```

### 删除展示数据监听器##remove-impression-data-listener

要停止接收广告对象的展示数据，请将`nil`通道给 `setImpressionDataDelegate:`。

1. **Objective-C**

   ```objective-c
   [self.interstitialAd setImpressionDataDelegate:nil];
   [self.rewardedAd setImpressionDataDelegate:nil];
   [self.bannerAdView setImpressionDataDelegate:nil];
   ```

2. **Swift**

   ```swift
   interstitialAd.setImpressionDataDelegate(nil)
   rewardedAd.setImpressionDataDelegate(nil)
   bannerAdView.setImpressionDataDelegate(nil)
   ```

> **Note:**
>
> 从 LevelPlay SDK 7.1.0 版本开始，setImpressionDataDelegate 已弃用并替换为 addImpressionDataDelegate。

## 集成 ILR 数据##integrate-the-ilr-data

实现 LPMImpressionDataDelegate 后，您可以将展示数据发送到您自己的专有 BI 工具和 DWH，或者将其与第三方工具集成。

> **Important:**
>
> 返回的数据可能包括 null 值。确保在分配数据之前添加保护以避免潜在的崩溃。

您可以单独引用每个字段，也可以使用 allData 方法获取所有信息：

1. **Objective-C**

   ```objective-c
   - (void)impressionDataDidSucceed：(LPMImpressionData *)impressionData {
       NSNumber *revenue = impressionData.revenue;
       NSString *ad_network = impressionData.adNetwork;
       NSDictionary *all_data = impressionData.allData;
   }
   ```

2. **Swift**

   ```swift
   func impressionDataDidSucceed(_ impressionData：LPMImpressionData) {
    让收入：Float = impressionData.revenue as?Float ??float0.0 
    让 adNetwork：String = impressionData.adNetwork ?? "unknown"
    let allData:Dictionary = impressionData.allData as?字典<string, any>?? [:]
    }
   ```

以下示例展示了如何将展示级别收入 SDK API 数据与 Google Firebase 数据分析服务集成。您可以按原样使用，或进行任何必要的更改，以便与第三方报告工具或您自己的专有优化工具和数据库集成。

> **Important:**
>
> 确保内部参数不为 null。

1. **Objective-C**

   ```objective-c
   /**
    成功显示广告并记录展示数据时调用 **/
   - (void)impressionDataDidSucceed：(LPMImpressionData *)impressionData {
       NSLog(@"%s", __PRETTY_FUNCTION__);
       [FIRAnalytics logEventWithName:kFIREventAdImpression parameters:@{
                               kFIRParameterAdPlatform:@"LevelPlay",
                               kFIRParameterAdSource:(impressionData.ad_network ?: @"No ad_network",
                               kFIRParameterAdFormat:(impressionData.ad_format ?: @"No ad_format"),
                               kFIRParameterAdUnitName:(impressionData.instance_name ?: @"No instance_name"),
                               kFIRParameterCurrency:@"USD",
                               kFIRParameterValue:(impressionData.revenue ?: @0)
                           }];
   }
   ```

2. **Swift**

   ```swift
   /**
    成功显示广告并记录展示数据时调用 **/ 
   func impressionDataDidSucceed(_ impressionData：LPMImpressionData) {
     print("\(#function)")
     Analytics.logEvent(
        AnalyticsEventAdImpression、
        参数：[
        AnalyticsParameterAdPlatform:"LevelPlay",
        AnalyticsParameterAdSource: impressionData.ad_network ??“No ad_network”，
        AnalyticsParameterAdFormat: impressionData.ad_format ??"No ad_format",
        AnalyticsParameterAdUnitName: impressionData.instance_name ??"No instance_name",
        AnalyticsParameterCurrency："USD",
        AnalyticsParameterValue: impressionData.revenue ??0,
      ])
   }
   ```
