ข้ามไปที่เนื้อหา

การมีส่วนร่วมของผู้ใช้ (UE, ลิงก์ลึก)

การมีส่วนร่วมของผู้ใช้ (UE) มีฟังก์ชัน Deep Link พร้อมคูปอง ซึ่งช่วยให้เชิญผู้เล่นเกมไปยังสถานที่เฉพาะหรือหน้ากิจกรรมในเกมด้วยการแตะที่ลิงก์เพียงครั้งเดียว หรือเพื่อรับรางวัลโดยตรง

ใน SDK ของ Hive การกระทำที่คุณต้องการทำผ่าน URL ของแผนคือการกระทำการมีส่วนร่วมของผู้ใช้ เมื่อเกมทำการกระทำที่ระบุใน URL ที่กำหนด Hive จะขอให้เกมในรูปแบบของเหตุการณ์การมีส่วนร่วมของผู้ใช้

การมีส่วนร่วมของผู้ใช้คืออะไร?

UE เป็นบริการที่ดำเนินการคำขอจากภายในและภายนอกของแอปพลิเคชัน และดำเนินการฟังก์ชันต่อไปนี้:

  • ดำเนินการ URL แผนจากภายนอกแอปผ่านลิงก์ลึกหรือตัวแจ้งเตือน
  • ดำเนินการ URL แผนจากภายในแอปผ่านการทำงานร่วมกัน
  • ด้วย Hive SDK v4.4.0 และเวอร์ชันที่ใหม่กว่า,
    • ส่งประวัติการเข้าถึงไปยังแอปเกมผ่านเส้นทางภายนอก เช่น รหัส QR และลิงก์ที่สร้างโดยการจัดหาผู้ใช้เพื่อขอรับรางวัล
    • ตรวจสอบให้แน่ใจว่า Game Client ใช้ API setEngagementReady และส่งคำขอเมื่อโมดูล Hive SDK พร้อมใช้งานเพื่อดำเนินการฟังก์ชันของ UE ในการประมวลผลรางวัล CPI และอื่นๆ

วิธีการระบุ URL ของสคีมาที่

Scheme URL เป็นรูปแบบในการแสดงการกระทำของ UE มันบ่งชี้ว่าการกระทำใดที่ถูกกำหนดใน Scheme URL และใช้กับใคร Scheme URL ที่ใช้ Hive จะปฏิบัติตามรูปแบบมาตรฐานที่เรียกว่า Uniform Resource Identifier (URI) และประกอบด้วยฟิลด์บริการและฟิลด์ทั่วไป

  • รูปแบบมาตรฐาน: {scheme}://{host}/{path}?{query}
  • รูปแบบ Hive: {scheme}://{host}/{api}?{parameters}
  • ฟิลด์บริการ: {scheme}://{host} | ฟิลด์ทั่วไป: /{api}?{parameters}
Note

Hive format หมายถึงเหตุการณ์ที่ประมวลผลบน Hive SDK และรวมถึง {api} ที่กำหนดไว้ตามที่แสดงในส่วน Common Field ด้วยเหตุนี้ ฟิลด์ทั่วไปของ Hive format จะประกอบด้วย /{api}?{parameters} แทนที่จะเป็น /{path}?{query} ของรูปแบบมาตรฐาน สำหรับรายการของ {api} ที่รวมอยู่ใน Hive format โปรดดูที่ Common Field.

การใช้ URL scheme ในเกม

นอกจากการใช้ UE สำหรับการเชื่อมโยงลึกของคูปองแล้ว หากคุณต้องการย้ายไปยังสถานที่เฉพาะในเกม (เช่น ดันเจี้ยน, กล่องของขวัญ, ร้านค้า ฯลฯ) เพื่อวัตถุประสงค์ในการส่งเสริมการขายของคุณ ให้แน่ใจว่าคุณได้กำหนดเส้นทางในเกมและให้ URL ของ Scheme URL นี้จะถูกแปลงเป็น URL ปลายทางบน Hive Console และส่งมอบให้กับผู้ใช้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ URL ของ Scheme ในเกม ดูที่ หากโฮสต์ของ Scheme URL เป็นเกม

