# iOS 向けリワード広告インテグレーション

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

Unity LevelPlay Rewardedは全画面の広告単位であり、通常はアプリケーションのライフサイクルにおける自然な遷移ポイントで提供されます。 

> **Note:**
>
> このドキュメントは SDK 8.5.0 以降に関連するものです。

## 前提条件##prerequisites

* LevelPlay SDK がアプリケーションに正しく統合されていることを確認します。インテグレーションの概要は[こちら](/grow/levelplay/sdk/ios/sdk-integration.md)です。
* LevelPlay 初期化 API を使用して SDK を初期化していることを確認します。
* LevelPlay ダッシュボードで AdUnitID を見つけます。

## Rewarded Adオブジェクトの作成##create-rewarded-ad-object

リワード広告オブジェクトの作成は、**onInitSuccess** コールバックを受信した後に実行する必要があります。

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

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

1. **Objective-C**

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

2. **Swift**

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

## デリゲートの実装##implement-delegates

コードに **LPMRewardedAdDelegate** を実装して、広告配信に関する情報を取得します。 

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

1. **Objective-C**

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

   #pragma mark - LPMRewardedAdDelegate Methods
   - (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 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) {}
   ```

### LevelPlay 広告情報##levelplay-ad-info

**LPMAdInfo** パラメーターには、ロードされた広告に関する情報が含まれます。
LPMAdInfo の実装と使用可能なフィールドの詳細については、[こちら](/grow/levelplay/sdk/ios/levelplay-listener-adinfo-integration.md)を参照してください。

## リワード広告の詳細を取得する##get-rewarded-ad-details

getReward API を使用して、LevelPlay ダッシュボードで設定した報酬データにアクセスします。他のメディエーション API とは異なり、これは初期化期化後に SDK にローカルに保存されたデータを返す独立した呼び出しです。これにより、広告を表示する前にユーザーに潜在的なゲーム内報酬を通知する動的なデータ駆動型 UI をビルドできるため、アプリケーション内で報酬値をハードコードする必要がなくなります。

### 前提条件##prerequisites

getReward API を実装する前に、プロジェクトが以下の技術要件を満たしていることを確認してください。

* **SDK 初期化**：initSDK を呼び出し、onInitializationSuccess コールバックが報酬データがキャッシュされていることを確認します。
* **広告オブジェクトインスタンス**：API を呼び出す前に、有効な広告単位 ID でリワード広告オブジェクトをインスタンス化します。
* **最低 SDK バージョン**:LevelPlay SDK バージョン 8.1.0 以上 (ネイティブまたは Unity パッケージ) を使用する。

### ベストプラクティス##best-practices

以下の推奨事項に従って、安定した予測可能なインテグレーションを行ってください。

* **初期化成功時**の呼び出し：getReward を呼び出し最適なタイミングは、初期化化成功リスナーのすぐ内側です。これにより、ユーザーが画面に入った瞬間に UI が準備されます。
* **空のステートをチェック**します。UI を更新する前に、必ず 0 を超える値を確認してください。これにより、初期化期化中にネットワークワークエラーが発生しても滑らかななユーザー体験が保証されます。
* **配置精度**:getReward("placementName") で使用される文字文字列が LevelPlay ダッシュボードで定義された名前と正確に一致していることを確認します。

### API 構造体##api-structure

getReward メソッドを使用すると、LevelPlay ダッシュボードから同期された報酬データにアクセスできます。このメソッドを使用して、ローカル SDK キャッシュに特定の配置値またはグローバル広告単位のデフォルトをクエリします。

#### getReward##getreward

```objective-c
- (LPMReward *)getRewardWithPlacementName:(NSString *)placementName;
```

特定の配置またはデフォルトの広告単位の報酬の名前と金額を取得します。その他に使用するパラメーターはありません。

| パラメーター        | 説明                                                                 |
| ------------- | ------------------------------------------------------------------ |
| placementName | LevelPlay ダッシュボードで定義されている配置の一意のの識別子。`nil`を渡して、広告単位のデフォルトの報酬を取得します。 |

名前 (文字列) と金額 (int) を含む LPMReward オブジェクトを返します。

### 初期設定##initial-setup

getReward API は、LevelPlay SDK のコア コンポーネントとして機能し、以下のロジックで動作して待ち時間なしでデータを利用できるようにします。

* **統合特徴**:報酬データはSDKの初期設定中に取得されるため、API呼び出しは瞬時に行われ、ネットワークリクエストを必要としません。
* **エディター設定**:アプリケーションを LevelPlay SDK と統合すると、API はすぐに使用できます。この機能をテストするために追加のアセットやプラグインは必要ありません。

### 報酬選択ロジックについて##understand-reward-selection-logic

API は、特定の階層に基づく LPMReward オブジェクトを返します。このロジックを理解することで、特定の報酬が表示される理由のトラブルシューティングに役立ちます。

* **配置レベル**:呼び出しで有効な配置名が指定されている場合、SDKはダッシュボードでその配置に設定された特定の報酬を返します。
* **広告単位レベル**：配置名が nil の場合、または見つからなかった場合、SDK は広告単位で定義されたデフォルトの報酬にフォールバックします。
* **フォールバック状態**:初期化が完了する前に API が呼び出された場合は、空の文字列列名と金額 0 の報酬オブジェクトが返されます。

### UIの動的更新##update-your-ui-dynamically

getReward API を使用して、静的ボタンを意図的なアクション喚起に Transform します。例えば、ジェネリックのWatch Videoボタンの代わりに、Watch to Earned 50 Goldとディスプレイできます。

* **検証量**:UI コンポーネントを更新する前に、reward.amount が 0 を超えていることを常に確認してください。
* **イベント主導型更新**:初期化成功リスナー内で API を呼び出して、ユーザーが画面に入った瞬間に UI が正確であることを確認します。
* 大文字と小文字の**区別**:コード内の配置名の文字文字列が LevelPlay ダッシュボードと正確に一致していることを確認します。文字列が一致しないと、広告単位のフォールフォールバックがトリガーされます。

### 報酬データ例の取得##retrieve-reward-data-examples

以下の例は、iOS 用の reward API の呼び出し方法を示しています。

1. **Objective-C**

   ```objective-c
   /** 
    * 広告に関連付けられた報酬を取得します。
    * このメソッドを使用して、広告単位または配置に設定された報酬を取得します。ザ 
    * 配置固有の報酬は、有効な配置名の場合は広告単位の報酬よりも優先されます。 
    * が表示されます。
    * @param 配置 報酬を取得する配置名、または広告単位の報酬を使用する`nil`。
    * @return A `LPMReward` オブジェクト。失敗した場合は空の報酬を返します (`name: ""` と `amount: 0`)。
    */ 
   LPMReward *reward = [self.rewardedAd getRewardWithPlacementName:@"main_menu"];
   NSLog(@"Reward: %ld %@", (long)reward.amount, reward.name);
   ```

2. **Swift**

   ```swift
   /** 
    * 広告に関連付けられた報酬を取得します。
    * このメソッドを使用して、広告単位または配置に設定された報酬を取得します。ザ 
    * 配置固有の報酬は、有効な配置名の場合は広告単位の報酬よりも優先されます。 
    * が表示されます。
    * @param placementName 報酬を取得する配置名、または広告単位の報酬を使用する`nil`。
    * @return A `LPMReward` オブジェクト。失敗した場合 (`name: ""` と `amount: 0`)、空の報酬を返します。
    */ 
   let reward = self.rewardedAd.getReward(placementName: "main_menu")
   print("Watch to get \(reward.amount) \(reward.name)")
   ```

### getReward API 実装のトラブルシューティング##troubleshooting-getreward-api-implementation

* **Reward amount は 0 を返し**ます。これは通常、onInitializationSuccess コールバックの前に API が呼び出された場合に発生します。ゲーム内報酬のクエリを実行する前に、SDKの準備が完全にできていることを確認します。
* **間違った報酬タイプ**:複数のプレースメントがあるかどうかを確認します。配置名のスペルに誤りがある場合、SDKはデフォルトで特定の配置報酬ではなくプライマリ広告単位の報酬を使用します。

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

リワード広告をロードするには、**loadAd** を使用します。

1. **Objective-C**

   ```objective-c
   [self.rewardedAd loadAd];
   ```

2. **Swift**

   ```swift
   self.rewardedAd.loadAd()	 
   ```

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

**didLoadAd** コールバックの受信後にリワード広告を表示します。

* **ViewController** の共有に必要です。 
* プレースメントを使用する場合は、後述のプレースメントのセクションで示すように、**showAd** API に配置名を渡します。
* ユーザーに広告が正常に表示されたら、ロードステップを繰り返して別の広告をロードできます。 

1. **Objective-C**

   ```objective-c
   - (void)showRewardedAd {
       // 広告の準備ができていることを確認します
       if ([self.rewardedAd isAdReady]) {
           // 配置なしで表示
           [self.rewardedAd showAdWithViewController:self placementName:NULL];
       }
   }	 
   ```

2. **Swift**

   ```swift
   func showRewardedAd() {
       // 広告の準備ができていることを確認します  
       if self.rewardedAd.isAdReady() {
           // 配置なしで表示
           self.rewardedAd.showAd(viewController: self, placementName: nil)
       }
   }	 
   ```

### 広告の準備ができているか確認##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)
   }	 
   ```

