# メッセージ

> アプリケーションにカスタマイズされたメッセージを実装して、ユーザーがそのOfferwallに関与し、指定されたイベントを完了するよう動機付けます。

Message to Earn (M2E) または Offerwall にディープリンクされたアプリ内メッセージを使用して、ユーザーを Offerwall に誘導します。

以下の画像は、タスク完了時に獲得できるジェムが通常の 2 倍になる期間限定のオファーについて、ユーザーに知らせるアプリ内メッセージの例です。ユーザーは Earn More Now をタップして Offerwall にアクセスし、これらのオファーを完了できます。

![オファーウォールのアプリケーション内メッセージの例です。](/api/media?file=/grow/media/images/m2e-landscape.png)

## メッセージのベストプラクティス##messaging-best-practices

メッセージを設定する際は、より多くのユーザーを Offerwall に誘導できるように、以下のベストプラクティスを参考にしてください。

### メッセージで通貨セールをプロモーションする##promote-currency-sales-in-messages

M2E またはアプリのメッセージングシステムで通貨セールをパーソナライズし、セールの認知度を高めます。詳細については、
通貨セールの記事の [メッセージによる通貨セールの最適化](/grow/offerwall/monetization/dashboard/currency-sales.md#optimizing-currency-sales-with-messaging) セクションを参照してください。

### メッセージを効果的に配置して Offerwall の可視性を向上する##improve-offerwall-visibility-with-effective-messaging-placements

より多くのユーザーを Offerwall に誘導するため、以下のタイプのプレースメントでメッセージを設定できます。

* アプリのロードが完了した後のホーム画面
* 通貨不足時にトリガーされるダイアログ内
* アプリのインボックスメッセージ内
* ユーザーが各レベルに到達した後
* ユーザーがゲームイベントを完了した後

### ユーザーターゲティングを適用する##apply-user-targeting

パーソナライズされたメッセージを使用して、特定のユーザーグループをターゲットにします。以下に挙げる例を参考に、主要なユーザーセグメントを特定し、それぞれに合わせたメッセージを作成してください。

* 初回ユーザーに、限定期間内に初めてオファーを完了するとゲーム内報酬が通常の 2 倍になることを案内する。
* 一定期間オファーを完了していないユーザーに行動を促す。
* 一定期間 Offerwall にログインしていないユーザーに復帰を促すプロンプトを表示する。
* Offerwall イベントが途中になっているユーザーの再エンゲージメントを促す。

### アプリ内メッセージの効果を評価する##evaluate-in-app-message-effectiveness

アプリ内メッセージを最適化するには、A/B テストを実施して、使用データで最も効果的なメッセージバージョンを確認できます。A/B テストの詳細については、[A/B テストツール](/grow/offerwall/monetization/dashboard/ab-testing-for-marketing-messages.md) を参照してください。

## Message to Earn の設定##configure-message-to-earn

Message to Earn (M2E) は、ゲームプレイ中、アプリ内で特定のタイミングや場所にカスタマイズ可能なメッセージを表示する Tapjoy の機能です。この機能では、ユーザーが Offerwall にアクセスする前に、そのユーザーがエンゲージできる特定のプロモーションメッセージを表示できます。

> **Note:**
>
> M2E の設定は、
>
> [コンテンツカード](/grow/offerwall/monetization/dashboard/content-cards.md)
>
> &#x20;の作成時に行います。コンテンツカードの作成方法については、
>
> [コンテンツカードの作成](/grow/offerwall/monetization/dashboard/content-cards.md#create-a-content-card)
>
> &#x20;を参照してください。

M2E を設定するには、以下の手順を実行します。

1. **Content card** (コンテンツカード) 設定で、**Message to Earn** セクションに移動します。
2. **Message to Earn** トグルを有効化します。
3. 横向き用と縦向き用のメッセージ画像をアップロードします。
4. **Transition** (遷移) で、アプリ内メッセージを画面に表示する際のアニメーションを選択します。以下のオプションのどれかを選択します。
   * **Swipe** (スワイプ): アプリ内メッセージがスライドして表示されます。
   * **Tap** (タップ): ユーザーが画面をタップすると、アプリ内メッセージが表示されます。
   * **Auto (after 5 seconds)** (自動 (5 秒後)): ユーザーの入力なしで、アプリ内メッセージが 5 秒後に自動で表示されます。
5. **メッセージ**を入力します。

## Offerwall へのアプリ内メッセージのディープリンクする##deeplink-in-app-messages-to-offerwall

アプリののメッセージングシステムを使用したい場合は、アプリ内メッセージを Offerwall にディープリンクできます。実装に応じてアプリ内メッセージを Offerwall にディープリンクするには、以下の手順とプラットフォーム固有の方法を参照してください。

1. Tapjoy ダッシュボードで、カスタムアプリ内メッセージ用にコンテキスト依存プレースメントを作成します。
   > **Tip:**
   >
   > プレースメントを整理して管理しやすくするため、目的を明確に示す名前を付けてください。例えば、プレースメント名 `Level_Complete_Popup` は、ユーザーがゲームレベルをクリアした後に表示されるメッセージのプレースメントを示しています。

2. カスタムアプリ内メッセージからユーザーを誘導するコンテンツカードを作成します。
   > **Note:**
   >
   > ユーザーにカスタムアプリ内メッセージのみが表示されるように、**Message to Earn** は無効のままにします。

3. プレースメントをコードに実装するため、以下のコードをプロジェクトにコピーし、文字列プレースホルダーをステップ 1 で作成した正確なプレースメント名に置き換えます。

   > **Important:**
   >
   > ダッシュボードのプレースメント名と大文字小文字、スペース、特殊文字が完全に一致していることを確認してください。

1) **Android**

   ```java title="Java"
   TJPlacementListener placementListener = this;
   TJPlacement p = Tapjoy.getPlacement("[PLACEMENT_NAME]", placementListener);

   // Listeners

   public void onRequestSuccess(TJPlacement placement);
   public void onRequestFailure(TJPlacement placement, TJError error);
   public void onContentReady(TJPlacement placement);
   public void onContentShow(TJPlacement placement);
   public void onContentDismiss(TJPlacement placement);
   ```

2) **iOS (Objective-C)**

   ```objc title="Objective-C"
   TJPlacement *p = [TJPlacement placementWithName:@"Main Menu" delegate:self];

   // Callbacks

   - (void)requestDidSucceed:(TJPlacement*)placement{}
   - (void)requestDidFail:(TJPlacement*)placement error:(NSError*)error{}
   - (void)contentIsReady:(TJPlacement*)placement{}
   - (void)contentDidAppear:(TJPlacement*)placement{} 
   - (void)contentDidDisappear:(TJPlacement*)placement{}
   ```

