コンテンツにスキップ

ユーザーエンゲージメント (UE, ディープリンク)

ユーザーエンゲージメント (UE) は、クーポン付きのディープリンク機能を提供します。これにより、ゲームユーザーを特定の場所やイベントページに招待したり、リンクをタップするだけで直接報酬を得ることができます。

Hive SDKでは、スキームURLを通じて実行したいアクションはユーザーエンゲージメントアクションと呼ばれます。ゲームが指定されたURLで指定されたアクションを実行すると、Hiveはユーザーエンゲージメントイベントの形式でゲームにリクエストを送ります。

ユーザーエンゲージメントとは?

UEは、アプリケーションの内部および外部からのリクエストを実行し、以下の機能を提供するサービスです:

  • アプリの外部からディープリンクまたはプッシュ通知を通じてスキームURLを実行します。
  • アプリの内部からインターワークを通じてスキームURLを実行します。
  • Hive SDK v4.4.0以降では、
    • ユーザー獲得によって作成されたQRコードやリンクなどの外部ルートを介してゲームアプリにアクセス履歴を送信し、報酬をリクエストします。
    • Hive SDKのオファーウォールやその他の機能を介してゲームアプリにアクセス履歴を送信し、報酬をリクエストします。(CPI報酬のリクエスト)
    • ゲームクライアントがsetEngagementReady APIを実装し、Hive SDKモジュールが利用可能なときにリクエストを送信して、CPI報酬やその他の処理を行うUEの機能を実行することを確認してください。

スキームURLを示す方法

スキームURLは、UEのアクションを表現するためのフォーマットです。それは、スキームURLで定義されているアクションと、それが適用される対象を示します。Hiveを使用するスキームURLは、いわゆる統一リソース識別子(URI)の標準フォーマットに従い、サービスフィールドと共通フィールドで構成されています。

  • 標準形式: {scheme}://{host}/{path}?{query}
  • Hive 形式: {scheme}://{host}/{api}?{parameters}
  • サービスフィールド: {scheme}://{host} | 共通フィールド: /{api}?{parameters}
Note

Hive フォーマット は、Hive SDK で処理されるイベントを示し、指定された {api}共通フィールド セクションに示すように含みます。このため、Hive フォーマットの共通フィールドは、標準フォーマットの /{path}?{query} の代わりに /{api}?{parameters} で構成されます。Hive フォーマット に含まれる {api} のリストについては、共通フィールド を参照してください。

ゲームでのスキームURLの使用

クーポンのディープリンク目的でUEを使用することに加えて、プロモーション目的でゲーム内の特定の場所(例:ダンジョン、ギフトボックス、ショップなど)に移動する必要がある場合は、ゲーム内でパスを定義し、スキームURLを提供してください。このスキームURLは、Hiveコンソール上のランディングURLに変換され、ユーザーに配信されます。ゲーム内のスキームURLに関する詳細については、スキームURLのホストがゲームである場合を参照してください。

サービスフィールド

スキームURLのサービスフィールドは{scheme}://{host}であり、これはディープリンクがHive SDKに配信されるパスを示し、スキームとホストで構成されています。

スキーム

アプリにURLが渡される3つのパスがあります:

プッシュ

スキームURLでターゲットにされたゲームアプリが実行中であるかどうかにかかわらず、URLの受信者はスキームURLを含むプッシュメッセージを受け取ります。受信者がメッセージをタップすると、プッシュスキームURLがHiveクライアントに送信され、その後HiveクライアントがURLを処理します。

  • 例えば、push://{host}/{path}?{query}
ディープリンク

ユーザーがテキストメッセージやウェブブラウザなどの外部手段を介してURLをタップした場合、このURLのスキームフィールドがユーザーのデバイス上の特定のゲームのAppIDで埋められていると、ゲームが実行され、URLがHive SDKに送信されます。ゲームアプリがインストールされていない場合は、インストールページに移動します。

  • 例えば、com.com2us.example://{host}/{path}?{query}

ユーザーがフォローする内容は、ディープリンクスキームを使用する際のゲームインストールのステータスによって異なります。

  1. ゲームがインストールされている場合 ディープリンクをタップすると、ユーザーは最初にゲームのヒントを確認し、ゲームに移動します。
  2. ゲームがインストールされていない場合 ユーザーがメッセージ内のリンクをタップすると、ゲームのインストール後に報酬が利用可能であることが通知されます。ゲームがインストールされていないため、ダウンロードマーケット(Google Playストア / Apple Appストア)に移動します。
Interwork

アプリが実行中に、ユーザーがHive SDKのプロモーション画面(バナー、通知など)の特定のリンクURLに触れると、そのURLのスキームフィールドが「interwork」である場合、URLはHive SDKに送信されます。

  • 例えば、interwork://{host}/{path}?{query}

ゲームからHive SDKに直接URLを送信するために、processURI APIを使用して処理インターワークスキームのリクエストを呼び出すことができます。

String uri = "";


Boolean result = Promotion.processURI(uri);

if(result) {
        // UEイベントの登録に成功しました
} else {
        // スキームURIの形式が不適切です
}
std::string uri = "";


bool result = Promotion::processURI(uri);

if(result) {
        // UEイベントの登録に成功
} else {
        // スキームURIの形式が不適切
}
String uri = "";


boolean result = Promotion.processURI(uri);

if(result) {
        // UEイベントの登録に成功しました
} else {
        // スキームURIの形式が不適切です
}
NSString* uri = @"";


bool result = [HIVEPromotion processURI:uri];

if(result) {
        // UEイベントの登録に成功しました
} else {
        // スキームURIの形式が不適切です
}

ホスト

ホストは、要求されたアクションの責任者を指定します:

  • ゲーム: ゲームが担当するアクション
  • ハイブ: Hive SDK が担当するアクション

共通フィールド

スキームURLの一般的なフィールドは/{api}/{parameters}であり、必要な情報を含む処理するアクションを示します:

APIは、URLを通じてどのアクションを取るべきかを明確にします。ホストに応じて、次のアクションを取ることができます:

