# iOS 的高级设置

> 为 iOS 配置高级设置，包括用户细分段、自定义参数和价格下限，以优化广告投放和 Monetization。

## 定义细分段##define-segments

现在可以自定义广告服务方式以适应指定的受众！您需要将用户的详细信息告知我们的服务器，以便 SDK 知道根据用户所属的细分段提供广告服务。

LevelPlay 平台支持三种将数据传输到服务器以概括用户细分段的方法，即：

* **自定义细分段**：您可以创建具有预定义条件的自定义细分段，而无需将用户详细信息传递给我们的服务器，并在 LevelPlay 平台上为该用户细分段定制广告设置
* **用户属性**：SDK 未收集的用户数据（例如级别、付款状态或创建日期）必须通过 API 进行中继。（请参阅受支持的细分段属性的完整列表以及下一部分中的描述）。按照说明向我们发送这些详细信息，以便我们的 SDK 可以将相关广告设置应用于您在 LevelPlay 平台上定义的细分段
* **设备属性**：LevelPlay SDK 自动收集与用户设备相关的某些标准参数，例如设备模型、设备制造商、app 版本和操作系统。您无需将此数据传递给我们

您可以使用 **LPMSegment** API 在会话期间更改细分。这将影响下一个加载的广告，并可在加载每个广告单元之前调用，以动态影响瀑布流。您可以在[此处](/grow/levelplay/platform/settings/segments.md)了解有关 LevelPlay 细分的更多信息。

### 通道用户属性##pass-user-properties

在 LevelPlay 平台上定义细分段后，应将用户的详细信息告知我们的服务器。LevelPlay 提供了一范围标准用户属性，您可以将其设置为将用户属性 API 中的细分段。

首先，初始化细分段：

1. **Objective-C**

   ```objective-c
   LPMSegment *segment = [[LPMSegment alloc]init];
   ```

2. **Swift**

   ```swift
   字母细分段：LPMSegment = LPMSegment()
   ```

定义要发送到服务器的属性（这些属性是细分段底部的基础）。 您可以通过以下方法之**一**传输此信息：

1. 如果您熟悉用户所属的细分段，请输入细分段名称：

   1. **Objective-C**

      ```objective-c
      [segment setSegmentName:YOUR_SEGMENT_NAME];
      ```

   2. **Swift**

      ```swift
      segment.segmentName = "YOUR_SEGMENT_NAME"
      ```

2. 向我们发送用户详细信息。请参阅下表以了解描述。

   1. **Objective-C**

      ```objective-c
      // 设置用户等级
      [segment setLevel:USER_LEVEL];
      // 设置用户的付费状态
      [segment setPaying:USER_PAYING];
      // 设置用户的总 In-app Purchase 历史记录
      [segment setIapTotal:YOUR_IAP_TOTAL];
      // 设置用户创建日期
      [segment setUserCreationDate:YOUR_DATE];
      ```

   2. **Swift**

      ```swift
      // 设置用户的app内购总额
      segment.iapTotal = USER_IAP_TOTAL
      // 设置用户的级别
      segment.level = USER_LEVEL
      // 设置用户的付费状态
      segment.paying = USER_PAYING_STATUS
      // 设置用户创建日期
      segment.userCreationDate = NSDate() as Date!
      ```

   此外，每个细分段最多可以设置 5 个自定义用户属性：

   1. **Objective-C**

      ```objective-c
      [segment setCustomValue:YOUR_CUSTOM_VALUE forKey:YOUR_CUSTOM_KEY];
      ```

   2. **Swift**

      ```swift
      segment.setCustomValue("CUSTOM_VALUE", forKey:"CUSTOM_KEY")
      ```

   接下来，要根据细分段投放广告单位，请调用以下函数，并使用细分段名称或用户属性完成：

   1. **Objective-C**

      ```objective-c
      [LevelPlay setSegment:YOUR_SEGMENT];
      ```

   2. **Swift**

      ```swift
      LevelPlay.setSegment(YOUR_SEGMENT);
      ```

### 支持的细分段属性##supported-segment-properties