ฟิลด์บริการ

ฟิลด์บริการของ URL โครงการคือ {scheme}://{host} ซึ่งระบุเส้นทางที่ลิงก์ลึกถูกส่งไปยัง Hive SDK และประกอบด้วย scheme และ host.

แผน

มีสามเส้นทางที่ URL ถูกส่งไปยังแอป:

Push

ไม่ว่าจะเป็นแอปเกมที่ถูกกำหนดโดย URL ของ Scheme กำลังทำงานอยู่หรือไม่ ผู้รับ URL จะได้รับข้อความแจ้งเตือนที่มี URL ของ Scheme เมื่อผู้รับแตะที่ข้อความ URL ของ Push Scheme จะถูกส่งไปยัง Hive Client และจากนั้น Hive Client จะประมวลผล URL

  • ตัวอย่างเช่น push://{host}/{path}?{query}
Deep Link

ถ้าผู้ใช้แตะ URL ผ่านวิธีการภายนอก เช่น ข้อความและเว็บเบราว์เซอร์ และถ้าฟิลด์สเคมของ URL นี้ถูกกรอกด้วย AppID ของเกมเฉพาะบนอุปกรณ์ของผู้ใช้ เกมจะถูกเรียกใช้งานและ URL จะถูกส่งไปยัง Hive SDK ในกรณีที่แอปเกมไม่ได้ติดตั้ง มันจะย้ายไปยังหน้าการติดตั้ง.

  • ตัวอย่างเช่น com.com2us.example://{host}/{path}?{query}

ผู้ใช้ที่ติดตามจะแตกต่างกันไปขึ้นอยู่กับสถานะของการติดตั้งเกมเมื่อใช้โครงการลิงก์ลึก

