Engage SDK Food: คำแนะนำการผสานรวมทางเทคนิคของบุคคลที่สาม

เพิ่มการมีส่วนร่วมในแอปโดยการเข้าถึงผู้ใช้ในทุกที่ที่ผู้ใช้อยู่ ผสานรวม Engage SDK เพื่อแสดงคำแนะนำที่ปรับเปลี่ยนในแบบของคุณและเนื้อหาที่ต่อเนื่องไปยังผู้ใช้โดยตรงในแพลตฟอร์มต่างๆ ในอุปกรณ์ เช่น คอลเล็กชัน, Entertainment Space และ Play Store การผสานรวมนี้จะเพิ่มขนาด APK โดยเฉลี่ยไม่เกิน 50 KB (บีบอัดแล้ว) และใช้เวลาของนักพัฒนาแอปประมาณ 1 สัปดาห์สำหรับแอปส่วนใหญ่ ดูข้อมูลเพิ่มเติมได้ที่เว็บไซต์ธุรกิจ

คู่มือนี้มีวิธีการสำหรับพาร์ทเนอร์นักพัฒนาแอปในการนำส่งเนื้อหาเกี่ยวกับอาหาร (การสั่งอาหาร รีวิวและการค้นพบอาหารหรือร้านอาหาร การสมัครรับข้อมูลอาหาร สูตรอาหาร) ไปยังแพลตฟอร์มเนื้อหา Engage

การรองรับหมวดหมู่และแพลตฟอร์ม

การมีสิทธิ์ใช้แพลตฟอร์ม Engage SDK ขึ้นอยู่กับหมวดหมู่เนื้อหาของแอป ใช้ตารางต่อไปนี้เพื่อพิจารณาสิทธิ์ของคุณสำหรับแพลตฟอร์มที่เฉพาะเจาะจง

สถานะ หมวดหมู่เนื้อหาหรือกรณีการใช้งาน แพลตฟอร์มที่รองรับ
รองรับ
(มีสิทธิ์แสดงในทุกแพลตฟอร์ม)
  • การสั่งหรือจัดส่งอาหาร / กาแฟ / เครื่องดื่ม
  • การค้นหา รีวิว และการจองร้านอาหาร / อาหาร
  • การสมัครรับอาหาร
  • สูตรอาหารและการทำอาหาร
  • คอลเล็กชัน
  • แท็บแอปใน Play Store
  • แท็บ "คุณ" ใน Play Store
  • หน้าข้อมูลสินค้าใน Store ของ Play Store
สิ่งที่ทำไม่ได้
  • แอปคนขับ / ผู้จัดส่ง
  • เครื่องมือ / การควบคุมการทำอาหาร

รายละเอียดการผสานรวม

ส่วนนี้จะอธิบายรายละเอียดขั้นตอน โมเดลข้อมูล และคำศัพท์ที่จำเป็นสำหรับการผสานรวมกับ Engage SDK สำหรับเนื้อหาเกี่ยวกับอาหาร

คำศัพท์

การผสานรวมนี้ประกอบด้วยคลัสเตอร์ 5 ประเภท ได้แก่ วิดีโอแนะนำ แนะนำ รถเข็นช็อปปิ้งอาหาร รายการช็อปปิ้งอาหาร และสั่งซื้ออีกครั้ง

  • คลัสเตอร์คำแนะนำจะแสดงคำแนะนำเกี่ยวกับอาหารที่ปรับเปลี่ยนในแบบของคุณจากพาร์ทเนอร์นักพัฒนาแอปแต่ละราย คำแนะนำเหล่านี้สามารถปรับเปลี่ยนให้เหมาะกับผู้ใช้หรือเป็นแบบทั่วไป (เช่น สินค้าใหม่ที่ลดราคา) ใช้เพื่อแสดงรายการต่างๆ เช่น สูตรอาหาร ร้านค้า อาหาร หรือของใช้ในบ้าน

    • คลัสเตอร์คำแนะนำสามารถประกอบด้วยข้อมูล ProductEntity, StoreEntity หรือ RecipeEntity แต่จะใช้เอนทิตีหลายประเภทผสมกันไม่ได้
    รูปภาพ :`ProductEntity`, `StoreEntity` และ `RecipeEntity` (*UI มีไว้เพื่อการอธิบายเท่านั้น)
  • คลัสเตอร์แนะนำจะแสดงเอนทิตีที่เลือกจากพาร์ทเนอร์นักพัฒนาแอปหลายรายในการจัดกลุ่ม UI เดียว จะมีคลัสเตอร์แนะนำเพียงคลัสเตอร์เดียว ซึ่งจะแสดงใกล้กับด้านบนของ UI โดยมีตำแหน่งที่มีลำดับความสำคัญสูงกว่าคลัสเตอร์วิดีโอแนะนำทั้งหมด พาร์ทเนอร์นักพัฒนาแอปแต่ละรายจะได้รับอนุญาตให้ออกอากาศเอนทิตีได้สูงสุด 10 รายการในคลัสเตอร์แนะนำ

    รูปภาพ : คลัสเตอร์ที่แนะนำซึ่งมี `RecipeEntity` (*UI มีไว้เพื่อการอธิบายเท่านั้น)
  • คลัสเตอร์รถเข็นช็อปปิ้งอาหารจะแสดงตัวอย่างรถเข็นช็อปปิ้งของชำจากพาร์ทเนอร์นักพัฒนาแอปหลายรายในการจัดกลุ่ม UI เดียว ซึ่งจะแจ้งให้ผู้ใช้ดำเนินการกับรถเข็นที่ค้างอยู่ให้เสร็จสมบูรณ์ มีคลัสเตอร์รถเข็นช็อปปิ้งอาหารเพียงคลัสเตอร์เดียว

    • คลัสเตอร์รถเข็นช็อปปิ้งอาหารต้องแสดงจำนวนสินค้าทั้งหมดในรถเข็น และอาจรวมรูปภาพของสินค้า X รายการในรถเข็นของผู้ใช้ด้วย

      รูปภาพ: คลัสเตอร์รถเข็นช็อปปิ้งอาหารจากพาร์ทเนอร์รายเดียว (*UI มีไว้เพื่ออธิบายเท่านั้น)
  • คลัสเตอร์รายการซื้ออาหารจะแสดงตัวอย่างรายการซื้อของชำจากพาร์ทเนอร์นักพัฒนาแอปหลายรายในการจัดกลุ่ม UI เดียว ซึ่งจะแจ้งให้ผู้ใช้กลับไปยังแอปที่เกี่ยวข้องเพื่ออัปเดตและทำรายการให้เสร็จสมบูรณ์ มีคลัสเตอร์รายการช็อปปิ้งอาหารเพียงคลัสเตอร์เดียว

    รูปภาพ: คลัสเตอร์รายการช็อปปิ้งอาหารจากพาร์ทเนอร์รายเดียว (*UI มีไว้เพื่ออธิบายเท่านั้น)
  • คลัสเตอร์สั่งซื้ออีกครั้งจะแสดงตัวอย่างคำสั่งซื้อก่อนหน้าจากพาร์ทเนอร์นักพัฒนาแอปหลายรายในการจัดกลุ่ม UI เดียวกัน เพื่อแจ้งให้ผู้ใช้สั่งซื้ออีกครั้ง มีคลัสเตอร์การเรียงลำดับใหม่เพียงคลัสเตอร์เดียว

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

      • รูปภาพสำหรับสินค้า X รายการในคำสั่งซื้อก่อนหน้าของผู้ใช้
      • ป้ายกำกับสำหรับสินค้า X รายการในคำสั่งซื้อก่อนหน้าของผู้ใช้
    รูปภาพ: คลัสเตอร์การสั่งอาหารซ้ำจากพาร์ทเนอร์รายเดียว (*UI มีไว้เพื่ออธิบายเท่านั้น)