| **细分段属性**        | **类型**                  | **限制**                                       | **描述**                                                            |
| ---------------- | ----------------------- | -------------------------------------------- | ----------------------------------------------------------------- |
| segmentName      | 字符串                     | - 字母数字 - 最多 32 个字母                           | LevelPlay 帐户中细分段的给定名称                                             |
| 付款               | 布尔值                     | 是或否                                          | - 如果用户在 app 内购买上花费了任何资金，则为 true - 如果用户在 app 内购买上没有花费任何资金，则为 false |
| iap\_total       | 双倍                      | 1-999999.99                                  | 用户在 app 内购买方面花费的总金额                                               |
| userCreationDate | NSDate                  | 不能小于 0                                       | 用户安装 app 的日期                                                      |
| 自定义参数            | key=string、value=string | - LevelPlay 最多支持 5 个自定义参数 - 字母数字 - 最多 32 个字母 | 要发送到我们服务器的任何其他数据                                                  |

### 获取用户的细分段名称##obtainthe-user's-segment-name

1. 在类中采用此接口以符合细分段名称协议并启用细分段名称`LPMSegmentDelegate`的接收

2. 注册到以下委托以接收用户所属的细分段名称。然后，SDK 会将事件通知您的委托。

   1. **Objective-C**

      ```objective-c
      [LevelPlay setSegmentDelegate:self];
      ```

   2. **Swift**

      ```swift
      LevelPlay.setSegmentDelegate(self)
      ```

   实现委托回调。例如：

   1. **Objective-C**

      ```objective-c
      - (void)didReceiveSegment:(NSString *)segment;
      ```

   2. **Swift**

      ```swift
      func didReceiveSegment(_ segment:字符串！)
      ```

## 奖励服务器到服务器回调的自定义参数##custom-parameters-for-rewarded-server-to-server-callbacks

从 LevelPlay SDK 8.11.0 开始，可以为在服务器到服务器 (S2S) 回调中发送到服务器的奖励广告单位通道自定义参数。使用具有键`LevelPlay_Rewarded_Server_Params`和 JSON 字符串值的`setMetaData`设置参数。

* 自定义参数仅与**服务器到服务器**完成回调结合使用。您将在回调中接收参数。
* 您可以插入多个自定义参数。

**示例：**

1. **Objective-C**

   ```objective-c
   NSDictionary *params = @{ @"key1": @"value1", @"key2": @"value2" };
   NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
   NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
   [LevelPlay setMetaDataWithKey:@"LevelPlay_Rewarded_Server_Params" value:jsonString];
   ```

2. **Swift**

   ```swift
   let params = ["key1": "value1", "key2": "value2"]
   if let jsonData = try？JSONSerialization.data(withJSONObject: params),
      let jsonString = String(data: jsonData, encoding: .utf8) {
       LevelPlay.setMetaData(withKey:"LevelPlay_Rewarded_Server_Params", value: jsonString)
   }
   ```

## 价格地面配置##price-floor-configuration

地面配置 API 允许您为指定的广告单元设置价格地面。通过为每个用户设置价格地面，可以提高定向投放效率、减少延迟并优化广告效果。在创建广告对象时，必须分配价格地面，并应用于该对象的所有后续加载。

> **Note:**
>
> 此功能的最低 SDK 版本为 8.9.0。

| 属性   | 类型     | 描述                             |
| ---- | ------ | ------------------------------ |
| 投标地面 | double | 定义应用于传统实例和出价者的最小 eCPM 的价格（美元）。 |

### 插页式广告示例##interstitial-ads-example

1. **Objective-C**

   ```objective-c
   // 定义价格地面配置
   LPMInterstitialAdConfig *adConfig = [[[LPMInterstitialAdConfigBuilder new] setBidFloor:1.23] 构建 // 以美元设置价格地面
   // 将配置应用于插页式广告单元
   LPMInterstitialAd *interstitialAd = [[LPMInterstitialAd alloc] initWithAdUnitId:@"adUnitId" config:adConfig];
   ```

2. **Swift**

   ```swift
   // 定义价格地面配置
   let adConfig = LPMInterstitialAdConfigBuilder()
       .set(bidFloor：1.23) // 以美元设置价格地面
       .build()
   // 将配置应用于插页式广告单元
   let interstitialAd = LPMInterstitialAd(adUnitId："adUnitId", config: adConfig)
   ```

[此处](/grow/levelplay/sdk/ios/interstitial-integration.md)提供了完整的插补实现。

