# iOSのリワード広告単位APIへの移行

> 動画リワード広告単位をiOSアプリケーションに実装するには、広告単位の初期化、デリゲートの設定、広告イベントの処理を行います。

このガイドでは、広告単位IDをウォーターフォール識別子として使用し、SDKバージョン9.0.0時点でLevelPlay APIを統合し、リワード広告をロードおよびディスプレイする方法について説明します。

> **Important:**
>
> 現在使用されているインテグレーション方法 (Ironsource init、Ironsource ロードリワードリスナー、Rewarded リスナー) の代わりに、この記事で紹介した API を使用します。API の置き換えについては、**API Comparison** セクションを参照してください。
>
> [詳細設定](/grow/levelplay/sdk/unity/additional-settings.md.md)と[規制設定](/grow/levelplay/sdk/unity/regulation-advanced-settings.md.md)は変更されておらず、LevelPlay SDK の初期化の前後にサポートされます。

## LevelPlay プラットフォームで広告単位 ID を確認します。

リワード広告をロードおよびディスプレイするには、LevelPlay メディエーションプラットフォームで利用できる広告単位 ID を使用する必要があります。

1. LevelPlay アカウントで、**設定**> **広告ユニット** に操作します。
2. リワード型広告単位IDをコピーし、コードに統合します。

## LevelPlay SDK の初期化##initializing-the-levelplay-sdk

LevelPlay SDK を初期化するには、以下の手順に従います。

1. 完了ハンドラーの成功と失敗を定義します。
2. セッションで初期化する広告フォーマットのリストを定義します。これには、複数の広告単位ではない API を使用するすべての広告フォーマットを含める必要があります。
3. appKey、広告フォーマット、およびユーザー ID (必要な場合) を使用して LevelPlay init API を呼び出します。

1) **Objective-C**

   ```objective-c
   // キーダーを作成します。ユーザー ID がある場合は追加
   LPMInitRequestBuilder *requestBuilder = [[LPMInitRequestBuilder alloc] initWithAppKey:@"appKey"];
   [requestBuilder withUserId:@"UserId"];
   // 初期リクエストのビルド
   LPMInitRequest *initRequest = [requestBuilder build];
   // 準備したリクエストで LevelPlay を初期化
   [LevelPlay initWithRequest:initRequest 完了:^(LPMConfiguration *_Nullable config, NSError *_Nullable error){
       if(error) {
           // 初期化期化中にエラーが発生しました。必要なアクションを実行するか再試行してください
       } else {
           // 初期化に成功しました。バナー広告のロードやその他のタスクを実行できるようになりました
       }
   }];
   ```

2) **Swift**

   ```swift
   // キーダーを作成します。ユーザー ID がある場合は追加
   let requestBuilder = LPMInitRequestBuilder(appKey: "appKey")
           .withUserId("UserId")
   // 初期リクエストのビルド
   let initRequest = requestBuilder.build()
   // 準備したリクエストで LevelPlay を初期化 
   LevelPlay.initWith(initRequest) 
   { config, error in }
       if let error = error {
           // 初期化期化中にエラーが発生しました。必要なアクションを実行するか再試行してください
       } else {
           // 初期化に成功しました。広告のロードやその他のタスクを実行できるようになりました
       }
   }
   ```

### 初期化期化の結果##initialization-result

**Success**：初期化が正常に完了したときにトリガーされます。この通知を受け取ったら、広告を作成してロードできます。

**エラー**: 設定が正常に取得されなかったため、広告をロードできません。後で LevelPlay SDK の初期化を試してみることをお勧めします (インターネット接続が利用可能なとき、または失敗の理由が解決されたとき)。

| コンポーネント | 古い機能                      | 広告単位 (新規)                 |
| ------- | ------------------------- | ------------------------- |
| API     | IronSource.initWithAppKey | LevelPlay.initWithRequest |
| init 結果 | onInitializationComplete  | 完了                        |
|         | –                         | error                     |