3) **iOS (Swift)**

   ```swift title="Swift"
   let p = TJPlacement(name: "Main Menu", delegate: self)

   // Callbacks

   func requestDidSucceed(_ placement: TJPlacement!) {}
   func requestDidFail(_ placement: TJPlacement!, error: Error!) {}
   func contentIsReady(_ placement: TJPlacement!) {}
   func contentDidAppear(_ placement: TJPlacement!) {}
   func contentDidDisappear(_ placement: TJPlacement!) {}
   ```

4) **Unity**

   ```csharp title="C-sharp"
   TJPlacement p = TJPlacement.CreatePlacement("PLACEMENT_NAME");

   TJPlacement.OnRequestSuccess += HandlePlacementRequestSuccess;
   TJPlacement.OnRequestFailure += HandlePlacementRequestFailure;
   TJPlacement.OnContentReady += HandlePlacementContentReady;
   TJPlacement.OnContentShow += HandlePlacementContentShow;
   TJPlacement.OnContentDismiss += HandlePlacementContentDismiss;
   ```

5) **React Native**

   ```js title="Javascript"
   let placement = new TJPlacement("PLACEMENT_NAME");

   placement.on(TJPlacement.REQUEST_DID_SUCCEED, (placement: TJPlacement) => { });
   placement.on(TJPlacement.REQUEST_DID_FAIL, (placement: TJPlacement) => { });
   placement.on(TJPlacement.CONTENT_IS_READY, (placement: TJPlacement) => { });
   placement.on(TJPlacement.CONTENT_DID_APPEAR, (placement: TJPlacement) => { });
   placement.on(TJPlacement.CONTENT_DID_DISAPPEAR, (placement: TJPlacement) => { });
   ```

> **Important:**
>
> コンテンツをリクエストする前に、
>
> `onConnectSuccess`
>
> &#x20;コールバックを受け取って Tapjoy SDK が接続されていることを確認してください。
>
> `onConnectSuccess`
>
> &#x20;コールバックを受け取ることで、コンテンツのリクエストが早すぎることによるエラーを防げます。

4. プレースメントのアプリ内メッセージをリクエストするため、以下のコードをプロジェクトにコピーします。

1) **Android**

   ```java title="Java"
   if(Tapjoy.isConnected()) {
   p.requestContent();
   } else {
   Log.d("MyApp", "Tapjoy SDK must finish connecting before requesting content.")
   }
   ```

2) **iOS (Objective-C)**

   ```objc title="Objective-C"
   [p requestContent];
   ```

3) **iOS (Swift)**

   ```swift title="Swift"
   p?.requestContent()
   ```

4) **Unity**

   ```csharp title="C-sharp"
   if (Tapjoy.IsConnected()) {
   p.requestContent();
   } else {
       Debug.LogWarning("Tapjoy SDK must be connected before you can request content.");
   }
   ```

5) **React Native**

   ```js title="Javascript"
   placement.requestContent();
   ```

5. アプリ内メッセージが利用可能になったときにこれを表示するため、以下のコードをプロジェクトにコピーします。

1) **Android**

   このコードは、`onContentReady` リスナーメソッドを使用してアプリ内メッセージを表示します。

   ```java title="Java"
   public void onContentReady(TJPlacement tjPlacement) {
   if(tjPlacement.isContentReady()) {
       p.showContent();
   }
   }
   ```

2) **iOS (Objective-C)**

   ```objc title="Objective-C"
   if (p.isContentReady) {
       [p showContentWithViewController: nil];
   }
   else {
   //handle situation where there is no content to show, or it has not yet downloaded.
   }
   ```

3) **iOS (Swift)**

   ```swift title="Swift"
   if (p.isContentReady) {
   p.showContent(with: nil)
   } else {
   //handle situation where there is no content to show, or it has not yet downloaded.
   }
   ```

4) **Unity**

   ```csharp title="C-Sharp"
   if (p.IsContentReady()) {
   p.ShowContent();
   } else {
       // Code to handle situation where content is not ready goes here
   }
   ```

5) **React Native**

   ```js title="Javascript"
   if (placement.isContentReady()) {
   placement.showContent();
   }
   ```