1. <b>ถ้าเกมถูกติดตั้งแล้ว</b>
เมื่อแตะลิงก์ลึก ผู้ใช้จะตรวจสอบเคล็ดลับเกมก่อน และย้ายไปที่เกม
![](https://developers.withhive.com/wp-content/uploads/2024/05/deep_link_installed_240517.png){width="700px"}
2. <b>ถ้าเกมไม่ได้ติดตั้ง</b>
เมื่อผู้ใช้แตะลิงก์ในข้อความ จะมีการแจ้งเตือนว่ารางวัลมีให้หลังจากการติดตั้งเกม เนื่องจากเกมไม่ได้ติดตั้ง จะถูกย้ายไปยังตลาดดาวน์โหลด (Google Play Store / Apple App Store)
![](http://developers.withhive.com/wp-content/uploads/2018/04/23_develop-promotion_userengagement_3_en.png){width="700px"}
Interwork

หากผู้ใช้แตะลิงก์ URL เฉพาะของหน้าส่งเสริมการขาย (แบนเนอร์, ข้อความแจ้งเตือน, ฯลฯ) ของ Hive SDK ขณะที่แอปกำลังทำงานอยู่ และฟิลด์สคีมของ URL นั้นคือ "interwork" URL จะถูกส่งไปยัง Hive SDK.

+ ตัวอย่างเช่น <i>interwork://{host}/{path}?{query}</i>

คุณสามารถเรียกคำขอสำหรับการประมวลผลแผนการทำงานร่วมกันโดยใช้ <b>processURI</b> API เพื่อส่ง URL จากเกมไปยัง Hive SDK โดยตรง.

=== "Unity"

    ```cs
    String uri = "";


    Boolean result = Promotion.processURI(uri);

    if(result) {
            // ความสำเร็จในการลงทะเบียนเหตุการณ์ UE
    } else {
            // รูปแบบไม่เหมาะสมสำหรับ Scheme URI
    }
    ```

=== "C++"

    ```cpp
    std::string uri = "";


    bool result = Promotion::processURI(uri);

    if(result) {
            // การลงทะเบียนเหตุการณ์ UE สำเร็จ
    } else {
            // รูปแบบไม่เหมาะสมสำหรับ Scheme URI
    }
    ```

=== "แอนดรอยด์"

    ```java
    String uri = "";


    boolean result = Promotion.processURI(uri);

    if(result) {
            // การลงทะเบียนเหตุการณ์ UE สำเร็จ
    } else {
            // รูปแบบไม่เหมาะสมสำหรับ Scheme URI
    }
    ```

=== "iOS"

    ```swift

    NSString* uri = @"";


    bool result = [HIVEPromotion processURI:uri];

    if(result) {
            // การลงทะเบียนเหตุการณ์ UE สำเร็จ
    } else {
            // รูปแบบไม่เหมาะสมสำหรับ Scheme URI
    }
    ```

โฮสต์

โฮสต์ ระบุว่าใครเป็นผู้รับผิดชอบต่อการกระทำที่ร้องขอ:

  • เกม: การกระทำที่เกมต้องรับผิดชอบ
  • ฮันนี่: การกระทำที่ Hive SDK ต้องรับผิดชอบ

ฟิลด์ทั่วไป

ฟิลด์ทั่วไปของ Scheme URL คือ /{api}/{parameters} ซึ่งระบุการดำเนินการที่ต้องประมวลผลรวมถึงข้อมูลที่จำเป็น:

API ชี้แจงว่าควรดำเนินการใดผ่าน URL การดำเนินการต่อไปนี้สามารถทำได้ขึ้นอยู่กับโฮสต์:

หากโฮสต์ของ URL แผนคือ

โปรดทราบว่า 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
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 จะได้รับการแจ้งเตือนก่อนและหลังจากกระบวนการที่เกี่ยวข้องกับ UE ผ่าน EngagementListener เกมอาจต้องการการทำงาน เช่น การหยุดเกมตามความจำเป็น

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ iappromote และ iappurchase โปรดดูเนื้อหาด้านล่าง

iappromote

IAP v4 กับ Hive SDK v4.5.0 และเวอร์ชันที่ใหม่กว่ารองรับฟีเจอร์นี้ มันให้การจองการซื้อสำหรับผู้ใช้ก่อนที่จะดำเนินการเกม ฟีเจอร์นี้ทำงานเหมือนกับ Promotional IAP ที่ให้บริการโดย iOS 11 และรองรับสภาพแวดล้อมที่ใช้ Android iappromote มีให้บริการในหน้าเหตุการณ์ บริการส่งข้อความ และข้อความต่างๆ

  • เมื่อผู้ใช้คลิก URL ของแผนผ่านหน้ากิจกรรม, บริการส่งข้อความและข้อความ, รับข้อมูลการซื้อโดยการดำเนินการเกม
  • เรียกใช้แผน iappromote และรับ EngagementEventType.IAP\_PROMOTE เป็นข้อมูลผลลัพธ์ จากค่าผลลัพธ์นั้น, ใช้ API checkPromotePurchase เพื่อรับ market PID คุณสามารถดำเนินการต่อในกระบวนการซื้อเมื่อใช้ API ซื้อด้วย market PID ที่คุณได้รับเป็นข้อมูลอ้างอิง
  • 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
    • แทนที่ส่วนที่เป็นสีแดงด้วย market PID ที่เกี่ยวข้องกับการซื้อที่จองไว้
iappurchase

IAP v4 กับ Hive SDK v4.5.0 และเวอร์ชันที่ใหม่กว่าสนับสนุนฟีเจอร์นี้ คุณสามารถขายสินค้าในแบนเนอร์แบบทันทีโดยใช้ iappurchase ใน URL ของสกีม

* หากคุณเรียกใช้ iappurchase shceme, จะมีการดำเนินการตรรกะการซื้อ ดังนั้นให้แน่ใจว่าคุณได้เริ่มต้นตลาดและได้รับข้อมูลร้านค้าก่อนที่จะดำเนินการตามแผน นี่หมายความว่า ให้ดำเนินการ `marketConnect API` และ `getProductInfo API` ก่อนที่จะเปลี่ยนสถานะของ `setEngagementReady` เป็น true
* เนื่องจากเกมจะดำเนินการตรรกะหลังจากการซื้อ มันจะหยุดการดำเนินการมีส่วนร่วม (`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 ตลาดที่เกี่ยวข้องกับการซื้อที่จองไว้.
ซิงค์ iappurchase กับ Spot Banner

หากคุณต้องการขายสินค้าโดยใช้โครงการ iappurchase ให้ใช้ Spot Banner ดูแนวทางการใช้ Spot Banner

  • ตั้งค่า ID แบนเนอร์จุดที่ตำแหน่งหรือเวลาที่ต้องการในเกมเพื่อกระตุ้นให้ผู้ใช้ซื้อสินค้า
  • เรียก ID แบนเนอร์จุด เมื่อผู้ใช้แตะที่แบนเนอร์จุด ให้ดำเนินการตามแผนการเชื่อมต่อ ผู้ฟัง EngagementListener ที่ลงทะเบียนจะส่งสถานะการทำงานของการเชื่อมต่อ
  • หากคุณเรียกแผนการเชื่อมต่อ จะมีการดำเนินการตามลอจิกการซื้อ ดังนั้นให้แน่ใจว่าคุณได้เริ่มต้นตลาดและได้รับข้อมูลร้านค้าก่อนที่จะดำเนินการตามแผนการ นี่หมายถึงการดำเนินการ marketConnect API และ getProductInfo API ก่อนที่จะเรียกแบนเนอร์จุด
  • ขณะที่เกมดำเนินการตามลอจิกหลังจากการซื้อ มันจะหยุดการดำเนินการมีส่วนร่วม (setEngagementReady จะเป็น false โดยอัตโนมัติ)
  • หลังจากการซื้อเสร็จสิ้น ให้เปลี่ยนสถานะของ setEngagementReady เป็น true เพื่อดำเนินการต่อ
  • ป้อน ID แบนเนอร์จุดใน Hive Console > Promotion > Campaign Settings > Spot Banner และแทรกลิงก์แผนการในลิงก์ภายใน ขอวิธีการลงทะเบียนแบนเนอร์จุดกับ Business PM
  • เช่น,
    • interwork://hive/iappurchase?marketpid=com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.cs01
    • เปลี่ยนส่วนที่เป็นสีแดงเป็น PID ตลาดที่เกี่ยวข้องกับการซื้อที่จองไว้
  • เมื่อคุณลงทะเบียนแบนเนอร์ในคอนโซล ให้ทดสอบการซื้อในเกมของคุณ

หากโฮสต์ของ URL แผนคือเกม

ในกรณีนี้ เกมจะต้องดำเนินการตามคำขอที่ร้องขอ Hive SDK กำลังจัดการ URL Scheme และจากนั้นส่งผลลัพธ์ในรูปแบบ JSONObject ผ่าน EngagementListener ผลลัพธ์จะแบ่งออกเป็นคีย์ scheme, api และ param ตรวจสอบให้แน่ใจว่าเกมดำเนินการตามที่เกี่ยวข้องในเวลาที่เหมาะสมหลังจากได้รับค่า

  • ตัวอย่างเช่น การให้ไอเทมในกล่องจดหมาย
    • URL Scheme : com.com2us.example://game/postboxadditem?item_id=123456&item_title=item01
    • JSONObject ผลลัพธ์จาก Hive SDK

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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการนำ UE ไปใช้ โปรดดูที่ Sample Code ของ Implementing User Engagement > Declaring and Registering Global Callback.

การตั้งค่าโปรเจกต์

ในการใช้ UE ในแอปเกม ให้ตั้งค่าโดย OS ก่อนสร้างแอป

การตั้งค่า Android

ตั้งค่าเมธอด launchMode เป็น singleTask หรือ singleTop เมธอดนี้เป็นหนึ่งในรายการกิจกรรมหลักในไฟล์ AndroidManifest.xml

//<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. เลือก Build ของแอปที่คุณต้องการพัฒนาจากรายการ Xcode TARGETS.
  2. เลือกแท็บ Info.
  3. เพิ่มรายการ Additional url type properties ในส่วน URL Types เพื่อป้อน AppID ในฟิลด์ Bundle Identifier และ URL Schemes.

การดำเนินการมีส่วนร่วมของผู้ใช้

การประกาศและลงทะเบียน Callback ทั่วโลก

ประกาศและลงทะเบียนการเรียกกลับทั่วโลกเพื่อใช้ UE วิธีการประกาศและการลงทะเบียนขึ้นอยู่กับเวอร์ชันของ Hive SDK.

Note
  • จาก Hive SDK v4.5.0 และเวอร์ชันที่ใหม่กว่า การประกาศและการลงทะเบียน callback ทั่วไปจะทำผ่าน API การลงทะเบียน handler ของคลาส Promotion
  • รูปแบบ Engagement Handler และค่าของ enum ได้มีการเปลี่ยนแปลงจาก Hive SDK v4.5.0 และเวอร์ชันที่ใหม่กว่า

คุณต้องลงทะเบียนการเรียกกลับทั่วโลกโดยใช้ API การลงทะเบียนตัวจัดการของคลาส Promotion ตัวอย่างโค้ดมีดังนี้

API Reference: 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:    
                         // เริ่มคำขอการแสดงผล Promotion View    
                         break;    
                     case EngagementEventState.END:    
                         // การแสดงผล Promotion View เสร็จสิ้น (ส่งหลังจากหน้าต่าง Promotion ปิด)    
                         break;    
                 }    
                 break;    
             caseEngagementEventType.COUPON:    
                 switch (engagementEventState) {    
                     case EngagementEventState.START:    
                         // เริ่มคำขอการใช้คูปอง    
                         break;    
                     case EngagementEventState.END:    
                         // เสร็จสิ้นคำขอการใช้คูปองและส่งการตอบกลับ    
                         break;    
                 }       
                 break;    


             case EngagementEventType.EVENT:    
                 // หากโฮสต์เป็นเกม ให้ส่งค่า JSONObject result    
                 String api = "";    
                 String param = "";    

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

                 // ตรวจสอบผลลัพธ์การวิเคราะห์ api และพารามิเตอร์โดย Hive เวอร์ชัน SDK (ความแตกต่างขึ้นอยู่กับ Hive SDK C# JSONObject เวอร์ชัน)    
                 // ex) 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: ทำการดำเนินการต่อไปนี้ตามค่า api และ param    
                 break;    
            case EngagementEventType.IAP_UPDATED:    
                switch (engagementEventState) {    
                    case EngagementEventState.EVENT_START:    
                        // สัญญาณเพื่อยอมรับเนื่องจากประวัติการซื้อได้เปลี่ยนแปลง (เรียกใช้วิธี Restore())    
                        break;    
                    case EngagementEventState.EVENT_END:    
                        // สัญญาณเพื่อยอมรับเนื่องจากประวัติการซื้อได้เปลี่ยนแปลง (เรียกใช้วิธี Restore())    
                        String type = "";    
                        param.getField(ref type, "type");    

                        if (type == "subscription") {    
                            // TODO: restore subscription product    
                            IAPV4.restoreSubscription((ResultAPI result, List <hive.IAPV4.IAPV4Receipt> receiptList) => {    
                                if (!result.isSuccess()) {    
                                    return;    
                                }    
                                // TODO: Request receipt verification using the received 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:    
                    // Convey whether IAP Promote data exists    
                    break;    
                case EngagementEventState.END:    
                    if (!result.isSuccess()) {    
                        return;    
                    }    

                    // เนื่องจากข้อมูล IAP Promote มีอยู่, marketPid จะถูกส่งผ่าน API checkPromote.    
                    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:
                                        // All actions of Engagement are performed
                                        break;
                                case EHiveEngagementEventState::FINISH:
                                        // All actions of Engagement are completed
                                        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::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:
                                        // Passing IAP Promote data existence
                                        break;
                                case EHiveEngagementEventState::EVENT_END:
                                        if (!Result.IsSuccess()) {
                                                return;
                                        }

                                        // เนื่องจากข้อมูล IAP Promote มีอยู่ เราจึงได้รับ marketPid ผ่านการตรวจสอบ API Promote
                                        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: ขอการตรวจสอบใบเสร็จด้วยใบเสร็จที่ได้รับ
                                                }));
                                        }));
                                        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 Reference: 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:    
                        // การดำเนินการทั้งหมดของ Engagement จะถูกดำเนินการ    
                        break;    
                    case EngagementEventState::FINISH:    
                        // การดำเนินการทั้งหมดของ Engagement เสร็จสมบูรณ์    
                        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::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:    
                        // Signal to receive since purchase details have changed    
                        break;    
                    case EngagementEventState::EVENT_END:    
                        // Signal to receive since purchase details have changed    
                        string type = param.get("type").to_str();    

                        if (type != null, type == "subscription") {    
                            // TODO: restore subscription product    
                            IAPV4::restoreSubscription([ = ](ResultApi    
                                const & result, vector < reference_wrapper < IAPV4Receipt >> receiptList) {    
                                if (!result.isSuccess()) {    
                                    return;    
                                }    
                                // TODO: Request receipt verification using the received 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:    
                    // Convey whether IAP Promote data exists    
                    break;    
                case EngagementEventState::EVENT_END:    
                    if (!result.isSuccess()) {    
                        return;    
                    }    

                    // เนื่องจากข้อมูล IAP Promote มีอยู่, marketPid จะถูกส่งผ่านการตรวจสอบ Promote 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:    
                    // Initiate profile page exposure request    
                    break;    
                case EngagementEventState::EVENT_END:    
                    // Profile page exposure completed (delivered after closing the profile window)    
                    break;    
                }    
            break;    
        }    
});

API Reference: 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 View    
                                    }    
                                    Promotion.EngagementEventState.END -> {    
                                        // การแสดง Promotion View เสร็จสิ้น (ส่งหลังจากหน้าต่าง Promotion ปิด)    
                                    }    
                                    else -> {}    
                                }    
                                Promotion.EngagementEventType.COUPON -> 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: restore subscription product    
                                            IAPV4.restoreSubscription(object : IAPV4.IAPV4RestoreListener {    
                                                override fun onIAPV4Restore(    
                                                    result: ResultAPI,    
                                                    iapv4ReceiptList: ArrayList<IAPV4.IAPV4Receipt>?    
                                                ) {    
                                                    if (!result.isSuccess) {    
                                                        return    
                                                    }    
                                                    // TODO: Request receipt verification using the received iapv4ReceiptList    
                                                }    
                                            })    
                                        } else {    
                                            IAPV4.restore(object : IAPV4.IAPV4RestoreListener {    
                                                override fun onIAPV4Restore(    
                                                    result: ResultAPI,    
                                                    iapv4ReceiptList: ArrayList<IAPV4.IAPV4Receipt>?    
                                                ) {    
                                                    if (!result.isSuccess) {    
                                                        return    
                                                    }    
                                                    // TODO: Request receipt verification using the received 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 Reference: 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:    
                            // เริ่มต้นคำขอการแสดงผล Promotion View    
                            break;    
                        case END:    
                            // การเปิดเผย Promotion View เสร็จสิ้น (ส่งหลังจากหน้าต่าง Promotion ถูกปิด)    
                            break;    
                    }    
                    break;    
                case COUPON:    
                    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 Reference: setEngagementHandler(_:)

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

         switchengageEventType {    
             case.type:    
                 switch engagementState{    
                     case .begin:    
                         // All actions of Engagement are performed    
                     case .finish:    
                         // All actions of Engagement are completed    
                 }    

             case .authLoginView:    
                 switch engagementState {    
                     case.eventStart:    
                         // เริ่มการขอแสดงหน้าล็อกอินสมาชิก    
                     case .eventEnd:    
                         // การล็อกอินสมาชิกเสร็จสิ้น (ส่งหลังจากล็อกอินเสร็จสิ้น/หน้าต่างปิด)    
                 }    

             case .socialInquiryView:    
                 switch engagementState {    
                     case.eventStart:    
                         // เริ่มต้นคำขอแสดงหน้าการสอบถาม 1:1    
                     case .eventEnd:    
                         // การแสดงหน้าการสอบถาม 1:1 เสร็จสิ้น (ส่งหลังจากหน้าต่างการสอบถาม 1:1 ปิดแล้ว)    
                 }    

             case .promotionView:    
                 switch engagementState {    
                     case.eventStart:    
                         // เริ่มคำขอแสดงผล Promotion View    
                     case .eventEnd:    
                         // การเปิดเผย Promotion View เสร็จสิ้น (ส่งหลังจากที่หน้าต่าง Promotion ปิด)    
                 }    

             case .คูปอง:    
                 switch engagementState {    
                     case.eventStart:    
                         // เริ่มการร้องขอการใช้คูปอง    
                     case .eventEnd:    
                         // เสร็จสิ้นการร้องขอการใช้คูปองและส่งการตอบกลับ    
                 }    

             case.event:    
                // หากโฮสต์เป็นเกม ให้ส่งค่า JSONObject result 

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

                // ดำเนินการตามคำขอที่ระบุตามค่า api และ param    
            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 Reference: 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:    
                            // All actions of Engagement are performed    
                            break;    
                        case HIVEEngagementStateFinish:    
                            // All actions of Engagement are completed    
                            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 HIVEEngagementEventTypeEvent:    
                    // หากโฮสต์เป็นเกม ให้ส่งค่า JSONObject result    
                    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 Promote หรือไม่    
                            break;    
                        case HIVEEngagementStateEventEnd:    
                            if (![result isSuccess]) {    
                                return;    
                            }    
                            // เนื่องจากมีข้อมูล IAP Promote, marketPid จะถูกส่งผ่านการตรวจสอบ Promote 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:    
                        // แสดงป๊อปอัพสำหรับการซื้อสินค้าที่ได้รับผ่าน schema IAPPurchase    
                        break;    
                    case HIVEEngagementStateEventEnd:    
                        // แจ้งว่าการซื้อสินค้าที่ร้องขอประสบความสำเร็จหรือไม่ผ่าน schema IAPPurchase    
                        if(![result isSuccess]) {    
                            return;    
                        }    
                        HIVEIAPV4Receipt * receipt = [param objectForKey: @ "iapV4Receipt"];    
                        break;    
                    }    
                break;    
                case HIVEEngagementEventTypeSocialMyInquiry:    
                    switch (engagementState) {    
                    case HIVEEngagementStateEventStart:    
                        // เริ่มคำขอการเปิดเผยหน้า my inquiry    
                        break;    
                    case HIVEEngagementStateEnd:    
                        // หน้า my inquiry ได้ถูกเปิดเผย (ส่งมอบหลังจากที่หน้าต่าง My Inquiry ถูกปิด)    
                        break;    
                    }    
                break;    
                case HIVEEngagementEventTypeSocialProfile:    
                    switch (engagementState) {    
                    case HIVEEngagementStateEventStart:    
                        // เริ่มคำขอการเปิดเผยหน้าโปรไฟล์    
                        break;    

                    case HIVEEngagementStateEnd:    
                        // การแสดงหน้าโปรไฟล์เสร็จสิ้น (ส่งมอบหลังจากปิดหน้าต่างโปรไฟล์)    
                        break;    
                    }    
                break;    
                }    
}];

การตั้งค่าเพื่อจัดการกับเหตุการณ์การมีส่วนร่วมของผู้ใช้

SDK ของ Hive โดยทั่วไปสามารถประมวลผลคำขอที่เข้ามาได้หากการเข้าสู่ระบบเสร็จสมบูรณ์ อย่างไรก็ตาม ในกรณีของการดำเนินการครั้งแรก เป็นต้น แม้หลังจากการเข้าสู่ระบบ การชำระเงินชดเชย เป็นต้น อาจไม่สามารถทำได้หากอยู่ก่อนการสร้างฐานข้อมูลเซิร์ฟเวอร์เกม ดังนั้นคุณต้องแจ้งให้ Hive SDK ทราบเกี่ยวกับ ว่าการจัดการเหตุการณ์ UE เป็นไปได้หรือไม่ จากเกม..

  • การตั้งค่าเริ่มต้นสำหรับการจัดการเหตุการณ์คือ false
  • หากการจัดการเหตุการณ์ถูกตั้งค่าเป็น true เหตุการณ์ที่รออยู่จะถูกประมวลผลทันที และเหตุการณ์ถัดไปจะถูกประมวลผลทันที。
  • หากการจัดการเหตุการณ์ถูกตั้งค่าเป็น false เหตุการณ์ที่เข้ามาจะถูกจัดเก็บไว้จนกว่าการตั้งค่าจะแปลงเป็น true
  • การตั้งค่าเป็น true ควรเรียกใช้ หลังจากการ เข้าสู่ระบบ และการตั้งค่าเป็น false ไม่มีข้อจำกัดเกี่ยวกับเวลาของการเรียกใช้。
  • (ด้วย Hive SDK v4.4.0 และเวอร์ชันที่ใหม่กว่า) เกมทั้งหมดที่ใช้ Hive SDK จะต้องดำเนินการ API นี้เพื่อให้รางวัล CPI。
  • หากผู้ใช้เข้าสู่แอปผ่านลิงก์เชิญหรือรหัส QR ที่สร้างโดย User Acquisition หรือผ่านหน้า offerwall ประวัติการเข้าชมและคำขอการจ่ายรางวัลจะถูกดำเนินการขึ้นอยู่กับสถานะที่เปลี่ยนแปลงโดยการเรียกใช้ API นี้。
  • คุณต้องเรียกใช้ API ในจุดที่เกมสามารถทำฟังก์ชันของ UE ได้。
Note
  • ใช้เมธอด setAdditionalInfo() ในคลาส Promotion เพื่อส่งข้อมูลเกมของผู้ใช้ปัจจุบันก่อนที่จะเรียกใช้เมธอด setEngagementReady() ข้อมูลเกมที่ส่งโดยการใช้คูปองหรือการได้มาของผู้ใช้สามารถใช้ได้สำหรับสตูดิโอเกม
  • ขึ้นอยู่กับเวอร์ชันของ SDK Hive คลาสของเมธอด setEngagementReady() จะแตกต่างกัน

Hive SDK v4.5.0 และเวอร์ชันที่ใหม่กว่า

ใช้วิธี setEngagementReady() ในคลาส Promotion เพื่อตั้งค่าว่าเหตุการณ์ UE สามารถประมวลผลได้หรือไม่ ตัวอย่างโค้ดต่อไปนี้เป็นตัวอย่างการตั้งค่าเป็น true

API Reference: 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 call success
        }
}

API Reference: 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 Reference: Promotion.setEngagementReady

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

API Reference: 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 Reference: PromotionInterface .setEngagementReady

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

API Reference: 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 ข้อผิดพลาดของฐานข้อมูล
304 คูปองที่ใช้แล้ว 501 ความล้มเหลวในการสื่อสาร