# Flutter 插件集成

> 将 LevelPlay SDK 集成到 Flutter 应用程序中，以便在 Android 和 iOS 平台上启用广告聚合和 Monetization。

## 先决条件##prerequisites

* 适用于 Android 和 iOS 的 SDK 版本 7.2.1.2 支持 Flutter 插件。
* 支持 Flutter 3.0.0+

## 向项目添加 LevelPlay Mediation 插件##add-the-levelplay-mediation-plug-in-to-your-project

### Pub.dev 集成##pub.dev-integration

可使用 pub.dev 接口将 LevelPlay Flutter 插件添加到项目中。

1. 运行 Flutter CLI 命令

   ```shell
   flutter pub get Unity_levelplay_mediation
   ```

2. 通过将 `unity_levelplay_mediation` 定义添加到 pubspec.yaml 文件来更新 pubspec.yaml 文件。

   ```yaml
   依赖项：
     flutter：
       sdk: flutter
      unity_levelplay_mediation: '>=9.1.0 <9.2.0'
   ```

3. 添加 Ad 品质 SDK

> **Note:**
>
> 从 Flutter 插件版本 3.1.1 开始，广告品质是 LevelPlay SDK 的一部分，并在实现 LevelPlay 时自动初始化。对于未集成 LevelPlay 的构建或 3.1.1 之前的 Flutter 插件版本，请使用以下[手动集成](#manual-integration)步骤。

1. **Android**

   ```groovy
   dependencies {
       implementation 'com.unity3d.ads-mediation:adquality-sdk:9.3.1'
   }
   ```

2. **iOS**

   ```ruby
   pod 'IronSourceAdQualitySDK','9.3.1'

   ```

### 手动集成##manual-integration

[下载 Flutter 插件版本](https://pub.dev/packages/ironsource_mediation/)

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

Integration Demo 应用程序演示如何在 app 中集成 ironSource LevelPlay

[下载 Flutter Demo 应用程序](https://github.com/ironsource-mobile/Flutter-SDK/tree/master/example)

## iOS 的其他设置##additional-settings-for-ios

### SKAdNetwork 支持##skadnetwork-support

要在使用 SDK 7+ 启用 Ironsource 网络广告服务的显示，请确保在app属性列表文件 (Info.plist) 中包含 Ironsource ad network ID。

1. 在 Xcode 中的项目导航器中选择 **Info.plist**。
2. 选择属性列表编辑器中某个键旁边的**添加按钮 (+)**，然后按 **Return**。
3. 键入键名称 **SKAdNetworkItems**。
4. 在对话框的 **Type** 列中，选择 **Array**。
5. 创建字典项和相应的单个蛰伏项。
6. 输入键名称 **SKAdNetworkIdentifier** 和键值：

   ```xml
   su67r6k2v3.skadnetwork
   ```

   还可以使用以下代码向 Info.plist 添加`SKAdNetworkIdentifier`：

```xml
<key>SKAdNetworkItems</key>
<array>
   <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>su67r6k2v3.skadnetwork</string>
   </dict>
</array>
```

使用 ironSource [SKAdNetwork IDs Manager](/grow/levelplay/sdk/flutter/skadnetwork-id-manager.md) 可创建代码片段以支持 ironSource 网络和聚合网络 ID。

如需了解编辑属性列表的更多信息，请参阅 [Xcode 文档](https://help.apple.com/xcode/mac/current/#/dev3f399a2a6)。

### 通用 SKAN 报告##universal-skan-reporting

要接收广告应用的所有需求来源的获胜安装验证回传副本，请在应用的 Info.plist 中添加 [NSAdvertisingAttributionReportEndpoint](https://developer.apple.com/documentation/bundleresources/information_property_list/nsadvertisingattributionreportendpoint) 密钥。

1. 在 Xcode 中的项目导航器中选择 Info.plist
2. 选择属性列表编辑器中某个关键点旁边的添加按钮 (+)，然后按 Return
3. 键入键名称 [NSAdvertisingAttributionReportEndpoint](https://developer.apple.com/documentation/bundleresources/information_property_list/nsadvertisingattributionreportendpoint)
4. 从 Type 列的弹出菜单中选择字符串
5. 键入网址：`https://postbacks-is.com/`

### app 传输安全设置##app-transport-security-settings

为了确保在所有聚合网络中不间断地支持广告投放，必须在`info.plist`中进行以下更改：

* 添加一个名为 `NSAppTransportSecurity` 的字典。确保在 **Top Level Key** 上添加此字典。
* 在此字典中，添加一个名为 `NSAllowsArbitraryLoads` 的布尔值，并将其设置为 **YES**。
* 确保 info.plist 不包含除 `NSAllowsArbitraryLoads` 之外的任何其他异常，因为这可能会产生冲突。
* 在 [Apple 文档](https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33)中查找有关苯丙胺类兴奋剂的更多信息。

## Android 的其他设置##additional-setup-for-android

### 播放服务依赖项##play-services-dependencies

将 播放 服务 Dependencies 添加到app程序级别的 构建，如下所示：

```groovy
dependencies {
   implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0'
   implementation 'com.google.android.gms:play-services-appset:16.1.0'
}
```

#### Android 12 支持##android-12-support

将目标 API 级别更新为 31（Android 12）的应用程序需要在清单文件中声明 Google 播放服务的正常权限，如下所示：

```xml
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
```

在[此处](https://support.google.com/googleplay/android-developer/answer/6048248)阅读有关 Google 广告 ID 更改的更多信息。

#### 替换 AndroidManifest.xml 上的标签##replace-label-on-androidmanifest.xml

要防止 AndroidManifest 上出现与标签相关的报错，请执行以下操作：

* 将“xmls:tools”添加到项目的 AndroidManifest.xml
* 在“application”标签中添加“tools:replace=”Android”

## 初始化 LevelPlay SDK##initialize-levelplay-sdk

要初始化 LevelPlay SDK，请执行以下步骤：

### LevelPlay SDK 8.6.0 及更高版本##levelplay-sdk-8.6.0-and-later

1. 实现初始化成功和失败的回调。

2. 定义要在会话中初始化的广告格式列表。

3. 使用 `LevelPlayInitRequest.builder` 创建初始化请求。构建器接收以下参数：

   * 您的 appKey（必填）
   * 用户 ID（可选：如果使用服务器到服务器回调或使用广告品质用户旅程，则需要此 ID）

4. 调用 LevelPlay.init 并通道上下文和初始化请求。

```java
class MyLevelPlayInitListener implements LevelPlayInitListener {
    @override
    void onInitFailed(LevelPlayInitError error) {
	      // Provided when init is failed
    }
    @override
    void onInitSuccess(LevelPlayConfiguration configuration) {
	      // Provided when init is successfully executed
    }
}
LevelPlayInitRequest initRequest = LevelPlayInitRequest.builder([app_KEY])
                .withUserId("userId") // required for server-to-server callbacks or Ad Quality user journey (optional otherwise)
                .build();
LevelPlay.init(initRequest, MyLevelPlayInitListener());
```

### LevelPlay SDK 8.6.0 之前的版本##levelplay-sdk-before-8.6.0

1. 实现初始化成功和失败的回调。
2. 定义需要旧版 LevelPlay API 支持的广告格式列表。这应包括奖励。
3. 使用 appKey、广告格式和用户 ID（如果相关）调用 LevelPlay.init API。

如果要使用服务器到服务器回调来奖励用户或使用广告品质用户旅程，请将用户 ID 添加为初始化 API 的一部分。

```java
class MyLevelPlayInitListener implements LevelPlayInitListener {
  @override
  void onInitFailed(LevelPlayInitError error) {
	// Provided when init is failed
  }
  @override
  void onInitSuccess(LevelPlayConfiguration configuration) {
	// Provided when init is successfully executed
  }
}
// Init the SDK when implementing the Multiple Ad Units Interstitial and Banner APIs, and Rewarded using legacy APIs  
List<AdFormat> legacyAdFormats = [AdFormat.REWARDED];
LevelPlayInitRequest initRequest = LevelPlayInitRequest.builder([app_KEY])
                .withLegacyAdFormats(legacyAdFormats)
                .withUserId("userId") // required for server-to-server callbacks or Ad Quality user journey (optional otherwise)
                .build();
LevelPlay.init(initRequest, MyLevelPlayInitListener());
```

### LevelPlay 初始化监听器##levelplay-init-listeners

* `onInitSuccess`：在 init 成功完成并可以加载广告服务时触发。
* `onInitFailed`：未成功接收配置，无法加载广告服务。建议的最佳做法是稍后尝试并初始化 LevelPlay SDK。

请考虑以下最佳实践：

* 在初始化 API 之前调用的所有 API 均未更改，在功能和语法方面应保持原样。这包括[高级设置](/grow/levelplay/sdk/unity/additional-settings.md)、[监管设置](/grow/levelplay/sdk/unity/regulation-advanced-settings.md)或与指定广告格式相关的其他 API
* 如果初始化失败，可以尝试再次初始化 SDK。只有在初始化过程成功之后，才能加载广告服务。

## 验证您的集成##verify-your-integration

使用 LevelPlay 集成测试套件可以测试app程序的集成情况，验证平台设置，并审查与配置的网络相关的广告服务。

要在 app 中启用测试套件，请在设置 init 之前调用 setMetaData API：

```java
LevelPlay.setMetaData({'is_test_suite': ['enable']});
```

聚合初始化成功完成后，通过调用以下方法启动测试套件（需要应用程序上下文）：

```java
LevelPlay.launchTestSuite();
```

有关 LevelPlay 集成测试套件的更多详细信息和实现示例，请导航到本[文章](/grow/levelplay/sdk/flutter/integration-test-suite.md)。

### 适配器调试##adapters-debug

调用以下 API 启用聚合网络适配器和 SDK 的调试日志：

```java
LevelPlay.setAdaptersDebug(true);
```

### 仅适用于 Proguard 用户##for-proguard-users-only

如果将 ProGuard 与 LevelPlay SDK 结合使用，必须将以下代码添加到 ProGuard 文件（Android Studio：proguard-rules.pro 或 Eclipse：proguard-项目.txt）：

```java
-keepclassmembers class com.ironsource.sdk.controller.IronSourceWebView$JSInterface {
    public *;
}
-keepclassmembers 类 * 实现 Android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
- 保留 public 类 com.google.android.gms.广告服务。** {
   public *;
}
- keep 类 com. ironsource.adapters。** { *;
}
- 保留 com. ironsource. unity.androidbridge 类。** { *;
}
-dontwarn com. ironsource.mediationsdk。**
-dontwarn com. ironsource.adapters。**
-keepattributes JavascriptInterface
-keepclassmembers 类 * {
    @android.webkit.JavascriptInterface <methods>;
}
```

## 后续步骤##next-steps

1. 按照我们的集成指南来实现广告格式
   * [奖励视频](/grow/levelplay/sdk/flutter/rewarded-ads-integration.md)
   * [插页式视频](/grow/levelplay/sdk/flutter/interstitial-integration.md)
   * [横幅广告](/grow/levelplay/sdk/flutter/banner-integration.md)
   * [原生广告服务](/grow/levelplay/sdk/flutter/native-ads-integration.md)
2. 在您的 app 中集成奖励视频、插页式或横幅广告服务，并关注我们的[聚合文章](/grow/levelplay/sdk/flutter/mediation-networks.md)。
3. 验证您与我们的[集成测试套件](/grow/levelplay/sdk/flutter/integration-test-suite.md)的集成。