スキームURLのホストが{ #hive-scheme-game }の場合

認識しておいてください。利用可能なAPIは、認証バージョン(v4またはv1)によって異なります。

API 実装 Auth v4 Auth v1
authlogin auth/login メンバーシップログイン (ゲスト -> 確認済みアカウント) X O
socialinquiry social/inquiry 1:1問い合わせページへのアクセス O O
promotionshow promotion/show プロモーションカスタムビューの露出 O O
promotioncoupon promotion/coupon 使用済みとしてプロモーションクーポンを処理 O O
offerwallshow promotion/offerwall オファーウォールの露出 O O
iappromote アイテム購入予約 (Hive SDK v4.5.0以降でIAP v4を使用) O O
iappurchase スポットバナーでのアイテム購入 (Hive SDK v4.5.0以降でIAP v4を使用) iappurchaseを実装する際、setEngagementReady()は自動的にfalseになります。購入後、setEngagementReady()をtrueに設定する必要があります O O
social/myinquiry マイインクワイリーページへのアクセス O O
social/profile プロフィールページへのアクセス O O

Hive SDKは、EngagementListenerを通じてUEに関連するプロセスの前後に通知を受け取ります。ゲームは必要に応じてゲームを一時停止するなどの作業を必要とする場合があります。

**iappromote**と**iappurchase**についての詳細は、以下の内容をご覧ください。

iappromote

IAP v4は、Hive SDK v4.5.0以降でこの機能をサポートしています。これは、ゲームを実行する前にユーザーのために購入予約を提供します。この機能は、iOS 11によって提供されるプロモーションIAPと同様に機能し、Androidベースの環境をサポートしています。iappromoteは、イベントページ、プッシュサービス、およびメッセージで利用可能です。

  • ユーザーがイベントページ、プッシュサービス、メッセージを介してスキームURLをクリックすると、ゲームを実行して購入データを取得します。
  • iappromoteスキームを呼び出し、結果データとしてEngagementEventType.IAP\_PROMOTEを受け取ります。結果値を使用して、checkPromotePurchase APIを実装し、市場PIDを取得します。取得した市場PIDを参照として購入APIを実装することで、購入プロセスを続行できます。
  • iappromoteはiOSとAndroidの両方で利用可能です。
  • スキームURLの構造: [AppID/push/interwork]://hive/iappromote?marketpid=[marketpid]
  • 例、
    • interwork://hive/iappromote?marketpid=com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.cs02
    • 赤い部分を予約された購入に関連する市場PIDに置き換えます。
iappurchase

IAP v4は、Hive SDK v4.5.0以降でこの機能をサポートしています。スキームURLでiappurchaseを使用することで、スポットバナーでアイテムを販売できます。

* iappurchaseスキームを呼び出すと、購入ロジックが実装されます。したがって、スキームを実行する前に、マーケットを初期化し、ストア情報を取得してください。これは、`setEngagementReady`の状態をtrueに変更する前に、`marketConnect API`と`getProductInfo API`を実装することを意味します。
* ゲームは購入後にロジックを実行するため、エンゲージメントアクションを一時停止します(`setEngagementReady`は自動的にfalseになります)。
* 購入が完了したら、アクションを続けるために`setEngagementReady`の状態をtrueに変更してください。
* スキームURLの構造: [AppID/push/interwork]://hive/iappurchase?marketpid=[marketpid]
* 例、
    + interwork://hive/iappurchase?marketpid=com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.cs01
    + 赤い部分を予約された購入に関連するマーケットPIDに置き換えてください。
Spot Bannerでiappurchaseを同期する

iappurchaseスキームを使用してアイテムを販売したい場合は、Spot Bannerを利用してください。Spot Bannerの使用ガイドラインを見る

  • ゲーム内の希望する場所やタイミングにスポットバナーIDを設定して、ユーザーにアイテムを購入するよう促します。
  • スポットバナーIDを呼び出します。ユーザーがスポットバナーをタップしたときに、インターワークスキームを実装します。登録されたEngagementListenerがインターワークの実行状態を送信します。
  • インターワークスキームを呼び出すと、購入ロジックが実装されます。したがって、スキームを実行する前にマーケットを初期化し、ストア情報を取得することを確認してください。これは、スポットバナーを呼び出す前にmarketConnect APIgetProductInfo APIを実装することを意味します。
  • ゲームが購入後にロジックを実行すると、エンゲージメントアクションが一時停止します(setEngagementReadyが自動的にfalseになります)。
  • 購入が完了したら、setEngagementReadyの状態をtrueに変更してアクションを続行します。
  • **Hive コンソール > プロモーション > キャンペーン設定 > スポットバナー**にスポットバナーIDを入力し、内部リンクにスキームURLを挿入します。スポットバナーの登録方法をBusiness PMにリクエストします。
  • 例として、
    • interwork://hive/iappurchase?marketpid=com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.cs01
    • 赤い部分を予約された購入に関連するマーケットPIDに置き換えます。
  • コンソールでバナーを登録したら、ゲーム内で購入をテストします。

スキームURLのホストがゲームの場合

この場合、ゲームは要求されたアクションを実行する必要があります。 Hive SDK はスキーム URL を処理し、その後、結果を JSONObject 形式で EngagementListener を通じて送信します。結果は schemeapi、および param キーに分かれています。ゲームが値を受け取った後、適切なタイミングで関連するアクションを実行することを確認してください。

  • 例: ポストボックスにアイテムを渡す
    • URLスキーム : com.com2us.example://game/postboxadditem?item_id=123456&item_title=item01
    • Hive SDKからのJSONObject結果

      {
      "scheme" : "com.com2us.example",
      "api" : "/postboxadditem",
      "param" : "item_id=123456&item"
      }
      

UEの実装方法の詳細については、ユーザーエンゲージメントの実装 > **グローバルコールバックの宣言と登録**のサンプルコードを参照してください。

プロジェクト設定

ゲームアプリでUEを使用するには、アプリをビルドする前にOSで設定してください。

Androidの設定

launchModeメソッドをsingleTaskまたはsingleTopとして設定します。このメソッドは、AndroidManifest.xmlファイルのメインアクティビティ項目の1つです。

//<application
   android:hardwareAccelerated="true"
   android:icon="@drawable/app_icon"
   android:label="@string/app_name"
   android:isGame="true">
   <activity
       android:label="@string/app_name"
       android:name="com.hive.sample.MainActivity"
       android:screenOrientation="sensor"
       android:launchMode="singleTask"
...

iOSの設定

  1. 開発したいアプリのビルドをXcode TARGETSのリストから選択します。
  2. **Info**タブを選択します。
  3. **URL Types**セクションに**Additional url type properties**項目を追加し、**Bundle Identifier**と**URL Schemes**フィールドにAppIDを入力します。

ユーザーエンゲージメントの実装

グローバルコールバックの宣言と登録

グローバルコールバックを宣言して登録し、UEを適用します。宣言と登録の方法は、Hive SDKのバージョンによって異なります。

Note
  • Hive SDK v4.5.0以降、グローバルコールバックの宣言と登録は**Promotion**クラスのハンドラー登録APIを通じて行われます。
  • Engagement Handlerのフォーマットと列挙値はHive SDK v4.5.0以降に変更されました。

**Promotion**クラスのハンドラ登録APIを使用して、グローバルコールバックを登録する必要があります。以下はサンプルコードです。

APIリファレンス: hive.Promotion.setEngagementListener

using hive;    
    Promotion.setEngagementListener((ResultAPI result, EngagementEventType engagementEventType, EngagementEventState engagementEventState, JSONObject param) => {    
    switch (engagementEventType) {    
    case EngagementEventType.EVENT_TYPE:    
                 switch (engagementEventState) {    
                     case EngagementEventState.BEGIN:    
                         // Engagementのすべてのアクションが実行されます    
                         break;    
                     case EngagementEventState.FINISH:    
                         // Engagementのすべてのアクションが完了しました    
                         break;    
                 }    
                 break;    
             case EngagementEventType.AUTH_LOGIN_VIEW:    
                 switch (engagementEventState) {    
                     case EngagementEventState.START:    
                         // メンバーシップログインページの表示リクエストを開始    
                         break;    
                     case EngagementEventState.END:    
                         // メンバーシップログインが完了しました(ログイン完了/ウィンドウが閉じた後に配信されます)    
                         break;    
                 }    
                 break;    
             case EngagementEventType.SOCIAL_INQUIRY_VIEW:    
                 switch (engagementEventState) {    
                     case EngagementEventState.START:    
                         // 1:1問い合わせページの表示リクエストを開始    
                         break;    
                     case EngagementEventState.END:    
                         // 1:1問い合わせページの表示が完了しました(1:1問い合わせウィンドウが閉じた後に配信されます)    
                         break;    
                 }    
                 break;    
             case EngagementEventType.PROMOTION_VIEW:    
                 switch (engagementEventState) {    
                     case EngagementEventState.START:    
                         // プロモーションビューのインプレッションリクエストを開始    
                         break;    
                     case EngagementEventState.END:    
                         // プロモーションビューの表示が完了しました(プロモーションウィンドウが閉じた後に配信されます)    
                         break;    
                 }    
                 break;    
             caseEngagementEventType.COUPON:    
                 switch (engagementEventState) {    
                     case EngagementEventState.START:    
                         // クーポン消費リクエストを開始    
                         break;    
                     case EngagementEventState.END:    
                         // クーポン消費リクエストを完了し、応答を送信    
                         break;    
                 }    
                 break;    
             case EngagementEventType.OFFERWALL_VIEW:    
                 switch (engagementEventState) {    
                     case EngagementEventState.START:    
                         // オファーウォールページの表示リクエストを開始    
                         break;    
                     case EngagementEventState.END:    
                         // オファーウォールページの表示が完了しました(オファーウォールウィンドウを閉じた後に配信されます)    
                         break;    
                 }    
                 break;    

              EngagementEventType.EVENT:    
                 // ホストがゲームの場合、JSONObjectの結果値を送信する    
                 String api = "";    
                 String param = "";    

                 param.GetField(ref api, "api");    
                 param.GetField(ref param, "param");    

                 // Hive SDK バージョンによる API とパラメータ解析結果を確認します (Hive SDK C# JSONObject バージョンによる違い)    
                 // 例) interwork://game/openurl?rurl=https://www.withhive.com    

                 //Hive SDK 4.16.2の下    
                 // apiデバッグコンソールに出力する場合: \/openurl    
                 // ( api.Equals("\\/openurl"); )    
                 // パラメータデバッグコンソール出力: rurl=https:\/\/www.withhive.com    

                 // Hive SDK 4.16.2 以上    
                 // api デバッグコンソールに出力する場合: /openurl    
                 // (api.Equals("/openurl"); )    
                 // パラメータデバッグコンソール出力: rurl=https://www.withhive.com    

                 // TODO: Perform the following actions according to the api and param values    
                 break;    
            case EngagementEventType.IAP_UPDATED:    
                switch (engagementEventState) {    
                    case EngagementEventState.EVENT_START:    
                        // Signal to accept as purchase history has changed (call Restore() method)    
                        break;    
                    case EngagementEventState.EVENT_END:    
                        // Signal to accept as purchase history has changed (call Restore() method)    
                        String type = "";    
                        param.getField(ref type, "type");    

                        if (type == "subscription") {    
                            // TODO: サブスクリプション製品を復元する    
                            IAPV4.restoreSubscription((ResultAPI result, List <hive.IAPV4.IAPV4Receipt> receiptList) => {    
                                if (!result.isSuccess()) {    
                                    return;    
                                }    
                                // TODO: 受け取ったreceiptListを使用してレシートの検証をリクエストする    
                            });    
                            return;    
                        }    

                        // TODO: 消耗品を復元する    
                        IAPV4.restore((ResultAPI result, List <hive.IAPV4.IAPV4Receipt> receiptList) => {    
                            if (!result.isSuccess()) {    
                                return;    
                            }    
                            // TODO: 受け取ったreceiptListを使用してレシートの検証をリクエストする    
                        });    
                        break;    
                }    
                break;    

            case EngagementEventType.IAP_PROMOTE:    
                switch (engagementEventState) {    
                case EngagementEventState.START:    
                    // IAP Promoteデータが存在するかどうかを伝える    
                    break;    
                case EngagementEventState.END:    
                    if (!result.isSuccess()) {    
                        return;    
                    }    

                    // IAP Promoteデータが存在するため、marketPidはcheckPromote APIを通じて受信されます。    
                    IAPV4.checkPromotePurchase((ResultAPI promoteResult, String marketPid) => {    
                        if (!promoteResult.isSuccess()) {    
                            return;    
                        }    

                        // TODO: 受け取った marketPid アイテムで購入リクエストを行う    
                        IAPV4.purchase(marketPid, null, (ResultAPI purchaseResult, hive.IAPV4.IAPV4Receipt receipt) => {    
                            if (!purchaseResult.isSuccess()) {    
                                return;    
                            }    
                            // TODO: 受け取ったレシートでレシート検証をリクエストする    
                        });    
                    });    
                    break;    
                }    
                break;    

            case EngagementEventType.IAP_PURCHASE:    
                switch (engagementEventState) {    
                case EngagementEventState.START:    
                    // IAPPurchaseスキーマを通じて受け取ったアイテムを購入するためのポップアップが表示されます。    
                    break;    
                case EngagementEventState.END:    
                    // 要求されたアイテムの購入が成功したかどうかは、IAPPurchaseスキーマを通じて伝えられます。    
                    if (!result.isSuccess()) {    
                        return;    
                    }    
                    String receipt = "";    
                    param.GetField(ref receipt, "iapV4Receipt");    
                    break;    
                }    
                break;    

            case EngagementEventType.SOCIAL_MY_INQUIRY:    
                switch (engagementEventState) {    
                case EngagementEventState.START:    
                    // 私の問い合わせページの露出リクエストを開始    
                    break;    
                case EngagementEventState.END:    
                    // 私の問い合わせページが露出されました(私の問い合わせウィンドウが閉じられた後に配信されます)    
                    break;    
                }    
                break;    

            case EngagementEventType.SOCIAL_PROFILE:    
                switch (engagementEventState) {    
                case EngagementEventState.START:    
                    // プロフィールページの露出リクエストを開始    
                    break;    
                case EngagementEventState.END:    
                    // プロフィールページの露出が完了しました(プロフィールウィンドウを閉じた後に配信されます)    
                    break;    
                }    
                break;    
        }    
});    
#include "HivePromotion.h"

FHivePromotion::SetEngagementDelegate(FHivePromotionOnEngagementDelegate::CreateLambda([this](const FHiveResultAPI& Result, const EHiveEngagementEventType& EngagementEventType, const EHiveEngagementEventState& EngagementEventState, TSharedPtr<FJsonObject> Param) {

        switch (EngagementEventType) {
                case EHiveEngagementEventType::EVENT_TYPE:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::BEGIN:
                                        // Engagementのすべてのアクションが実行されます
                                        break;
                                case EHiveEngagementEventState::FINISH:
                                        // Engagementのすべてのアクションが完了しました
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::AUTH_LOGIN_VIEW:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // Hiveメンバーシップログインページ表示リクエスト開始
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // Hiveメンバーシップログイン実行完了(ログイン完了/ウィンドウ閉じる実行後に通過)
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::SOCIAL_INQUIRY_VIEW:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // 1:1 お問い合わせページの表示リクエストが開始されます
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // 1:1 お問い合わせページの表示が完了しました(1:1 お問い合わせウィンドウを閉じた後)
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::PROMOTION_VIEW:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // プロモーションビューの露出リクエストが開始されます
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // プロモーションビューの露出が完了しました(プロモーションウィンドウを閉じた後に配信されます)
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::COUPON:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // クーポン消費リクエストを開始
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // クーポン消費リクエストを完了し、レスポンスを送信
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::OFFERWALL_VIEW:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // オファーウォールページの表示をリクエストし始める
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // オファーウォールページの表示を完了する(オファーウォールウィンドウが閉じられた後に配信される)
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::EVENT:
                        // ゲームがホストの場合、Param結果値を渡します (キー: "api", "param")
                        // TODO: apiおよびparam値に従ってロジック処理を実行します
                        break;

                case EHiveEngagementEventType::IAP_UPDATED:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        //購入情報が変更されたため、受信するための信号
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // 購入履歴が変更されたため、受信するための信号
                                        FString TypeValue;
                                        if (Param.IsValid() && Param->TryGetStringField(TEXT("type"), TypeValue)) {
                                                if (TypeValue == TEXT("subscription")) {
                                                        // TODO: サブスクリプション製品を復元
                                                } else {
                                                        // TODO: 消耗品を復元
                                                }
                                        }

                                        break;
                        }
                        break;

                case EHiveEngagementEventType::IAP_PROMOTE:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // IAPプロモートデータの存在を渡す
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        if (!Result.IsSuccess()) {
                                                return;
                                        }

                                        // IAPプロモートデータが存在するため、プロモートAPIをチェックしてmarketPidを受け取ります
                                        FHiveIAPV4::CheckPromotePurchase(FHiveIAPV4OnCheckPromotePurchaseDelegate::CreateLambda([=](const FHiveResultAPI& PromoteResult, const FString& MarketPid) {

                                                if (!PromoteResult.IsSuccess()) {
                                                        return;
                                                }

                                                // TODO: MarketPidを渡してアイテムを購入するリクエスト
                                                FString IapPayload = TEXT("");
                                                FHiveIAPV4::Purchase(MarketPid, IapPayload, FHiveIAPV4OnPurchaseDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveIAPV4Receipt& Receipt) {
                                                        // TODO: 受け取ったReceiptでレシート検証をリクエスト
                                                }));
                                        }));
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::IAP_PURCHASE:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // IAPPurchaseスキーマで受け取ったアイテムの購入ポップアップを表示
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // 要求されたアイテムの購入が成功したかどうかはIAPPurchaseスキーマを通じて送信されます

                                        if (!Result.IsSuccess) {
                                                return;
                                        }
                                        FString ReceiptValue;
                                        if (Param.IsValid() && Param->TryGetStringField(TEXT("iapV4Receipt"), ReceiptValue)) {
                                                // 購入レシートを送信
                                                // TODO: レシートを確認し、アイテムの支払いを処理する
                                        }

                                        break;
                        }
                        break;

                case EHiveEngagementEventType::SOCIAL_MY_INQUIRY:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // 내 문의 페이지 노출 요청 시작
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // 내 문의 페이지 노출 완료 (내 문의 창 닫은 이후 전달)
                                        break;
                        }
                        break;

                case EHiveEngagementEventType::SOCIAL_PROFILE:
                        switch (EngagementEventState) {
                                case EHiveEngagementEventState::EVENT_START:
                                        // お問い合わせページの表示をリクエストし始める
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        // お問い合わせページの表示を完了する(私のお問い合わせウィンドウを閉じた後に送信される)
                                        break;
                        }
                        break;
        }
}));