## リワード広告の作成##create-rewarded-ad

リワード型広告オブジェクトの作成は、**完了**結果を受信してから実行する必要があります。

オブジェクトは、セッションを通じて複数のロードと表示をハンドルできる再利用可能なインスタンスです。作成後、同じ広告単位の広告をロードおよび表示するために使用します。

より高度な実装では、必要に応じて複数のリワード広告オブジェクトを作成できます。

1. **Objective-C**

   ```objective-c
   // リワード広告の作成
   self.rewardedAd = [[LPMRewardedAd alloc] initWithAdUnitId:@"adUnitId"];
   ```

2. **Swift**

   ```swift
   // リワード広告の作成
   self.rewardedAd = LPMRewardedAd(adUnitId: "adUnitId")
   ```

## リワード型デリゲートの実装##implement-rewarded-delegate

作成したリワード型広告単位に**LPMRewardedAdDelegate**を実装して、広告配信に関する情報を取得します。

* リワード広告をロードする前にリスナーを設定することをお勧めします。
* 各リワード広告には、独自のリスナー実装が必要です。
* コールバックはメインスレッドで実行されます。

1. **Objective-C**

   ```objective-c
   // リワード広告の作成
   self.rewardedAd = [[LPMRewardedAd alloc] initWithAdUnitId:@"adUnitId"]; 
   // 実装デリゲート
   self.rewardedAd.delegate = self;
   #pragma mark - LPMRewardedAdDelegate メソッド
   - (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error {}
   - (void)didChangeAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error {}
   - (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didCloseAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didRewardAdWithAdInfo:(LPMAdInfo *)adInfo reward:(LPMReward *)reward {}
   ```

2. **Swift**

   ```swift
   // リワード広告の作成
   self.rewardedAd = LPMRewardedAd(adUnitId: "adUnitId")
   // 実装デリゲート 
   self.rewardedAd.setDelegate(self)
   // MARK：LPMRewardedAdDelegate メソッド
   func didLoadAd(with adInfo:LPMAdInfo) {}
   func didFailToLoadAd(withAdUnitId adUnitId:文字列、エラー：Error) {}
   func didChangeAdInfo(_ adInfo:LPMAdInfo) {}
   func didDisplayAd(with adInfo:LPMAdInfo) {}
   func didFailToDisplayAd(with adInfo:LPMAdInfo、エラー：Error) {}
   func didClickAd(with adInfo:LPMAdInfo) {}
   func didCloseAd(with adInfo:LPMAdInfo) {}
   func didRewardAd(with adInfo:LPMAdInfo、報酬:LPMReward) {}
   ```

### LevelPlay リワード広告イベント##levelplay-rewarded-ad-events

**didLoadAd**:広告が正常にロードされたときに提供されます。

**didFailToLoadAd**:広告のロードに失敗したときに提供されます。広告単位情報が含まれます。

**didDisplayAd**:広告が表示されるときに提供されます。これはインプレッションに相当します。

**didFailToDisplayAd**:広告の表示に失敗したときに提供されます。

**didRewardAd**:広告に報酬が支払われるときに提供されます。広告単位情報と報酬情報が含まれます。

**didClickAd** (任意):ユーザーが広告をクリックしたときに提供されます。

**didCloseAd**:広告が閉じられたときに提供されます。

**didChangeAdInfo** (任意):広告情報が更新されたときに提供されます。別の広告がロードされていて、CPM/Rate が高い場合に利用できます。

| コンポーネント | 古い機能                        | 広告単位 (新規)             |
| ------- | --------------------------- | --------------------- |
| デリゲート   | LevelPlayRewardedAdDelegate | LPMRewardedAdDelegate |
| イベント    | onAdReady                   | didLoadAd             |
|         | onAdLoadFailed              | didFailToLoadAd       |
|         | onAdOpened                  | didDisplayAd          |
|         | onAdClosed                  | didCloseAd            |
|         | onAdShowFailed              | didFailToDisplayAd    |
|         | onAdRewarded                | didRewardAd           |
|         | onAdClicked                 | didClickAd            |
|         | onAdShowSucceeded           | – (非推奨)               |
|         | –                           | didChangeAdInfo       |