สิ่งที่ต้องเตรียมก่อนดำเนินการ

ระดับ API ขั้นต่ำ: 19

เพิ่มไลบรารี com.google.android.engage:engage-core ลงในแอปโดยทำดังนี้

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.6.0'
}

สรุป

การออกแบบนี้อิงตามการใช้งานบริการที่มีผลผูกพัน

ข้อมูลที่ไคลเอ็นต์เผยแพร่ได้จะขึ้นอยู่กับขีดจำกัดต่อไปนี้สำหรับคลัสเตอร์ประเภทต่างๆ

ประเภทคลัสเตอร์ ขีดจำกัดของคลัสเตอร์ ขีดจำกัดเอนทิตีสูงสุดในคลัสเตอร์
คลัสเตอร์วิดีโอแนะนำ ไม่เกิน 7 รายการ ไม่เกิน 50 (ProductEntity, RecipeEntity หรือ StoreEntity)
คลัสเตอร์แนะนำ ไม่เกิน 1 รายการ ไม่เกิน 20 รายการ (ProductEntity, RecipeEntity หรือ StoreEntity)
คลัสเตอร์รถเข็นช็อปปิ้งอาหาร ไม่เกิน 1 รายการ FoodShoppingCart ไม่เกิน 3 รายการ
คลัสเตอร์รายการช็อปปิ้งอาหาร ไม่เกิน 1 รายการ FoodShoppingList ไม่เกิน 3 รายการ
คลัสเตอร์การสั่งอาหารซ้ำ ไม่เกิน 1 รายการ ReorderEntity ไม่เกิน 1 รายการ

ขั้นตอนที่ 1: ระบุข้อมูลนิติบุคคล

SDK ได้กำหนดเอนทิตีต่างๆ เพื่อแสดงรายการแต่ละประเภท เรารองรับเอนทิตีต่อไปนี้สำหรับหมวดหมู่อาหาร

  1. ProductEntity
  2. StoreEntity
  3. RecipeEntity
  4. FoodShoppingCart
  5. FoodShoppingList
  6. FoodReorderCluster

แผนภูมิต่อไปนี้แสดงแอตทริบิวต์และข้อกำหนดที่ใช้ได้สำหรับแต่ละประเภท

ProductEntity

ออบเจ็กต์ ProductEntity แสดงถึงสินค้าแต่ละรายการ (เช่น สินค้าอุปโภคบริโภค อาหารจากร้านอาหาร หรือโปรโมชัน) ที่พาร์ทเนอร์นักพัฒนาแอปต้องการเผยแพร่

รูปภาพ : แอตทริบิวต์ของ ProductEntity

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
รูปภาพโปสเตอร์ ต้องระบุ ต้องระบุรูปภาพอย่างน้อย 1 รูป ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
URI การดำเนินการ ต้องระบุ

Deep Link ไปยังหน้าในแอปที่แสดงรายละเอียดเกี่ยวกับผลิตภัณฑ์

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ ดูคำถามที่พบบ่อยนี้

URI
ชื่อ ไม่บังคับ ชื่อสินค้า

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 90 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ราคา - ปัจจุบัน ต้องมีแบบมีเงื่อนไข

ราคาปัจจุบันของผลิตภัณฑ์

ต้องระบุหากระบุราคาที่ขีดฆ่า

ข้อความอิสระ
ราคา - ขีดทับ ไม่บังคับ ราคาเดิมของเอนทิตี ซึ่งจะถูกขีดทับใน UI ข้อความอิสระ
ข้อความไฮไลต์ ไม่บังคับ ข้อความไฮไลต์เพื่อแสดงโปรโมชัน กิจกรรม หรือข้อมูลอัปเดตสำหรับผลิตภัณฑ์ (หากมี)

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงเป็นจุดไข่ปลา)

ข้อความที่พิมพ์ด้วยตัวอักษรขนาดเล็กในข้อความไฮไลต์ ไม่บังคับ ข้อความตัวพิมพ์เล็กสำหรับข้อความไฮไลต์

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงเป็นจุดไข่ปลา)

คะแนน (ไม่บังคับ) - หมายเหตุ: คะแนนทั้งหมดจะแสดงโดยใช้ระบบการให้ดาวมาตรฐานของเรา
คะแนน - ค่าสูงสุด ไม่บังคับ

ค่าสูงสุดของสเกลการให้คะแนน

ต้องระบุหากมีการระบุค่าปัจจุบันของคะแนนด้วย

ตัวเลข >= 0.0
คะแนน - ค่าปัจจุบัน ไม่บังคับ

ค่าปัจจุบันของสเกลการให้คะแนน

ต้องระบุหากมีการระบุค่าสูงสุดของคะแนนด้วย

ตัวเลข >= 0.0
การให้คะแนน - จำนวน ไม่บังคับ

จำนวนคะแนนของผลิตภัณฑ์

หมายเหตุ: ระบุช่องนี้หากแอปของคุณควบคุมวิธีแสดงจำนวนต่อผู้ใช้ ใช้สตริงที่กระชับ เช่น หากจำนวนคือ 1,000,000 ให้พิจารณาใช้ตัวย่อ เช่น 1M เพื่อไม่ให้จำนวนถูกตัดออกในจอแสดงผลขนาดเล็ก