APIリファレンス: Promotion::setEngagementHandler

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    
    Promotion::setEngagementHandler([ = ](ResultAPI    
                const & result, EngagementEventType engagementEventType, EngagementEventState engagementEventState, picojson::value    
                const & param) {    
                switch (engagementEventType) {    
                case EngagementEventType::EVENT_TYPE:    
                    switch (engagementEventState) {    
                    case EngagementEventState::BEGIN:    
                        // エンゲージメントのすべてのアクションが実行されます    
                        break;    
                    case EngagementEventState::FINISH:    
                        // エンゲージメントのすべてのアクションが完了しました    
                        break;    
                    }    
                    break;    
                case EngagementEventType::AUTH_LOGIN_VIEW:    
                    switch (engagementEventState) {    
                    case EngagementEventState::EVENT_START:    
                        // メンバーシップログインページの表示リクエストを開始します    
                        break;    
                    case EngagementEventState::EVENT_END:    
                        // メンバーシップログインが完了しました(ログイン完了/ウィンドウ閉鎖後に配信されます)    
                        break;    
                    }    
                    break;    
                case EngagementEventType::SOCIAL_INQUIRY_VIEW:    
                    switch (engagementEventState) {    
                    case EngagementEventState::EVENT_START:    
                        // 1:1問い合わせページの表示リクエストを開始します    
                        break;    
                    case EngagementEventState::EVENT_END:    
                        // 1:1問い合わせページの表示が完了しました(1:1問い合わせウィンドウが閉じた後に配信されます)    
                        break;    
                    }    
                    break;    
                case EngagementEventType::PROMOTION_VIEW:    
                    switch (engagementEventState) {    
                    case EngagementEventState::EVENT_START:    
                        // プロモーションビューのインプレッションリクエストを開始します    
                        break;    
                    case EngagementEventState::EVENT_END:    
                        // プロモーションビューの表示が完了しました(プロモーションウィンドウが閉じた後に配信されます)    
                        break;    
                    }    
                    break;    
                case EngagementEventType::COUPON:    
                    switch (engagementEventState) {    
                    case EngagementEventState::EVENT_START:    
                        // クーポン消費リクエストを開始します    
                        break;    
                    case EngagementEventState::EVENT_END:    
                        // クーポン消費リクエストを完了し、応答を送信します    
                        break;    
                    }    
                    break;    
                case EngagementEventType::OFFERWALL_VIEW:    
                    switch (engagementEventState) {    
                    case EngagementEventState::EVENT_START:    
                        // オファーウォールページの表示リクエストを開始します    
                        break;    
                    case EngagementEventState::EVENT_END:    
                        // オファーウォールページの表示が完了しました(オファーウォールウィンドウを閉じた後に配信されます)    
                        break;    
                    }    
                    break;    
                case EngagementEventType::EVENT:    
                    // ホストがゲームの場合、JSONObjectの結果値を送信します    
                    if (param == null) {    
                        return;    
                    }    
                    string api = param.get("api").to_str();    
                    string param = param.get("param").to_str();    
                    // TODO: apiとparamの値に応じて以下のアクションを実行します    
                    break;    


                case EngagementEventType::IAP_UPDATED:    
                    switch (engagementEventState) {    
                    case EngagementEventState::EVENT_START:    
                        // 購入詳細が変更されたため、受信するように信号を送信    
                        break;    
                    case EngagementEventState::EVENT_END:    
                        // 購入詳細が変更されたため、受信するように信号を送信    
                        string type = param.get("type").to_str();    

                        if (type != null, type == "subscription") {    
                            // TODO: サブスクリプション製品を復元する    
                            IAPV4::restoreSubscription([ = ](ResultApi    
                                const & result, vector < reference_wrapper < IAPV4Receipt >> receiptList) {    
                                if (!result.isSuccess()) {    
                                    return;    
                                }    
                                // TODO: 受け取ったreceiptListを使用してレシート検証をリクエストする    
                            });    
                            return;    
                        }    

                        // TODO: 消耗品を復元する    
                        IAPV4::restore([ = ](ResultAPI    
                            const & result, vector < reference_wrapper < IAPV4Receipt >> receiptList) {    
                            if (!result.isSuccess()) {    
                                return;    
                            }    
                            // TODO: 受け取ったreceiptListを使って領収書の確認をリクエストする    
                        });    
                        break;    
                    }    
                break;    

            case EngagementEventType::IAP_PROMOTE:    
                switch (engagementEventState) {    
                case EngagementEventState::EVENT_START:    
                    // IAP Promoteデータが存在するかどうかを伝える    
                    break;    
                case EngagementEventState::EVENT_END:    
                    if (!result.isSuccess()) {    
                        return;    
                    }    

                    // IAPプロモートデータが存在するため、marketPidはプロモートAPIをチェックすることで受信されます。    
                    IAPV4::checkPromotePurchase([ = ](ResultApi    
                        const & promoteResult, string marketPid) {    
                        if (!promoteResult.isSuccess()) {    
                            return;    
                        }    

                        // TODO: 配信されたマーケットPidアイテムの購入リクエスト    
                        IAPV4::purchase(marketPid, "", [ = ](ResultApi    
                            const & purchaseResult, IAPV4Receipt    
                            const * receipt) {    
                            if (!purchaseResult.isSuccess()) {    
                                return;    
                            }    
                            // TODO: 受け取ったレシートでレシート検証をリクエスト    
                        });    
                    });    
                    break;    
                }    
            break;    

            case EngagementEventType::IAP_PURCHASE:    
                switch (engagementEventState) {    
                case EngagementEventState::EVENT_START:    
                    // IAPPurchaseスキーマを通じて受け取ったアイテムを購入するためのポップアップが表示されます。    
                    break;    
                case hive::EngagementEventState::EVENT_END:    
                    // 要求されたアイテムの購入が成功したかどうかがIAPPurchaseスキーマを通じて伝えられます。    
                    if (result.isSucces()) {    
                        return;    
                    }    
                    picojson::value receiptJson = param.get("iapV4Receipt");    
                    shared_ptr receipt = IAPV4Receipt::create(receiptJson);    
                    break;    
                }    
            break;    

            case EngagementEventType::SOCIAL_MY_INQUIRY:    
                switch (engagementEventState) {    
                case EngagementEventState::EVENT_START:    
                    // 私の問い合わせページの露出リクエストを開始    
                    break;    
                case EngagementEventState::EVENT_END:    
                    // 私の問い合わせページが露出されました(私の問い合わせウィンドウが閉じられた後に配信されます)    
                    break;    
                }    
            break;    

            case EngagementEventType::SOCIAL_PROFILE:    
                switch (engagementEventState) {    
                case EngagementEventState::EVENT_START:    
                    // プロフィールページの露出リクエストを開始    
                    break;    
                case EngagementEventState::EVENT_END:    
                    // プロフィールページの露出が完了しました(プロフィールウィンドウを閉じた後に配信されます)    
                    break;    
                }    
            break;    
        }    
});