## リワード型広告のロード##load-rewarded-ad

**onInitSuccess** コールバックを受信すると、リワード広告をロードする準備ができます。これは、 メソッドを使用して行う必要があります。

1. **Objective-C**

   ```objective-c
   // 広告のロードまたはリロード
   [self.rewardedAd loadAd];
   ```

2. **Swift**

   ```swift
   // 広告のロードまたはリロード
   self.rewardedAd.loadAd()
   ```

## リワード広告の表示##show-rewarded-ad

**showAd** API を使用して、**onAdLoaded** コールバックの受信後にリワード広告を表示できます。
[プレースメント](/grow/levelplay/platform/settings/placements.md)を使用している場合は、次に示すように、プレースメントの名前を API の一部として共有します。

1. **Objective-C**

   ```objective-c
   // 配置なしで表示 
   [self.rewardedAd showAdWithViewController:self placementName:nil];
   // 配置で表示 
   [self.rewardedAd showAdWithViewController:self placementName:placementName];
   ```

2. **Swift**

   ```swift
   // 配置なしで表示 
   self.rewardedAd.showAd(viewController: self, placementName: nil)
   // 配置で表示 
   self.rewardedAd.showAd(viewController: self, placementName: placementName)
   ```

### 広告の準備ができているか確認##check-ad-is-ready

表示の失敗を避け、広告が正しく表示されるようにするために、**showAd** API を呼び出す前に以下の API を使用することをお勧めします。

**isAdReady**：広告が正常にロードされ、広告単位が上限に達していない場合は true、それ以外の場合は false を返します。

**isPlacementCapped**: 有効な配置に上限がある場合に true を返します。配置が有効でないか、上限がない場合、この API は false を返します。

1. **Objective-C**

   ```objective-c
   // 広告の準備ができていることと、配置に上限がないことを確認します。 
   if ([self.rewardedAd isAdReady] &amp;&amp; ![LPMRewardedAd isPlacementCapped:placementName]) {
       [self.rewardedAd showAdWithViewController:self placementName:placementName];
   }
   ```

2. **Swift**

   ```swift
   // 広告の準備ができていることと、配置に上限がないことを確認します。 
   if self.rewardedAd.isAdReady(), !LPMRewardedAd.isPlacementCapped(placementName) {
       self.rewardedAd.showAd(viewController: self, placementName: placementName)
   }
   ```

広告がプレイヤーに正常に表示されたら、Rewarded Ad のロード ステップを繰り返して、別の広告をロードできます。一度に 1 つの広告をロードするときに、新しい広告エンティティを作成する必要はありません。

## ユーザーの報酬##reward-the-user

LevelPlay SDK は、ユーザーがビデオを正常に視聴するたびに **didRewardAd** を起動します。

**didRewardAd** と **didCloseAd** は非同期です。**didCloseAd** の後で **didRewardAd** が起動された場合でもゲーム内報酬を付与するようにリスナーを設定してください。

1. **Objective-C**

   ```objective-c
   - (void)didRewardAdWithAdInfo:(LPMAdInfo *)adInfo 報酬:(LPMReward *)reward {
       // ユーザーに報酬を付与するロジックを実装します
       NSString *name = reward.name; 
       NSInteger *amount = reward.amount;
   }
   ```

2. **Swift**

   ```swift
   func didRewardAd(with adInfo:LPMAdInfo、報酬:LPMReward) {
   // ユーザーに報酬を付与するロジックを実装します
   let name：String = reward.name 
   let amount：Int = reward.amount
   }
   ```

## 複数の広告単位リワード型API##multiple-ad-unit-rewarded-apis