สตริง
การให้คะแนน - ค่าจำนวน ไม่บังคับ

จำนวนคะแนนของผลิตภัณฑ์

หมายเหตุ: ระบุช่องนี้หากคุณไม่ได้จัดการตรรกะตัวย่อที่แสดงด้วยตนเอง หากมีทั้งจำนวนและค่าจำนวน ระบบจะแสดงจำนวนให้ผู้ใช้เห็น

ยาว
DisplayTimeWindow (ไม่บังคับ) - กำหนดกรอบเวลาสำหรับเนื้อหาที่จะแสดงบนแพลตฟอร์ม
การประทับเวลาเริ่มต้น ไม่บังคับ

การประทับเวลา Epoch ที่ควรแสดงเนื้อหาบนแพลตฟอร์ม

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที
การประทับเวลาสิ้นสุด ไม่บังคับ

การประทับเวลา Epoch หลังจากที่เนื้อหาไม่แสดงบนแพลตฟอร์มอีกต่อไป

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที

StoreEntity

ออบเจ็กต์ StoreEntity แสดงถึงร้านค้าแต่ละร้านที่พาร์ทเนอร์นักพัฒนาแอปต้องการเผยแพร่ เช่น ร้านอาหารหรือร้านขายของชำ

รูปภาพ : แอตทริบิวต์ของ StoreEntity

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
รูปภาพโปสเตอร์ ต้องระบุ ต้องระบุรูปภาพอย่างน้อย 1 รูป ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
URI การดำเนินการ ต้องระบุ

Deep Link ไปยังหน้าในแอปที่แสดงรายละเอียดเกี่ยวกับร้านค้า

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ ดูคำถามที่พบบ่อยนี้

URI
ชื่อ ไม่บังคับ ชื่อร้านค้า

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ตำแหน่ง ไม่บังคับ สถานที่ตั้งของร้านค้า

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ข้อความไฮไลต์ ไม่บังคับ ข้อความไฮไลต์เพื่อแสดงโปรโมชัน กิจกรรม หรือข้อมูลอัปเดตสำหรับร้านค้า (หากมี)

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงเป็นจุดไข่ปลา)

ข้อความที่พิมพ์ด้วยตัวอักษรขนาดเล็กในข้อความไฮไลต์ ไม่บังคับ ข้อความตัวพิมพ์เล็กสำหรับข้อความไฮไลต์

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงเป็นจุดไข่ปลา)

คำอธิบาย ไม่บังคับ คำอธิบายร้านค้า

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 90 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

หมวดหมู่ ไม่บังคับ

หมวดหมู่ของร้านค้า ในบริบทของสถานที่รับประทานอาหาร อาจเป็นอาหาร เช่น "ฝรั่งเศส" "อเมริกันสมัยใหม่" "ราเมน" "อาหารหรู"

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงเป็นจุดไข่ปลา)

หมายเหตุ: การให้คะแนนทั้งหมดจะแสดงโดยใช้ระบบการให้ดาวมาตรฐานของเรา
คะแนน - ค่าสูงสุด ไม่บังคับ

ค่าสูงสุดของสเกลการให้คะแนน

ต้องระบุหากมีการระบุค่าปัจจุบันของคะแนนด้วย

ตัวเลข >= 0.0
คะแนน - ค่าปัจจุบัน ไม่บังคับ

ค่าปัจจุบันของสเกลการให้คะแนน

ต้องระบุหากมีการระบุค่าสูงสุดของคะแนนด้วย

ตัวเลข >= 0.0
การให้คะแนน - จำนวน ไม่บังคับ

จำนวนคะแนนของร้านค้า

หมายเหตุ: ระบุช่องนี้หากแอปต้องการควบคุมวิธีแสดงข้อมูลนี้ต่อผู้ใช้ ระบุสตริงที่กระชับซึ่งสามารถแสดงต่อผู้ใช้ได้ เช่น หากจำนวนคือ 1,000,000 ให้พิจารณาใช้ตัวย่อ เช่น 1M เพื่อไม่ให้ข้อความถูกตัดในจอแสดงผลขนาดเล็ก

สตริง
การให้คะแนน - ค่าจำนวน ไม่บังคับ

จำนวนคะแนนของร้านค้า

หมายเหตุ: ระบุช่องนี้หากคุณไม่ต้องการจัดการตรรกะตัวย่อที่แสดงด้วยตนเอง หากมีทั้งจำนวนและค่าจำนวน เราจะใช้จำนวนเพื่อแสดงต่อผู้ใช้

ยาว

RecipeEntity

ออบเจ็กต์ RecipeEntity แสดงถึงรายการสูตรอาหารที่พาร์ทเนอร์นักพัฒนาซอฟต์แวร์ต้องการเผยแพร่

รูปภาพ : แอตทริบิวต์ของ RecipeEntity

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
รูปภาพโปสเตอร์ ต้องระบุ ต้องระบุรูปภาพอย่างน้อย 1 รูป ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
URI การดำเนินการ ต้องระบุ

Deep Link ไปยังหน้าในแอปที่แสดงรายละเอียดเกี่ยวกับสูตรอาหาร

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ ดูคำถามที่พบบ่อยนี้

URI
ชื่อ ไม่บังคับ ชื่อของสูตรอาหาร

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ผู้เขียน ไม่บังคับ ผู้เขียนสูตรอาหาร

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

เวลาในการทำ/เตรียมอาหาร ไม่บังคับ เวลาที่ใช้ในการทำอาหารตามสูตร

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ข้อความไฮไลต์ ไม่บังคับ ข้อความไฮไลต์เพื่อแสดงโปรโมชัน กิจกรรม หรือข้อมูลอัปเดตสำหรับสูตรอาหาร (หากมี)

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงเป็นจุดไข่ปลา)

หมวดหมู่ ไม่บังคับ หมวดหมู่ของสูตรอาหาร

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 45 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงเป็นจุดไข่ปลา)

คำอธิบาย ไม่บังคับ คำอธิบายสูตรอาหาร

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 90 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

หมายเหตุ: คะแนนทั้งหมดจะแสดงโดยใช้ระบบการให้ดาวมาตรฐานของเรา
คะแนน - ค่าสูงสุด ไม่บังคับ

ค่าสูงสุดของสเกลการให้คะแนน

ต้องระบุหากมีการระบุค่าปัจจุบันของคะแนนด้วย