APIリファレンス: setEngagementListener

import com.hive.IAPV4    
    import com.hive.Promotion    
    import com.hive.ResultAPI    
    Promotion.setEngagementListener(object: Promotion.EngagementListener {    
                override fun onEngagement(    
                        result: ResultAPI,    
                        engagementEventType: Promotion.EngagementEventType,    
                        engagementEventState: Promotion.EngagementEventState,    
                        param: JSONObject ?    
                    ) {    
                        // Hive SDKの介入タイプに応じて分岐したコード    
                        when(engagementEventType) {    
                                Promotion.EngagementEventType.EVENT_TYPE -> when(engagementEventState) {    
                                    Promotion.EngagementEventState.BEGIN -> {    
                                        // Engagementのすべてのアクションが実行される    
                                    }    
                                    Promotion.EngagementEventState.FINISH -> {    
                                        // Engagementのすべてのアクションが完了する    
                                    }    
                                    else -> {}    
                                }    
                                Promotion.EngagementEventType.AUTH_LOGIN_VIEW -> when(engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // メンバーシップログインページの露出リクエストを開始    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // メンバーシップログインが完了(ログイン完了/ウィンドウが閉じた後に配信)    
                                    }    
                                    else -> {}    
                                }    
                                Promotion.EngagementEventType.SOCIAL_INQUIRY_VIEW -> when(engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // 1:1問い合わせページの露出リクエストを開始    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // 1:1問い合わせページの露出が完了(1:1問い合わせウィンドウが閉じた後に配信)    
                                    }    
                                    else -> {}    
                                }    
                                Promotion.EngagementEventType.PROMOTION_VIEW -> when(engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // プロモーションビューのインプレッションリクエストを開始    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // プロモーションビューの露出が完了(プロモーションウィンドウが閉じた後に配信)    
                                    }    
                                    else -> {}    
                                }    
                                Promotion.EngagementEventType.COUPON -> when(engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // クーポン消費リクエストを開始    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // クーポン消費リクエストを完了し、応答を送信    
                                    }    
                                    else -> {}    
                                }    
                                Promotion.EngagementEventType.OFFERWALL_VIEW -> when(engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // オファーウォールページの露出リクエストを開始    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // オファーウォールページの露出が完了(オファーウォールウィンドウが閉じた後に配信)    
                                    }    
                                    else -> {}    
                                }    
                                Promotion.EngagementEventType.EVENT -> {    

                                    // ホストがゲームの場合、JSONObjectの結果値を送信する    
                                    if (param == null) {    
                                        return    
                                    }    
                                    val api = param.optString("api")    
                                    val param = param.optString("param")    
                                    // TODO: apiおよびparamの値に応じて以下のアクションを実行する    
                                }    
                                Promotion.EngagementEventType.IAP_UPDATED -> when (engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // 購入履歴が変更されたため、受け入れるように信号を送信する(Restore()メソッドを呼び出す)    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // 購入履歴が変更されたため、受け入れるように信号を送信する(Restore()メソッドを呼び出す)    
                                        val iapUpdateType = param?.optString("type")    

                                        if (iapUpdateType == "subscription") {    
                                            // TODO: サブスクリプション製品を復元する    
                                            IAPV4.restoreSubscription(object : IAPV4.IAPV4RestoreListener {    
                                                override fun onIAPV4Restore(    
                                                    result: ResultAPI,    
                                                    iapv4ReceiptList: ArrayList<IAPV4.IAPV4Receipt>?    
                                                ) {    
                                                    if (!result.isSuccess) {    
                                                        return    
                                                    }    
                                                    // TODO: 受け取ったiapv4ReceiptListを使用して領収書の検証をリクエストする    
                                                }    
                                            })    
                                        } else {    
                                            IAPV4.restore(object : IAPV4.IAPV4RestoreListener {    
                                                override fun onIAPV4Restore(    
                                                    result: ResultAPI,    
                                                    iapv4ReceiptList: ArrayList<IAPV4.IAPV4Receipt>?    
                                                ) {    
                                                    if (!result.isSuccess) {    
                                                        return    
                                                    }    
                                                    // TODO: 受け取ったiapv4ReceiptListを使用して領収書の検証をリクエストする    
                                                }    
                                            })    
                                        }    
                                    }    
                                    else -> {}    
                                }    

                                Promotion.EngagementEventType.IAP_PURCHASE -> when (engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // IAPPurchaseスキーマを通じて受け取ったアイテムを購入するためのポップアップが表示されます。    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // 要求されたアイテムの購入が成功したかどうかは、IAPPurchaseスキーマを通じて通知されます。    
                                        if (!result.isSuccess) {    
                                            return    
                                        }    
                                        val iapV4Receipt = param?.optJSONObject("iapV4Receipt")    
                                    }    
                                    else -> {}    
                                }    

                                Promotion.EngagementEventType.SOCIAL_MYINQUIRY_VIEW -> when (engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // 私の問い合わせページの露出リクエストを開始    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // 私の問い合わせページが露出されました(私の問い合わせウィンドウが閉じられた後に配信されます)    
                                    }    
                                    else -> {}    
                                }    

                                Promotion.EngagementEventType.SOCIAL_PROFILE_VIEW -> when (engagementEventState) {    
                                    Promotion.EngagementEventState.START -> {    
                                        // プロフィールページの露出リクエストを開始    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // プロフィールページの露出が完了しました(プロフィールウィンドウを閉じた後に配信されます)    
                                    }    
                                    else -> {}    
                                }    

                                else -> {}    
                            }    
                        }    
               })