### Placements##placements

LevelPlayダッシュボードでは、Rewardedの[プレースメント](/grow/levelplay/platform/settings/placements.md) ペーシングと上限設定をサポートしています。 

リワード広告にプレースメントが設定されている場合は、 **showAd** メソッドを呼び出して特定の配置の広告を配信します。

1. **Objective-C**

   ```objectivec
   // 広告の準備ができていることと、配置に上限がないことを確認します。
   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) 
   }	 
   ```

### Dynamic UserId##dynamic-userid

動的ユーザー ID は、AdRewarded トランザクションを検証するために使用されるパラメーターで、セッションを通じて変更できます。このパラメーターは、[サーバー間](/grow/levelplay/platform/settings/server-to-server-callback.md)の広告リワード型コールバックを通じて受け取ります。showAd を呼び出す前に設定する必要があります。

* 文字列 値は 1 \~ 64 文字の英数字でなければなりません。
* コールバックURLで報酬の詳細とともに`dynamicUserId`パラメーターを受け取ります。

1. **Objective-C**

   ```objective-c
   [LevelPlay setDynamicUserId:@"userId"];
   ```

2. **Swift**

   ```swift
   LevelPlay.setDynamicUserId("userId")
   ```

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

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

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

1. **Objective-C**

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

2. **Swift**

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

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

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() {
       // used to load or reload the ad
       self.rewardedAd.loadAd()
   }

   func showRewardedAd() {
       if self.rewardedAd.isAdReady() {
           self.rewardedAd.showAd(viewController: self, placementName: nil)
       }
   }

   func showRewardedAd(withPlacementName placementName:文字列) {
       // check that ad is ready and that the placement is not capped 
       if self.rewardedAd.isAdReady(), !LPMRewardedAd.isPlacementCapped(placementName) {
           self.rewardedAd.showAd(viewController: self, placementName: placementName)
       }
   }

   // 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 Mediation デモアプリケーション##levelplay-mediation-demo-app

インテグレーション Demo (インテグレーションデモ) アプリケーションは、リワード広告単位 API をアプリケーションに統合する方法を示します。

[iOSデモアプリケーションのダウンロード](https://github.com/ironsource-mobile/Mediation-Demo-Apps)

[インテグレーションテストスイート](/grow/levelplay/sdk/ios/integration-test-suite.md)とのインテグレーションを確認します。

## 次のステップ##next-steps

インテグレーション ガイドに従って、追加のリワード型広告ネットワークを統合したり、追加の広告フォーマットを設定したりできます。

* [メディエーションネットワークの追加](/grow/levelplay/sdk/ios/mediation-networks.md)
* [インタースティシャル広告](/grow/levelplay/sdk/ios/interstitial-integration.md)
* [バナー広告](/grow/levelplay/sdk/ios/banner-integration.md)
* [ネイティブ広告](/grow/levelplay/sdk/ios/native-ads-integration.md)