|     | 古い機能                           | 広告単位 (新規)         |
| :-- | :----------------------------- | :---------------- |
| クラス | IronSource                     | LPMRewardedAd     |
| API | loadRewardedVideo              | loadAd            |
|     | showRewardedVideo              | showAd            |
|     | isRewardedVideoPlacementCapped | isPlacementCapped |
|     | isRewardedVideoAvailable       | isAdReady         |
|     | placement.getRewardName        | reward.name       |
|     | placement.getRewardAmount      | reward.amount     |

## リワード広告の完全な実装例##full-implementation-example-of-rewarded-ad

1. **Objective-C**

   ```objective-c
   NS_ASSUME_NONNULL_BEGIN
   @interface RewardedAdViewController () <LPMRewardedAdDelegate>
   @プロパティ(非アトミック、強)LPMRewardedAd *rewardedAd;
   @end
   @implementation RewardedAdViewController
   - (void)createRewardedAd {
       self.rewardedAd = [[LPMRewardedAd alloc] initWithAdUnitId:@"adUnitId"];
       self.rewardedAd.delegate = self;
   }
   - (void)loadRewardedAd {
       // 広告のロードまたはリロード
       [self.rewardedAd loadAd];
   }
   - (void)showRewardedAd {
     if ([self.rewardedAd isAdReady]) {
       [self.rewardedAd showAdWithViewController:self placementName:NULL];
     }
   }
   - (void)showRewardedAdWithPlacementName:(NSString *)placementName {
       // 広告の準備ができていることと、配置に上限がないことを確認します。 
       if ([self.rewardedAd isAdReady] &amp;&amp; ![LPMRewardedAd isPlacementCapped:placementName]) {
           [self.rewardedAd showAdWithViewController:self 
           placementName:placementName];
     }
   }
   #pragma mark - LPMRewardedAdDelegate メソッド
   - (void)didLoadAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didFailToLoadAdWithAdUnitId:(NSString *)adUnitId error:(NSError *)error {}
   - (void)didChangeAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didDisplayAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didFailToDisplayAdWithAdInfo:(LPMAdInfo *)adInfo error:(NSError *)error {}
   - (void)didClickAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didCloseAdWithAdInfo:(LPMAdInfo *)adInfo {}
   - (void)didRewardAdWithAdInfo:(LPMAdInfo *)adInfo reward:(LPMReward *)reward {}
   @end
   NS_ASSUME_NONNULL_END
   ```

2. **Swift**

   ```swift
   class RewardedAdViewController:UIViewController、LPMRewardedAdDelegate {
   var rewardedAd:LPMRewardedAd!
   func createRewardedAd() {
       self.rewardedAd = LPMRewardedAd(adUnitId: "adUnitId")
       self.rewardedAd.setDelegate(self)
   }
   func loadRewardedAd() {
       // 広告のロードまたはリロード
       self.rewardedAd.loadAd()
   }
   func showRewardedAd() {
       if self.rewardedAd.isAdReady() {
           self.rewardedAd.showAd(viewController: self, placementName: nil)
       }
   }
   func showRewardedAd(withPlacementName placementName:文字列) {
       // 広告の準備ができていることと、配置に上限がないことを確認します。 
       if self.rewardedAd.isAdReady(), !LPMRewardedAd.isPlacementCapped(placementName) {
           self.rewardedAd.showAd(viewController: self, placementName: placementName)
       }
   }

   // MARK: LPMRewardedAdDelegate methods
   func didLoadAd(with adInfo:LPMAdInfo) {}
   func didFailToLoadAd(withAdUnitId adUnitId:文字列、エラー：Error) {}
   func didChangeAdInfo(_ adInfo:LPMAdInfo) {}
   func didDisplayAd(with adInfo:LPMAdInfo) {}
   func didFailToDisplayAd(with adInfo:LPMAdInfo、エラー：Error) {}
   func didClickAd(with adInfo:LPMAdInfo) {}
   func didCloseAd(with adInfo:LPMAdInfo) {}
   func didRewardAd(with adInfo:LPMAdInfo、報酬:LPMReward) {}
   }
   ```