ตัวเลข >= 0.0
คะแนน - ค่าปัจจุบัน ไม่บังคับ

ค่าปัจจุบันของสเกลการให้คะแนน

ต้องระบุหากมีการระบุค่าสูงสุดของคะแนนด้วย

ตัวเลข >= 0.0
การให้คะแนน - จำนวน ไม่บังคับ

จำนวนการให้คะแนนสำหรับสูตรอาหาร

หมายเหตุ: ระบุช่องนี้หากแอปต้องการควบคุมวิธีแสดงข้อมูลนี้ต่อผู้ใช้ ระบุสตริงที่กระชับซึ่งสามารถแสดงต่อผู้ใช้ได้ เช่น หากจำนวนคือ 1,000,000 ให้พิจารณาใช้ตัวย่อ เช่น 1M เพื่อไม่ให้ข้อความถูกตัดในจอแสดงผลขนาดเล็ก

สตริง
การให้คะแนน - ค่าจำนวน ไม่บังคับ

จำนวนการให้คะแนนสำหรับสูตรอาหาร

หมายเหตุ: ระบุช่องนี้หากคุณไม่ต้องการจัดการตรรกะตัวย่อที่แสดงด้วยตนเอง หากมีทั้งจำนวนและค่าจำนวน เราจะใช้จำนวนเพื่อแสดงต่อผู้ใช้

ยาว

FoodShoppingCart

รูปภาพ: แอตทริบิวต์คลัสเตอร์รถเข็นช็อปปิ้งอาหาร

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
URI การดำเนินการ ต้องระบุ

Deep Link ไปยังรถเข็นช็อปปิ้งในแอปของพาร์ทเนอร์

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ ดูคำถามที่พบบ่อยนี้

URI
จำนวนรายการ ต้องระบุ

จำนวนสินค้า (ไม่ใช่แค่จำนวนผลิตภัณฑ์) ในรถเข็นช็อปปิ้ง

เช่น หากมีส้ม 3 ผลและแอปเปิล 1 ผลในรถเข็น ตัวเลขนี้ควรเป็น 4

จำนวนเต็ม >= 1
การประทับเวลาการโต้ตอบของผู้ใช้ล่าสุด ต้องระบุ จำนวนมิลลิวินาทีที่ผ่านไปจาก Epoch ซึ่งระบุเวลาล่าสุดที่ผู้ใช้โต้ตอบกับรถเข็นช็อปปิ้ง การประทับเวลา Epoch ในหน่วยมิลลิวินาที
ชื่อ ไม่บังคับ

ชื่อของรถเข็น (เช่น รถเข็นของคุณ)

หากนักพัฒนาแอปไม่ได้ระบุชื่อไว้ ระบบจะใช้รถเข็นของคุณเป็นค่าเริ่มต้น

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 25 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ข้อความเกี่ยวกับการดำเนินการ ไม่บังคับ

ข้อความกระตุ้นให้ดำเนินการของปุ่มในรถเข็นช็อปปิ้ง (เช่น ถุงช็อปปิ้งของคุณ)

หากนักพัฒนาแอปไม่ได้ระบุข้อความการดำเนินการไว้ ระบบจะใช้ดูรถเข็นเป็นค่าเริ่มต้น

แอตทริบิวต์นี้รองรับในเวอร์ชัน 1.1.0 เป็นต้นไป

สตริง
รูปภาพรถเข็น ไม่บังคับ

รูปภาพของผลิตภัณฑ์แต่ละรายการในรถเข็น

คุณสามารถระบุรูปภาพได้สูงสุด 10 รูปตามลำดับความสำคัญ จำนวนรูปภาพที่แสดงจริงจะขึ้นอยู่กับรูปแบบของอุปกรณ์

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
ป้ายกำกับรายการ ไม่บังคับ

รายการป้ายกำกับสำหรับสินค้าในรายการช็อปปิ้ง

จำนวนป้ายกำกับที่แสดงจริงจะขึ้นอยู่กับรูปแบบของอุปกรณ์

รายการป้ายกำกับข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 20 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

DisplayTimeWindow (ไม่บังคับ) - กำหนดกรอบเวลาสำหรับเนื้อหาที่จะแสดงบนแพลตฟอร์ม
การประทับเวลาเริ่มต้น ไม่บังคับ

การประทับเวลา Epoch ที่ควรแสดงเนื้อหาบนแพลตฟอร์ม

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที
การประทับเวลาสิ้นสุด ไม่บังคับ

การประทับเวลา Epoch หลังจากที่เนื้อหาไม่แสดงบนแพลตฟอร์มอีกต่อไป

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที

FoodShoppingList

รูปภาพ: คลัสเตอร์รายการช็อปปิ้งอาหาร

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
URI การดำเนินการ ต้องระบุ

Deep Link ไปยังรายการช็อปปิ้งในแอปของพาร์ทเนอร์

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ ดูคำถามที่พบบ่อยนี้

URI
จำนวนรายการ ต้องระบุ จำนวนสินค้าในรายการช็อปปิ้ง จำนวนเต็ม >= 1
การประทับเวลาการโต้ตอบของผู้ใช้ล่าสุด ต้องระบุ จำนวนมิลลิวินาทีที่ผ่านไปจาก Epoch ซึ่งระบุเวลาล่าสุดที่ผู้ใช้โต้ตอบกับรายการช็อปปิ้ง การประทับเวลา Epoch ในหน่วยมิลลิวินาที
ชื่อ ไม่บังคับ

ชื่อรายการ (เช่น รายการซื้อของเข้าบ้าน)

หากนักพัฒนาแอปไม่ได้ระบุชื่อไว้ ระบบจะใช้ชื่อรายการช็อปปิ้งเป็นค่าเริ่มต้น

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 25 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ป้ายกำกับรายการ ต้องระบุ

รายการป้ายกำกับสำหรับสินค้าในรายการช็อปปิ้ง

ต้องระบุป้ายกำกับอย่างน้อย 1 รายการและระบุได้สูงสุด 10 รายการตามลำดับความสำคัญ จำนวนป้ายกำกับที่แสดงจริงจะขึ้นอยู่กับรูปแบบของอุปกรณ์

รายการป้ายกำกับข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 20 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

FoodReorderCluster

รูปภาพ: คลัสเตอร์การสั่งอาหารซ้ำ

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
URI การดำเนินการ ต้องระบุ

Deep Link สำหรับสั่งซื้ออีกครั้งในแอปของพาร์ทเนอร์

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ ดูคำถามที่พบบ่อยนี้