APIリファレンス: com.hive.Promotion.setEngagementListener

import com.hive.IAPV4;    
    import com.hive.Promotion;    
    import com.hive.ResultAPI;    
    Promotion.INSTANCE.setEngagementListener((result, engagementEventType, engagementEventState, param) -> {    
            switch (engagementEventType) {    
                case EVENT_TYPE:    
                    switch (engagementEventState) {    
                        case BEGIN:    
                            // Engagementのすべてのアクションが実行されます    
                            break;    
                        case FINISH:    
                            // Engagementのすべてのアクションが完了しました    
                            break;    
                    }    
                    break;    
                case AUTH_LOGIN_VIEW:    
                    switch (engagementEventState) {    
                        case START:    
                            // メンバーシップログインページの表示リクエストを開始します    
                            break;    
                        case END:    
                            // メンバーシップログインが完了しました(ログイン完了/ウィンドウが閉じた後に配信されます)    
                            break;    
                    }    
                    break;    
                case SOCIAL_INQUIRY_VIEW:    
                    switch (engagementEventState) {    
                        case START:    
                            // 1:1問い合わせページの表示リクエストを開始します    
                            break;    
                        case END:    
                            // 1:1問い合わせページの表示が完了しました(1:1問い合わせウィンドウが閉じた後に配信されます)    
                            break;    
                    }    
                    break;    
                case PROMOTION_VIEW:    
                    switch (engagementEventState) {    
                        case START:    
                            // プロモーションビューの表示リクエストを開始します    
                            break;    
                        case END:    
                            // プロモーションビューの表示が完了しました(プロモーションウィンドウが閉じた後に配信されます)    
                            break;    
                    }    
                    break;    
                case COUPON:    
                    switch (engagementEventState) {    
                        case START:    
                            // クーポン消費リクエストを開始します    
                            break;    
                        case END:    
                            // クーポン消費リクエストを完了し、レスポンスを送信します    
                            break;    
                    }    
                    break;    
                case OFFERWALL_VIEW:    
                    switch (engagementEventState) {    
                        case START:    
                            // オファーウォールページの表示リクエストを開始します    
                            break;    
                        case END:    
                            // オファーウォールページの表示が完了しました(オファーウォールウィンドウを閉じた後に配信されます)    
                            break;    
                    }    
                    break;    
                case EVENT:    
                    // ホストがゲームの場合、JSONObjectの結果値を送信します    
                    if (param == null)    
                        return;    

                    String api = param.optString("api");    
                    String paramData = param.optString("param");    
                    // TODO: Perform the following actions according to the api and param values    
                    break;    
                case IAP_UPDATED:    
                    switch (engagementEventState) {    
                        case START:    
                            // Signal to accept as purchase history has changed (call Restore() method)    
                            break;    
                        case END:    
                            // Signal to accept as purchase history has changed (call Restore() method)    
                            if(param == null)    
                                return;    

                            String iapUpdateType = param.optString("type");    
                            if(iapUpdateType == "subscription") {    
                                // TODO: サブスクリプション製品を復元する    
                                IAPV4.INSTANCE.restoreSubscription((result1, iapv4ReceiptList) -> {    
                                    if (!result1.isSuccess()) {    
                                        return;    
                                    }    
                                    // TODO: 受け取ったiapv4ReceiptListを使用してレシート検証をリクエストする    
                                });    
                            } else {    
                                IAPV4.INSTANCE.restore((result2, iapv4ReceiptList) -> {    
                                    if (!result2.isSuccess()) {    
                                        return;    
                                    }    
                                    // TODO: 受け取ったiapv4ReceiptListを使用してレシート検証をリクエストする    
                                });    
                            }    
                            break;    
                    }    
                    break;    
                case IAP_PURCHASE:    
                    switch (engagementEventState) {    
                        case START:    
                            // IAPPurchaseスキーマを通じて受け取ったアイテムの購入のためのポップアップが表示されます。    
                            break;    
                        case END:    
                            // リクエストされたアイテムの購入が成功したかどうかは、IAPPurchaseスキーマを通じて伝えられます。    
                            if(!result.isSuccess() || param == null)    
                                return;    

                            JSONObject iapV4Receipt = param.optJSONObject("iapV4Receipt");    
                            break;    
                    }    
                    break;    
                case SOCIAL_MYINQUIRY_VIEW:    
                    switch (engagementEventState) {    
                        case START:    
                            // お問い合わせページの表示リクエストを開始    
                            break;    
                        case END:    
                            // お問い合わせページが表示されました(お問い合わせウィンドウが閉じられた後に配信されます)    
                            break;    
                    }    
                    break;    
                case SOCIAL_PROFILE_VIEW:    
                    switch (engagementEventState) {    
                        case START:    
                            // プロフィールページの表示リクエストを開始    
                            break;    
                        case END:    
                            // プロフィールページの表示が完了しました(プロフィールウィンドウを閉じた後に配信されます)    
                            break;    
                    }    
                    break;    
        }    
});