### 奖励广告服务示例##rewarded-ads-example

1. **Objective-C**

   ```objective-c
   // 定义价格地面配置
   LPMRewardedAdConfig *adConfig = [[[LPMRewardedAdConfigBuilder new] setBidFloor:1.23] 构建 // 以美元设置价格地面
   // 将配置应用于奖励广告单元
   LPMRewardedAd *rewardedAd = [[LPMRewardedAd alloc] initWithAdUnitId:@"adUnitId" config:adConfig];
   ```

2. **Swift**

   ```swift
   // 定义价格地面配置
   let adConfig = LPMRewardedAdConfigBuilder()
       .set(bidFloor：1.23) // 以美元设置价格地面
       .build()
   // 将配置应用于奖励广告单元
   let rewardAd = LPMRewardedAd(adUnitId："adUnitId", config: adConfig)
   ```

[此处](/grow/levelplay/sdk/ios/rewarded-ads-integration.md)提供完整的奖励广告服务。

### 横幅广告服务示例##banner-ads-example

1. **Objective-C**

   ```objective-c
   // 定义价格地面配置
   LPMBannerAdViewConfig *adConfig = [[[LPMBannerAdViewConfigBuilder new] setBidFloor:1.23] 构建 // 以美元设置价格下地面
   // 将配置应用于横幅广告单元
   LPMBannerAdView *bannerAd = [[LPMBannerAdView alloc] initWithAdUnitId:@"adUnitId" config:adConfig];
   ```

2. **Swift**

   ```swift
   // 定义价格地面配置
   let adConfig = LPMBannerAdViewConfigBuilder()
       .set(bidFloor：1.23) // 以美元设置价格地面
       .build()
   // 将配置应用于横幅广告单元
   let bannerAd = LPMBannerAdView(adUnitId: "adUnitId", config: adConfig)
   ```

[此处](/grow/levelplay/sdk/ios/banner-integration.md)提供了完整的横幅广告服务。

## LevelPlay SDK 报错代码##levelplay-sdk-error-codes

LevelPlay 提供了报错机制，用于解释 SDK 集成中的任何失败。当出现问题或集成的一个方面未正确完成时，您将收到这些错误。

LevelPlay 报错对象包含**报错代码**和**消息**。以下是所有可能的错误及其基于其函数的消息：

| 错误代码 | 广告单元         | 描述                                                                                         |
| ---- | ------------ | ------------------------------------------------------------------------------------------ |
| 508  | 不适用          | * 聚合/网络初始化失败
* 在非 Demand Only 模式下调用 Demand Only API
* 在 Demand Only 模式下调用非 Demand Only API |
| 509  | 插页式、奖励视频     | **显示失败**：无广告服务展示                                                                           |
| 510  | 插页式、奖励视频、横幅  | **加载失败**：服务器响应失败                                                                           |
| 520  | 插页式、奖励视频     | **显示失败**：无互联网连接；已启用 ShouldTrackNetworkState&#xA;**显示失败**：无互联网连接                            |
| 524  | 插页式、奖励视频     | **显示失败**：放置/位置 %@ 已达到每个节奏定义的限制&#xA;**显示失败**：放置/位置 %@ 已达到其上限                                |
| 526  | 插页式、奖励视频     | **显示失败**：广告单元已达到每个会话的每日上限                                                                  |
| 604  | 横幅           | 无法加载，因为放置/位置已覆盖                                                                            |
| 605  | 横幅           | 加载横幅时出现意外异常                                                                                |
| 606  | 横幅           | 第一次加载时不在所有网络上填充横幅                                                                          |
| 1007 | 插页式、奖励视频     | **Auction Fail**：拍卖请求未包含所有必需信息                                                             |
| 1022 | 奖励视频         | **显示失败**：无法显示另一个 RV 时显示另一个 RV                                                              |
| 1023 | 奖励视频         | **显示失败**：在没有可用的广告服务可供显示时显示调用的 RV                                                           |
| 1035 | Interstitial | **空瀑布**                                                                                    |
| 1036 | 间隙           | **显示失败**：显示另一个间隙时无法显示间隙                                                                    |
| 1037 | 间隙           | **加载失败**：显示另一个间隙时无法加载另一个间隙                                                                 |
| 1039 | 间隙           | 调用 show interstitial                                                                       |