URI
ข้อความเกี่ยวกับการดำเนินการ ไม่บังคับ

ข้อความกระตุ้นให้ดำเนินการของปุ่มในส่วนสั่งซื้ออีกครั้ง (เช่น สั่งซื้ออีกครั้ง)

หากนักพัฒนาแอปไม่ได้ระบุข้อความการดำเนินการไว้ ระบบจะใช้สั่งซื้ออีกครั้งเป็นค่าเริ่มต้น

แอตทริบิวต์นี้รองรับในเวอร์ชัน 1.1.0 เป็นต้นไป

สตริง
จำนวนรายการ ต้องระบุ

จำนวนสินค้า (ไม่ใช่แค่จำนวนผลิตภัณฑ์) ในคำสั่งซื้อก่อนหน้า

ตัวอย่างเช่น หากมีกาแฟแก้วเล็ก 3 แก้วและครัวซองต์ 1 ชิ้นในคำสั่งซื้อก่อนหน้า ตัวเลขนี้ควรเป็น 4

จำนวนเต็ม >= 1
ชื่อ ต้องระบุ ชื่อของสินค้าที่สั่งซื้อใหม่

ข้อความอิสระ

ขนาดข้อความที่แนะนำ: ไม่เกิน 40 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ป้ายกำกับรายการ

ไม่บังคับ

(หากไม่ได้ระบุไว้ ควรระบุภาพโปสเตอร์)

รายการป้ายกำกับสินค้าสำหรับคำสั่งซื้อก่อนหน้า

คุณระบุป้ายกำกับได้สูงสุด 10 รายการตามลำดับความสำคัญ จำนวนป้ายกำกับที่แสดงจริงจะขึ้นอยู่กับรูปแบบของอุปกรณ์

รายการข้อความอิสระ

ขนาดข้อความที่แนะนำต่อป้ายกำกับ: ไม่เกิน 20 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

รูปภาพโปสเตอร์

ไม่บังคับ

(หากไม่ได้ระบุไว้ ควรระบุป้ายกำกับรายการ)

รูปภาพของสินค้าในคำสั่งซื้อก่อนหน้า

คุณสามารถระบุรูปภาพได้สูงสุด 10 รูปตามลำดับความสำคัญ จำนวนรูปภาพที่แสดงจริงจะขึ้นอยู่กับรูปแบบของอุปกรณ์

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ

ข้อกำหนดเกี่ยวกับรูปภาพ

ตารางต่อไปนี้แสดงข้อกำหนดที่จำเป็นสำหรับชิ้นงานรูปภาพ

สัดส่วนภาพ พิกเซลขั้นต่ำ พิกเซลแนะนํา

สี่เหลี่ยมจัตุรัส (1x1)

Preferred

300x300 1200x1200
แนวนอน (1.91x1) 600x314 1200x628
แนวตั้ง (4x5) 480x600 960x1200

รูปแบบไฟล์

PNG, JPG, GIF แบบภาพนิ่ง, WebP

ขนาดไฟล์สูงสุด

5120 KB

คำแนะนำเพิ่มเติม

  • พื้นที่ปลอดภัยสำหรับรูปภาพ: ใส่เนื้อหาสำคัญไว้ตรงกลาง ซึ่งก็คือ 80% ของรูปภาพนั้น
  • ใช้พื้นหลังโปร่งใสเพื่อให้รูปภาพแสดงได้อย่างถูกต้องในการตั้งค่าธีมมืดและธีมสว่าง

ขั้นตอนที่ 2: ระบุข้อมูลคลัสเตอร์

ขอแนะนำให้เรียกใช้งานการเผยแพร่เนื้อหาในเบื้องหลัง (เช่น ใช้ WorkManager) และกำหนดเวลาเป็นประจำหรือตามเหตุการณ์ (เช่น ทุกครั้งที่ผู้ใช้เปิดแอปหรือเมื่อผู้ใช้เพิ่งเพิ่มสินค้าลงในรถเข็น)

AppEngageFoodClient มีหน้าที่รับผิดชอบในการเผยแพร่คลัสเตอร์อาหาร

API ต่อไปนี้ใช้เพื่อเผยแพร่คลัสเตอร์ในไคลเอ็นต์

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishFoodShoppingCarts
  • publishFoodShoppingLists
  • publishReorderCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteFoodShoppingCartCluster
  • deleteFoodShoppingListCluster
  • deleteReorderCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

API นี้ใช้เพื่อตรวจสอบว่าบริการพร้อมสำหรับการผสานรวมหรือไม่ และเนื้อหาจะแสดงบนอุปกรณ์ได้หรือไม่

คุณสามารถตรวจสอบความพร้อมให้บริการสำหรับคลัสเตอร์ทุกประเภทที่ต้องการเผยแพร่ได้ isServiceAvailable API จะยอมรับออบเจ็กต์คำขอ ServiceAvailabilityRequest ซึ่งมีประเภทคลัสเตอร์ที่ต้องตรวจสอบความพร้อมให้บริการ คุณสามารถดูค่า enum ของ ClusterType ที่จำเป็นสำหรับ ServiceAvailabilityRequest ได้จากตารางต่อไปนี้

ประเภทคลัสเตอร์ ค่าคงที่ประเภทคลัสเตอร์ ค่าจำนวนเต็ม
ไม่ทราบ TYPE_UNKNOWN 0
คลัสเตอร์วิดีโอแนะนำ TYPE_RECOMMENDATION 1
คลัสเตอร์แนะนำ TYPE_FEATURED 2
คลัสเตอร์ความต่อเนื่อง TYPE_CONTINUATION 3
คลัสเตอร์การสั่งอาหารซ้ำ TYPE_FOOD_REORDER 5
คลัสเตอร์รถเข็นช็อปปิ้งอาหาร TYPE_FOOD_SHOPPING_CART 6
คลัสเตอร์รายการช็อปปิ้งอาหาร TYPE_FOOD_SHOPPING_LIST 7
คลัสเตอร์การจัดการผู้ใช้ TYPE_ENGAGEMENT 8
คลัสเตอร์การสมัครใช้บริการ TYPE_SUBSCRIPTION 12

Kotlin

val request = ServiceAvailabilityRequest.Builder()
    .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
    .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
    .build()

client.isServiceAvailable(request).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val availabilityMap = task.result
        if (availabilityMap[ClusterType.TYPE_CONTINUATION] == true) {
            // Proceed with publishing continuation content
        }
        if (availabilityMap[ClusterType.TYPE_RECOMMENDATION] == true) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
}