APIリファレンス: setEngagementHandler(_:)

import HIVEService    
    PromotionInterface.setEngagementHandler() { result, engagementEventType, engagementState, param in    

         switchengageEventType {    
             case.type:    
                 switch engagementState{    
                     case .begin:    
                         // Engagementのすべてのアクションが実行されます    
                     case .finish:    
                         // Engagementのすべてのアクションが完了しました    
                 }    

             case .authLoginView:    
                 switch engagementState {    
                     case.eventStart:    
                         // メンバーシップログインページ露出リクエストの開始    
                     case .eventEnd:    
                         // メンバーシップログイン完了(ログイン完了/ウィンドウ閉鎖後に配信)    
                 }    

             case .socialInquiryView:    
                 switch engagementState {    
                     case.eventStart:    
                         // 1:1問い合わせページの表示リクエスト開始    
                     case .eventEnd:    
                         // 1:1問い合わせページの表示完了(1:1問い合わせウィンドウが閉じた後に配信)    
                 }    

             ケース .promotionView:    
                 スイッチ engagementState {    
                     ケース.eventStart:    
                         // プロモーションビューのインプレッションリクエストを開始    
                     ケース .eventEnd:    
                         // プロモーションビューの露出が完了しました(プロモーションウィンドウが閉じた後に配信されます)    
                 }    

             ケース .coupon:    
                 スイッチ engagementState {    
                     ケース.eventStart:    
                         // クーポン消費リクエストを開始    
                     ケース .eventEnd:    
                         // クーポン消費リクエストを完了し、レスポンスを送信    
                 }    

             case .offerwallView:    
                 switch engagementState {    
                     case.eventStart:    
                         // オファーウォールページの露出リクエストを開始    
                     case .eventEnd:    
                         // オファーウォールページの露出が完了しました(オファーウォールウィンドウを閉じた後に配信されます)    
                 }    

             case.event:    
                // ホストがゲームの場合、JSONObjectの結果値を送信する    

                let api = param?["api"]    
                    let param = param?["param"]    

                // APIおよびパラメータ値に従って要求されたアクションを実行します    
            case.iapPromote:    
                switch engagementState {    
                    case.eventStart:    
                        // IAP Promoteデータが存在するかどうかを伝えます    
                        case.eventEnd:    
                        if ! result.isSuccess() {    
                        return    
                    }    
                    // IAP Promoteデータが存在するため、marketPidはPromote APIのチェックを通じて受信されます。    
                    IAPV4Interface.checkPromotePurchase() {    
                        promoteResult,    
                        marketPid in    
                        if !promoteResult.isSuccess() {    
                            return    
                        }    
                        // TODO: 配信されたmarket Pidアイテムの購入をリクエストします    
                        IAPV4Interface.purchase(marketPid, additionalInfo: nil) {    
                            purchaseResult,    
                            receipt in    
                            if !purchaseResult.isSuccess() {    
                                return    
                            }    
                            // TODO: 受信したレシートでレシート検証をリクエストします    
                        }    
                    }    

            case.iapUpdated:    
                switch engagementState {    
                    case.eventStart:    
                        // 購入詳細が変更されたため、受信信号を送信    
                        case.eventEnd:    
                        // 購入詳細が変更されたため、受信信号を送信    
                        if    
                    let type = param ? ["type"],    
                        type == "subscription" {    
                            // TODO: サブスクリプション商品を復元    
                            IAPV4Interface.restoreSubscription() {    
                                (result, receiptList) in    
                                // TODO: 受信したreceiptListを使用してレシートの検証をリクエスト    
                            }    
                            return    
                        }    
                    // TODO: 消耗品を復元    
                    IAPV4Interface.restore() {    
                        (result, receiptList) in    
                        // TODO: 受信したreceiptListを使用してレシートの検証をリクエスト    
                    }    
                }    
            case.iapPurchase:    
                switch engagementState {    
                    case.eventStart:    
                        // IAPPurchaseスキーマを通じて受け取ったアイテムの購入のためのポップアップが表示されます。    
                        case.eventEnd:    
                        // 要求されたアイテムの購入が成功したかどうかは、IAPPurchaseスキーマを通じて伝えられます。    
                        if result.isSuccess() {    
                        let receipt = param ? ["iapV4Receipt"];    
                    }    
                }    
            case.socialMyInquiry:    
                switch engagementState {    
                    case.eventStart:    
                        // マイ問い合わせページの露出リクエストを開始    
                        case.eventEnd:    
                        // マイ問い合わせページが露出されました(マイ問い合わせウィンドウが閉じられた後に配信されます)    
                }    
            case.socialProfile:    
                switch engagementState {    
                    case.eventStart:    
                        // プロフィールページの露出リクエストを開始    
                        case.eventEnd:    
                        // プロフィールページの露出が完了しました(プロフィールウィンドウを閉じた後に配信されます)    
                }    
        }    
}

APIリファレンス: HIVEPromotion setEngagementHandler

#import <HIVEService/HIVEService-Swift.h>    
    [HIVEPromotion setEngagementHandler: ^(HIVEResultAPI *result, HIVEEngagementEventType engagementEventType, HIVEEngagementEventState engagementState, NSDictionary *param) {    

    switch (engagementEventType) {    
                case HIVEEngagementEventTypeType:    
                    switch (engagementState) {    
                        case HIVEEngagementStateBegin:    
                            // エンゲージメントのすべてのアクションが実行されます    
                            break;    
                        case HIVEEngagementStateFinish:    
                            // エンゲージメントのすべてのアクションが完了しました    
                            break;    
                    }    
                    break;    

                case HIVEEngagementEventTypeAuthLoginView:    
                    switch (engagementState) {    
                        case HIVEEngagementStateEventStart:    
                            // メンバーシップログインページの露出リクエストを開始    
                            break;    
                        case HIVEEngagementStateEnd:    
                            // メンバーシップログイン完了(ログイン完了/ウィンドウ閉鎖後に配信される)    
                            break;    
                    }    
                    break;    

                case HIVEEngagementEventTypeSocialInquiryView:    
                    switch (engagementState) {    
                        case HIVEEngagementStateEventStart:    
                            // 1:1問い合わせページの表示リクエスト開始    
                            break;    
                        case HIVEEngagementStateEnd:    
                            // 1:1問い合わせページの表示完了(1:1問い合わせウィンドウが閉じた後に配信される)    
                            break;    
                    }    
                    break;    

                case HIVEEngagementEventTypePromotionView:    
                    switch (engagementState) {    
                        case HIVEEngagementStateEventStart:    
                            // プロモーションビューのインプレッションリクエストを開始    
                            break;    
                        case HIVEEngagementStateEnd:    
                            // プロモーションビューの露出が完了しました(プロモーションウィンドウが閉じた後に配信されます)    
                            break;    
                    }    
                    break;    

                case HIVEEngagementEventTypeCoupon:    
                    switch (engagementState) {    
                        case HIVEEngagementStateEventStart:    
                            // クーポン消費リクエストを開始    
                            break;    
                        case HIVEEngagementStateEnd:    
                            // クーポン消費リクエストを完了し、レスポンスを送信    
                            break;    
                    }    
                    break;    

                case HIVEEngagementEventTypeOfferwallView:    
                    switch (engagementState) {    
                        case HIVEEngagementStateEventStart:    
                            // オファーウォールページの露出リクエストを開始    
                            break;    
                        case HIVEEngagementStateEnd:    
                            // オファーウォールページの露出が完了しました(オファーウォールウィンドウを閉じた後に配信されます)    
                            break;    
                    }    
                    break;    

                case HIVEEngagementEventTypeEvent:    
                    // ゲームがホストの場合、JSONObjectの結果値を送信します    
                    if (param == nil) {    
                        return;    
                    }    
                    NSString * api = [param objectForKey: @ "api"];    
                    NSSString * param = [param objectForKey: @ "param"];    
                    // TODO: apiおよびparamの値に従って要求されたアクションを実行します    
                    break;    

                case HIVEEngagementEventTypeIapPromote:    
                    switch (engagementState) {    
                        case HIVEEngagementStateEventStart:    
                            // IAPプロモートデータが存在するかどうかを伝える    
                            break;    
                        case HIVEEngagementStateEventEnd:    
                            if (![result isSuccess]) {    
                                return;    
                            }    
                            // IAPプロモートデータが存在するため、marketPidはプロモートAPIをチェックすることで受け取ります。    
                            [HIVEIAPV4 checkPromotePurchase: ^ (HIVEResultAPI * promoteResult, NSString * marketPid) {    
                                if (![promoteResult isSuccess]) {    
                                    return;    
                                }    
                                // TODO: 受け取ったmarket Pidを使用してアイテムの購入をリクエストする    
                                [HIVEIAPV4 purchase: marketPid additionalInfo: nil handler: ^ (HIVEResultAPI * purchaseResult, HIVEIAPV4Receipt * receipt) {    
                                    if (![purchaseResult isSuccess]) {    
                                        return;    
                                    }    
                                    // TODO: 受け取った領収書で領収書の検証をリクエストする    
                                }];    
                            }];    
                            break;    
                        }    
                    break;    
                case HIVEEngagementEventTypeIapUpdated:    
                    switch (engagementState) {    
                    case HIVEEngagementStateEventStart:    
                        // 購入の詳細が変更されたため、受信する信号を送信する    
                        break;    
                    case HIVEEngagementStateEventEnd:    
                        // 購入の詳細が変更されたため、受信する信号を送信する    
                        NSString * type = [param objectForKey: @ "type"];    
                        if (type != nil && [type isEqualToString: @ "subscription"]) {    
                            // TODO: サブスクリプション製品を復元する    
                            [HIVEIAPV4 restoreSubscription: ^ (HIVEResultAPI * result, NSArray < HIVEIAPV4Receipt * > * receiptList) {    
                                // TODO: 受け取ったreceiptListを使用して領収書の検証をリクエストする    
                            }];    
                            return;    
                        }    
                        // TODO: 消耗品を復元する    
                        [HIVEIAPV4 restore: ^ (HIVEResultAPI * result, NSArray < HIVEIAPV4Receipt * > * receiptList) {    
                            // TODO: 受け取ったreceiptListを使用して領収書の検証をリクエストする    
                        }];    
                        break;    
                    }    
                case HIVEEngagementEventTypeIapPurchase:    
                    switch (engagementState) {    
                    case HIVEEngagementStateEventStart:    
                        // IAPPurchaseスキーマを通じて受け取ったアイテムの購入ポップアップが表示されます。    
                        break;    
                    case HIVEEngagementStateEventEnd:    
                        // リクエストされたアイテムの購入が成功したかどうかがIAPPurchaseスキーマを通じて伝えられます。    
                        if(![result isSuccess]) {    
                            return;    
                        }    
                        HIVEIAPV4Receipt * receipt = [param objectForKey: @ "iapV4Receipt"];    
                        break;    
                    }    
                break;    
                case HIVEEngagementEventTypeSocialMyInquiry:    
                    switch (engagementState) {    
                    case HIVEEngagementStateEventStart:    
                        // マイインクワイアリページの露出リクエストを開始する    
                        break;    
                    case HIVEEngagementStateEnd:    
                        // マイインクワイアリページが露出されました(マイインクワイアリウィンドウが閉じられた後に配信されます)    
                        break;    
                    }    
                break;    
                case HIVEEngagementEventTypeSocialProfile:    
                    switch (engagementState) {    
                    case HIVEEngagementStateEventStart:    
                        // プロフィールページの露出リクエストを開始する    
                        break;    
                    case HIVEEngagementStateEnd:    
                        // プロフィールページの露出が完了しました(プロフィールウィンドウを閉じた後に配信されます)    
                        break;    
                    }    
                break;    
                }    
}];

ユーザーエンゲージメントイベントを処理するための設定

Hive SDKは、ログインが完了していれば、一般的に受信リクエストを処理することができます。ただし、初回実行などの場合、ログイン後であっても、ゲームサーバーDBの作成前であれば、補償支払いなどができない場合があります。したがって、ゲームからHive SDKに**UEイベント処理が可能かどうか**を通知する必要があります..

  • イベント処理のデフォルト設定はfalseです。
  • イベント処理がtrueに設定されている場合、既存のキューに入っているイベントは即座に処理され、その後のイベントも即座に処理されます。
  • イベント処理がfalseに設定されている場合、受信したイベントは設定がtrueに変わるまでキューに入れられます。
  • trueに設定するのは**ログインの後**に呼び出す必要があり、falseに設定することには呼び出しの時間に制限はありません。
  • (Hive SDK v4.4.0以降) Hive SDKを使用しているすべてのゲームは、このAPIを実装してCPI報酬を提供する必要があります。
  • ユーザーがユーザー獲得によって生成された招待リンクやQRコード、またはオファーウォールページを通じてアプリに入ると、エントリ履歴の転送と報酬支払いリクエストは、このAPIを呼び出すことによって変更された状態に応じて実行されます。
  • ゲームがUEの機能を実行できる時点でAPIを呼び出す必要があります。
Note
  • **Promotion**クラスのsetAdditionalInfo()メソッドを使用して、setEngagementReady()メソッドを呼び出す前に現在のユーザーのゲームデータを送信します。クーポンまたはユーザー獲得を使用して送信されたゲーム情報は、ゲームスタジオで利用可能です。
  • Hive SDKのバージョンによって、setEngagementReady()メソッドのクラスが異なります。

Hive SDK v4.5.0 以降

**Promotion**クラスのsetEngagementReady()メソッドを使用して、UEイベントを処理できるかどうかを設定します。以下は、trueとして設定するためのサンプルコードです。

API リファレンス: hive.Promotion.setEngagementReady

using hive;    
    Boolean isReady = true;    
    ResultAPI result = Promotion.setEngagementReady(isReady);    
    if (result.isSuccess()) {    
        // call successful    
}
#include "HivePromotion.h"

bool bIsReady = true;
TOptional<FHiveResultAPI> Result = FHivePromotion::SetEngagementReady(bIsReady);

if (Result.IsSet()) {
        FHiveResultAPI& ResultAPI = Result.GetValue();
        if (ResultAPI.IsSuccess()) {
                // API呼び出し成功
        }
}

APIリファレンス: Promotion::setEngagementReady

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    
    bool isReady = true;    
    ResultAPI result = Promotion::setEngagementReady(isReady);    
    if (result.isSuccess()) {    
        // call successful    
}

APIリファレンス: Promotion.setEngagementReady

import com.hive.Promotion    
    import com.hive.ResultAPI    
    val isReady = true    
    val result = Promotion.setEngagementReady(isReady)    
    if (result.isSuccess) {    
         // call successful    
}

APIリファレンス: com.hive.Promotion.setEngagementReady

import com.hive.Promotion;    
    import com.hive.ResultAPI;    
    boolean isReady = true;    
    ResultAPI result = Promotion.INSTANCE.setEngagementReady(isReady);    
    if (result.isSuccess()) {    
         // call successful    
}

API リファレンス: PromotionInterface .setEngagementReady

import HIVEService    
    let isReady = true    
    let result = PromotionInterface.setEngagementReady(isReady)    
    if (result.isSuccess()) {    
    // call successful    
}

APIリファレンス: HIVEPromotion:setEngagementReady

#import <HIVEService/HIVEService-Swift.h>    
    BOOL isReady = YES;    
    HIVEResultAPI *result = [HIVEPromotion setEngagementReady: isReady];    
    if ([result isSuccess]) {    
        // call successful    
}

クーポンを引き換えるリクエストの結果コード

クーポンイベントを処理中にプロモコードエラーやその他の問題が発生した場合、UEモジュールはHiveが定義したエラーコードに従ってポップアップを表示し、ユーザーに状況を通知します。

クーポンスキームURLのホスト値は常にhiveです。

コード 説明 コード 説明
200 間違ったパラメータへのアクセス 305 ユニーククーポンの使用可能数が期限切れ
201 間違ったハッシュ値を送信 306 期限切れのクーポン
202 アカウントの使用制限を超えた 307 新規/既存ユーザーまたはアクティブユーザーシステムエラーを区別するための必要なデータが不足
203 クーポンの使用可能数を超えた 308 このイベントの対象ではありません。既存ユーザーのみ
204 AppIDと発行されたクーポンが一致しない 309 このイベントの対象ではありません。新規ユーザーのみ
300 間違った数字コードのクーポン 310 ゲームに登録なしの新規/既存イベント
301 受け取ったプロモーションにクーポンデータがない 400 すべてのアイテムの送信に失敗
302 クーポンコードの検索に失敗 401 複数のアイテムの送信に失敗
303 使用中のクーポン 500 DBエラー
304 使用済みのクーポン 501 通信失敗