Java

ServiceAvailabilityRequest request =
    new ServiceAvailabilityRequest.Builder()
        .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
        .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
        .build();

client.isServiceAvailable(request).addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
        Map<Integer, Boolean> availabilityMap = task.getResult();
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_CONTINUATION))) {
            // Proceed with publishing continuation content
        }
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_RECOMMENDATION))) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
});
ฟีเจอร์ความพร้อมให้บริการแบบมีเงื่อนไข

แอปที่ผสานรวมบางแอปจะขอการกำหนดค่าพิเศษที่เปิดและปิดใช้บริการ Engage เป็นระยะๆ เพื่อลดค่าใช้จ่ายการแสดงผล อย่างไรก็ตาม กลยุทธ์การนำเข้าเนื้อหาเป็นระยะๆ นี้ส่งผลเสียต่อประสบการณ์ของผู้ใช้ เนื่องจากระบบจะไม่แสดงเนื้อหาที่ล้าสมัย และจะไม่แสดงเนื้อหาในบางแพลตฟอร์ม

ตั้งแต่เวอร์ชัน 1.6.0 เป็นต้นไป Engage SDK จะช่วยให้ตรวจสอบความพร้อมใช้งานของคลัสเตอร์บางประเภทได้ หากแอปของคุณใช้การส่งผ่านข้อมูลเป็นระยะๆ ให้ทำดังนี้

  • คลัสเตอร์ความต่อเนื่อง (เช่น รถเข็นช็อปปิ้งอาหาร รายการช็อปปิ้งอาหาร และสั่งซื้ออีกครั้ง) จะยังคงเปิดใช้อยู่โดยค่าเริ่มต้นในอุปกรณ์ที่รองรับทั้งหมด
  • คลัสเตอร์ประเภทอื่นๆ (เช่น วิดีโอแนะนำ) จะเปิดและปิดใช้เป็นระยะๆ

หากการกำหนดค่าเริ่มต้นนี้ไม่เหมาะกับความต้องการของคุณ โปรดติดต่อ engage-developers@google.com

สำหรับ SDK เวอร์ชันก่อน v1.6.0 (เลิกใช้งานแล้ว)

Kotlin

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Java

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

API นี้ใช้เพื่อเผยแพร่รายการออบเจ็กต์ RecommendationCluster

ออบเจ็กต์ RecommendationCluster มีแอตทริบิวต์ต่อไปนี้ได้

แอตทริบิวต์ ข้อกำหนด คำอธิบาย
รายการ ProductEntity, StoreEntity หรือ RecipeEntity ต้องระบุ รายการเอนทิตีที่ประกอบขึ้นเป็นวิดีโอแนะนำสำหรับคลัสเตอร์วิดีโอแนะนำนี้ เอนทิตีในคลัสเตอร์เดียวต้องเป็นประเภทเดียวกัน
ชื่อ ต้องระบุ

ชื่อของคลัสเตอร์วิดีโอแนะนำ (เช่น Big savings on Thanksgiving menu)

ขนาดข้อความที่แนะนำ: ไม่เกิน 25 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ชื่อรอง ไม่บังคับ คำบรรยายสำหรับคลัสเตอร์วิดีโอแนะนำ
URI การดำเนินการ ไม่บังคับ

Deep Link ไปยังหน้าในแอปพาร์ทเนอร์ที่ผู้ใช้จะเห็นรายการวิดีโอแนะนำทั้งหมด

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ ดูคำถามที่พบบ่อยนี้

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Big savings on Thanksgiving menu")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Big savings on Thanksgiving menu")
                        .build())
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูลคลัสเตอร์วิดีโอแนะนำที่มีอยู่ทั้งหมดออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์คำแนะนำใหม่

ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

publishFeaturedCluster

API นี้ใช้เพื่อเผยแพร่ออบเจ็กต์ FeaturedCluster

Kotlin

client.publishFeaturedCluster(
            PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    FeaturedCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFeaturedCluster(
            new PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    new FeaturedCluster.Builder()
                        ...
                        .build())
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูล FeaturedCluster ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์ที่แนะนำที่อัปเดต

ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

publishFoodShoppingCarts

API นี้ใช้เพื่อเผยแพร่รายการออบเจ็กต์ FoodShoppingCart

Kotlin

client.publishFoodShoppingCarts(
            PublishFoodShoppingCartsRequest.Builder()
                .addFoodShoppingCart(
                    FoodShoppingCart.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFoodShoppingCarts(
            new PublishFoodShoppingCartsRequest.Builder()
                .addFoodShoppingCart(
                    new FoodShoppingCart.Builder()
                        ...
                        .build())
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูล FoodShoppingCart ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์รถเข็นช็อปปิ้งที่อัปเดต

ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

publishFoodShoppingLists

API นี้ใช้เพื่อเผยแพร่รายการออบเจ็กต์ FoodShoppingList

Kotlin

client.publishFoodShoppingLists(
            PublishFoodShoppingListsRequest.Builder()
                .addFoodShoppingList(
                    FoodShoppingList.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFoodShoppingLists(
            new PublishFoodShoppingListsRequest.Builder()
                .addFoodShoppingList(
                    new FoodShoppingList.Builder()
                        ...
                        .build())
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูล FoodShoppingList ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์รายการช็อปปิ้งที่อัปเดต

ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

publishReorderCluster

API นี้ใช้เพื่อเผยแพร่ออบเจ็กต์ FoodReorderCluster

Kotlin

client.publishReorderCluster(
            PublishReorderClusterRequest.Builder()
                .setReorderCluster(
                    FoodReorderCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishReorderCluster(
            new PublishReorderClusterRequest.Builder()
                .setReorderCluster(
                    new FoodReorderCluster.Builder()
                        ...
                        .build())
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูล FoodReorderCluster ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์การจัดเรียงใหม่ที่อัปเดต

ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

publishUserAccountManagementRequest

API นี้ใช้เพื่อเผยแพร่การ์ดลงชื่อเข้าใช้ การดำเนินการลงชื่อเข้าใช้จะนำผู้ใช้ไปยังหน้าลงชื่อเข้าใช้ของแอปเพื่อให้แอปเผยแพร่เนื้อหา (หรือแสดงเนื้อหาที่ปรับเปลี่ยนในแบบของผู้ใช้มากขึ้น) ได้

ข้อมูลเมตาต่อไปนี้เป็นส่วนหนึ่งของการ์ดลงชื่อเข้าใช้ -

แอตทริบิวต์ ข้อกำหนด คำอธิบาย
URI การดำเนินการ ต้องระบุ Deep Link ไปยังการดำเนินการ (เช่น ไปยังหน้าลงชื่อเข้าใช้แอป)
รูปภาพ ไม่บังคับ - หากไม่ได้ระบุ ต้องระบุชื่อ

รูปภาพที่แสดงในการ์ด

รูปภาพสัดส่วนภาพ 16x9 ที่มีความละเอียด 1264x712

ชื่อ ไม่บังคับ - หากไม่ได้ระบุ ต้องระบุรูปภาพ ชื่อบนบัตร
ข้อความเกี่ยวกับการดำเนินการ ไม่บังคับ ข้อความที่แสดงบน CTA (เช่น ลงชื่อเข้าใช้)
ชื่อรอง ไม่บังคับ คำบรรยายที่ไม่บังคับในการ์ด

Kotlin

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Java

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูล UserAccountManagementCluster ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์ UserAccountManagementCluster ที่อัปเดต

ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

updatePublishStatus

หากไม่มีการเผยแพร่คลัสเตอร์ใดเลยเนื่องจากเหตุผลทางธุรกิจภายใน เราขอแนะนำอย่างยิ่งให้อัปเดตสถานะการเผยแพร่โดยใช้ API updatePublishStatus ซึ่งเป็นสิ่งสำคัญเนื่องจากเหตุผลต่อไปนี้

  • การระบุสถานะในทุกสถานการณ์ แม้ว่าเนื้อหาจะเผยแพร่แล้ว (STATUS == PUBLISHED) ก็มีความสำคัญต่อการสร้างแดชบอร์ดที่ใช้สถานะที่ชัดเจนนี้เพื่อแสดงประสิทธิภาพและเมตริกอื่นๆ ของการผสานรวม
  • หากไม่มีการเผยแพร่เนื้อหาแต่สถานะการผสานรวมไม่เสียหาย (STATUS == NOT_PUBLISHED) Google จะหลีกเลี่ยงการทริกเกอร์การแจ้งเตือนในแดชบอร์ดประสิทธิภาพของแอปได้ ซึ่งเป็นการยืนยันว่าเนื้อหาไม่ได้เผยแพร่เนื่องจากสถานการณ์ที่คาดไว้จากมุมมองของผู้ให้บริการ
  • ซึ่งจะช่วยให้นักพัฒนาแอปทราบข้อมูลเชิงลึกเกี่ยวกับช่วงเวลาที่เผยแพร่ข้อมูลเทียบกับช่วงเวลาที่ไม่ได้เผยแพร่
  • Google อาจใช้รหัสสถานะเพื่อกระตุ้นให้ผู้ใช้ดำเนินการบางอย่างในแอปเพื่อให้เห็นเนื้อหาแอปหรือเอาชนะอุปสรรคได้

รายการรหัสสถานะการเผยแพร่ที่มีสิทธิ์มีดังนี้

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

หากเนื้อหาไม่ได้รับการเผยแพร่เนื่องจากผู้ใช้ไม่ได้เข้าสู่ระบบ Google ขอแนะนำให้เผยแพร่การ์ดลงชื่อเข้าใช้ หากผู้ให้บริการไม่สามารถเผยแพร่การ์ดการลงชื่อเข้าใช้ไม่ว่าด้วยเหตุผลใดก็ตาม เราขอแนะนำให้เรียกใช้ API updatePublishStatus พร้อมรหัสสถานะ NOT_PUBLISHED_REQUIRES_SIGN_IN

Kotlin

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationsClusters

API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์วิดีโอแนะนำ

Kotlin

client.deleteRecommendationsClusters()

Java

client.deleteRecommendationsClusters();

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์วิดีโอแนะนำ ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

deleteFeaturedCluster

API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์ที่แนะนํา

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์ที่แนะนำ ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

deleteFoodShoppingCartCluster

API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์รถเข็นช็อปปิ้งอาหาร

Kotlin

client.deleteFoodShoppingCartCluster()

Java

client.deleteFoodShoppingCartCluster();

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์รถเข็นช็อปปิ้งอาหาร ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

deleteFoodShoppingListCluster

API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์รายการช็อปปิ้งอาหาร

Kotlin

client.deleteFoodShoppingListCluster()

Java

client.deleteFoodShoppingListCluster();

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์รายการช็อปปิ้งอาหาร ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

deleteReorderCluster

API นี้ใช้เพื่อลบเนื้อหาของ FoodReorderCluster

Kotlin

client.deleteReorderCluster()

Java

client.deleteReorderCluster();

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์การจัดลำดับใหม่ ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

deleteUserManagementCluster

API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์ UserAccountManagement

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์ UserAccountManagement ในกรณีที่เกิดข้อผิดพลาด คำขอทั้งหมดจะถูกปฏิเสธและระบบจะคงสถานะที่มีอยู่ไว้

deleteClusters

API นี้ใช้เพื่อลบเนื้อหาของประเภทคลัสเตอร์ที่ระบุ

Kotlin

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      ...
      .build())

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                ...
                .build());

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์ทั้งหมดที่ตรงกับประเภทคลัสเตอร์ที่ระบุ ไคลเอ็นต์สามารถเลือกส่งคลัสเตอร์ประเภทเดียวหรือหลายประเภทก็ได้ ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะที่มีอยู่ไว้

การจัดการข้อผิดพลาด

เราขอแนะนำอย่างยิ่งให้ฟังผลลัพธ์ของงานจาก API การเผยแพร่ เพื่อให้สามารถดำเนินการติดตามผลเพื่อกู้คืนและส่งงานที่สำเร็จอีกครั้งได้

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

ระบบจะแสดงข้อผิดพลาดเป็น AppEngageException โดยมีสาเหตุรวมเป็นรหัสข้อผิดพลาด

รหัสข้อผิดพลาด ชื่อข้อผิดพลาด หมายเหตุ
1 SERVICE_NOT_FOUND บริการไม่พร้อมใช้งานในอุปกรณ์ที่ระบุ
2 SERVICE_NOT_AVAILABLE บริการพร้อมใช้งานในอุปกรณ์ที่ระบุ แต่ไม่พร้อมใช้งานในขณะที่โทร (เช่น มีการปิดใช้อย่างชัดแจ้ง)
3 SERVICE_CALL_EXECUTION_FAILURE การดำเนินการงานไม่สำเร็จเนื่องจากปัญหาเกี่ยวกับชุดข้อความ ในกรณีนี้ คุณสามารถลองอีกครั้งได้
4 SERVICE_CALL_PERMISSION_DENIED ผู้โทรไม่ได้รับอนุญาตให้โทรหาบริการ
5 SERVICE_CALL_INVALID_ARGUMENT คำขอมีข้อมูลที่ไม่ถูกต้อง (เช่น มีคลัสเตอร์มากกว่าจำนวนที่อนุญาต)
6 SERVICE_CALL_INTERNAL เกิดข้อผิดพลาดในฝั่งบริการ
7 SERVICE_CALL_RESOURCE_EXHAUSTED มีการเรียกใช้บริการบ่อยเกินไป

ขั้นตอนที่ 3: จัดการ Intent ของการออกอากาศ

นอกจากการเรียก API เพื่อเผยแพร่เนื้อหาผ่านงานแล้ว คุณยังต้องตั้งค่า BroadcastReceiver เพื่อรับคำขอเผยแพร่เนื้อหาด้วย

เป้าหมายของ Intent การออกอากาศคือการเปิดใช้งานแอปอีกครั้งและการบังคับให้ซิงค์ข้อมูลเป็นหลัก Intent การออกอากาศไม่ได้ออกแบบมาให้ส่งบ่อยเกินไป โดยจะทริกเกอร์ก็ต่อเมื่อบริการ Engage พิจารณาว่าเนื้อหาอาจเก่าแล้ว (เช่น มีอายุ 1 สัปดาห์) วิธีนี้จะช่วยเพิ่มความมั่นใจว่าผู้ใช้จะได้รับประสบการณ์การใช้งานเนื้อหาที่อัปเดตใหม่ แม้ว่าจะไม่ได้เรียกใช้แอปพลิเคชันเป็นเวลานานก็ตาม

คุณต้องตั้งค่า BroadcastReceiver ด้วย 2 วิธีต่อไปนี้

  • ลงทะเบียนอินสแตนซ์ของคลาส BroadcastReceiver แบบไดนามิกโดยใช้ Context.registerReceiver() ซึ่งจะช่วยให้แอปพลิเคชันที่ยังคงทำงานอยู่ในหน่วยความจำสามารถสื่อสารได้

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
  // broadcast is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is
  // received
  // Trigger food shopping cart cluster publish when PUBLISH_FOOD_SHOPPING_CART broadcast
  // is received
  // Trigger food shopping list cluster publish when PUBLISH_FOOD_SHOPPING_LIST broadcast
  // is received
  // Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
  // received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register food Shopping Cart Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FOOD_SHOPPING_CART),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register food Shopping List Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FOOD_SHOPPING_LIST),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register Reorder Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_REORDER_CLUSTER),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger food shopping cart cluster publish when PUBLISH_FOOD_SHOPPING_CART broadcast is
// received

// Trigger food shopping list cluster publish when PUBLISH_FOOD_SHOPPING_LIST broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
// received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register food Shopping Cart Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_FOOD_SHOPPING_CART),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register food Shopping List Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_FOOD_SHOPPING_LIST),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Reorder Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

}
  • ประกาศการติดตั้งใช้งานแบบคงที่ด้วยแท็ก <receiver> ในไฟล์ AndroidManifest.xml ซึ่งจะช่วยให้แอปพลิเคชันได้รับ Intent การออกอากาศเมื่อไม่ได้ทำงาน และยังช่วยให้แอปพลิเคชันเผยแพร่เนื้อหาได้ด้วย

<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_CART" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_LIST" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_REORDER_CLUSTER" />
      </intent-filter>
   </receiver>
</application>

บริการจะส่ง Intent ต่อไปนี้

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION ขอแนะนำให้เริ่มการโทร publishRecommendationClusters เมื่อได้รับ Intent นี้
  • com.google.android.engage.action.PUBLISH_FEATURED ขอแนะนำให้เริ่มการโทร publishFeaturedCluster เมื่อได้รับ Intent นี้
  • com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_CART ขอแนะนำให้เริ่มการโทร publishFoodShoppingCarts เมื่อได้รับ Intent นี้
  • com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_LIST ขอแนะนำให้เริ่มการโทร publishFoodShoppingLists เมื่อได้รับ Intent นี้
  • com.google.android.engage.action.food.PUBLISH_REORDER_CLUSTER ขอแนะนำให้เริ่มการโทร publishReorderCluster เมื่อได้รับ Intent นี้

เวิร์กโฟลว์การผสานรวม

ดูคำแนะนำทีละขั้นตอนในการยืนยันการผสานรวมหลังจากที่ผสานรวมเสร็จแล้วได้ที่เวิร์กโฟลว์การผสานรวมของนักพัฒนาแอป Engage

คำถามที่พบบ่อย

ดูคำถามที่พบบ่อยได้ที่คำถามที่พบบ่อยเกี่ยวกับ Engage SDK

รายชื่อติดต่อ

โปรดติดต่อ engage-developers@google.com หากมีคำถามใดๆ ในระหว่างกระบวนการผสานรวม ทีมของเราจะตอบกลับโดยเร็วที่สุด

ขั้นตอนถัดไป

หลังจากผสานรวมเสร็จแล้ว ขั้นตอนถัดไปมีดังนี้

  • ส่งอีเมลไปที่ engage-developers@google.com และแนบ APK ที่ผสานรวมซึ่งพร้อมให้ Google ทดสอบ
  • Google จะดำเนินการยืนยันและตรวจสอบภายในเพื่อให้แน่ใจว่าการผสานรวมทำงานได้ตามที่คาดไว้ หากจำเป็นต้องมีการเปลี่ยนแปลง Google จะติดต่อคุณพร้อมรายละเอียดที่จำเป็น
  • เมื่อการทดสอบเสร็จสมบูรณ์และไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ Google จะติดต่อคุณเพื่อแจ้งให้ทราบว่าคุณสามารถเริ่มเผยแพร่ APK ที่อัปเดตและผสานรวมแล้วไปยัง Play Store ได้
  • หลังจาก Google ยืนยันว่า APK ที่อัปเดตแล้วได้รับการเผยแพร่ไปยัง Play Store แล้ว ระบบจะเผยแพร่คลัสเตอร์วิดีโอแนะนำ แนะนำ รถเข็นช็อปปิ้ง รายการช็อปปิ้ง และสั่งซื้ออีกครั้ง และ ผู้ใช้จะเห็นคลัสเตอร์ดังกล่าว