กระตุ้นการมีส่วนร่วมในแอปด้วยการเข้าถึงผู้ใช้ในที่ที่ผู้ใช้อยู่ ผสานรวม Engage SDK เพื่อส่งคำแนะนำที่ปรับเปลี่ยนตามการใช้งานของผู้ใช้และเนื้อหาต่อเนื่องไปยัง ผู้ใช้โดยตรงในแพลตฟอร์มต่างๆ ในอุปกรณ์ เช่น คอลเล็กชัน, Entertainment Space และ Google Play Store การผสานรวมจะเพิ่มขนาด APK โดยเฉลี่ยไม่ถึง 50 KB (บีบอัด) และใช้เวลาของนักพัฒนาแอปประมาณ 1 สัปดาห์สำหรับแอปส่วนใหญ่ ดูข้อมูลเพิ่มเติมได้ที่เว็บไซต์ ธุรกิจ
คู่มือนี้มีวิธีการสำหรับพาร์ทเนอร์นักพัฒนาแอปในการส่งเนื้อหาโซเชียลมีเดียไปยังแพลตฟอร์มเนื้อหา Engage
รายละเอียดการผสานรวม
ส่วนต่อไปนี้จะอธิบายรายละเอียดการผสานรวม
คำศัพท์
กลุ่มคำแนะนำจะแสดงคำแนะนำที่ปรับเปลี่ยนในแบบของคุณจากพาร์ทเนอร์นักพัฒนาแอปแต่ละราย
คำแนะนำจะมีโครงสร้างดังนี้
คลัสเตอร์คำแนะนำ: มุมมอง UI ที่มีกลุ่มคำแนะนำ จากพาร์ทเนอร์นักพัฒนาแอปรายเดียวกัน
คลัสเตอร์คำแนะนำแต่ละรายการประกอบด้วยเอนทิตี 2 ประเภทต่อไปนี้
- PortraitMediaEntity
- SocialPostEntity
PortraitMediaEntity ต้องมีรูปภาพแนวตั้ง 1 รูปสำหรับโพสต์ คุณจะระบุข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์และ การโต้ตอบหรือไม่ก็ได้
- โพสต์ - รูปภาพในโหมดแนวตั้งและแสตมป์เวลา หรือ
- รูปภาพในโหมดแนวตั้ง + เนื้อหาข้อความและแสตมป์เวลา
 
- โปรไฟล์ - รูปโปรไฟล์ ชื่อหรือแฮนเดิล รูปภาพเพิ่มเติม
 
- การโต้ตอบ - นับและติดป้ายกำกับเท่านั้น หรือ
- จำนวนและภาพ (ไอคอน)
 
SocialPostEntity มีข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์ โพสต์ และการโต้ตอบ
- โปรไฟล์ - อวตาร ชื่อหรือแฮนเดิล ข้อความเพิ่มเติม รูปภาพเพิ่มเติม
 
- โพสต์ - ข้อความและการประทับเวลา หรือ
- ริชมีเดีย (รูปภาพหรือ URL แบบริช) และการประทับเวลา หรือ
- ข้อความและริชมีเดีย (รูปภาพหรือริช URL) และการประทับเวลา หรือ
- ตัวอย่างวิดีโอ (ภาพปกและระยะเวลา) และการประทับเวลา
 
- การโต้ตอบ - นับและติดป้ายกำกับเท่านั้น หรือ
- จำนวนและภาพ (ไอคอน)
 
สิ่งที่ต้องเตรียมก่อนดำเนินการ
ระดับ 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.5.2'
}
สรุป
การออกแบบนี้อิงตามการใช้งานบริการ ที่เชื่อมโยง
ข้อมูลที่ไคลเอ็นต์เผยแพร่ได้จะขึ้นอยู่กับขีดจำกัดต่อไปนี้สำหรับคลัสเตอร์ประเภทต่างๆ
| ประเภทคลัสเตอร์ | ขีดจำกัดของคลัสเตอร์ | ขีดจำกัดของเอนทิตีขั้นต่ำในคลัสเตอร์ | ขีดจำกัดสูงสุดของเอนทิตีในคลัสเตอร์ | 
|---|---|---|---|
| คลัสเตอร์คำแนะนำ | ไม่เกิน 7 | อย่างน้อย 1 ( PortraitMediaEntityหรือSocialPostEntity) | สูงสุด 50 รายการ ( PortraitMediaEntityหรือSocialPostEntity) | 
ขั้นตอนที่ 1: ระบุข้อมูลนิติบุคคล
SDK ได้กำหนดเอนทิตีต่างๆ เพื่อแสดงรายการแต่ละประเภท SDK รองรับเอนทิตีต่อไปนี้สำหรับหมวดหมู่โซเชียล
- PortraitMediaEntity
- SocialPostEntity
แผนภูมิด้านล่างแสดงแอตทริบิวต์ที่มีและข้อกำหนดสำหรับแต่ละประเภท
PortraitMediaEntity
| แอตทริบิวต์ | ข้อกำหนด | คำอธิบาย | รูปแบบ | 
|---|---|---|---|
| URI ของการดำเนินการ | ต้องระบุ | Deep Link ไปยังเอนทิตีในแอปของผู้ให้บริการ หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้ | URI | 
| ข้อมูลเมตาที่เกี่ยวข้องกับโพสต์ (ต้องระบุ) | |||
| รูปภาพ | ต้องระบุ | รูปภาพควรมีสัดส่วนภาพแนวตั้ง UI อาจแสดงรูปภาพเพียง 1 รูปเมื่อมีการระบุรูปภาพหลายรูป อย่างไรก็ตาม UI อาจแสดงภาพที่บ่งบอกว่ามีรูปภาพเพิ่มเติมใน แอป หากโพสต์เป็นวิดีโอ ผู้ให้บริการควรระบุภาพขนาดย่อของ วิดีโอเพื่อแสดงเป็นรูปภาพ | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| ชิ้นงานข้อความ | ไม่บังคับ | ข้อความหลักของโพสต์ ข้อมูลอัปเดต ฯลฯ | สตริง (แนะนำให้ใช้สูงสุด 140 อักขระ) | 
| การประทับเวลา | ไม่บังคับ | เวลาที่เผยแพร่โพสต์ | การประทับเวลา Epoch ในหน่วยมิลลิวินาที | 
| เป็นเนื้อหาวิดีโอ | ไม่บังคับ | โพสต์เป็นวิดีโอใช่ไหม | บูลีน | 
| ระยะเวลาของวิดีโอ | ไม่บังคับ | ระยะเวลาของวิดีโอเป็นมิลลิวินาที | ยาว | 
| ข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์ (ไม่บังคับ) | |||
| ชื่อ | ต้องระบุ | ชื่อโปรไฟล์ รหัส หรือแฮนเดิล เช่น "John Doe" "@TeamPixel" | สตริง(แนะนำให้มีความยาวสูงสุด 25 อักขระ) | 
| รูปโปรไฟล์ | ต้องระบุ | รูปโปรไฟล์หรือรูปโปรไฟล์ของผู้ใช้ รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1 | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| รูปภาพเพิ่มเติม | ไม่บังคับ | ป้ายโปรไฟล์ เช่น ป้ายยืนยันสถานะ รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1 | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| ข้อมูลเมตาที่เกี่ยวข้องกับการโต้ตอบ (ไม่บังคับ) | |||
| จำนวน | ไม่บังคับ | ระบุจํานวนการโต้ตอบ เช่น "3.7 ล้าน" หมายเหตุ: หากระบุทั้งจำนวนและมูลค่าของจำนวน ระบบจะใช้จำนวน | สตริง ขนาดข้อความที่แนะนำ: สูงสุด 20 อักขระสำหรับจำนวน + ป้ายกำกับ รวมกัน | 
| ค่าจำนวน | ไม่บังคับ | จำนวนการโต้ตอบเป็นค่า หมายเหตุ: ระบุค่า Count แทน Count หากแอปของคุณไม่จัดการตรรกะเกี่ยวกับวิธีเพิ่มประสิทธิภาพ จำนวนมากสำหรับขนาดการแสดงผลต่างๆ หากระบุทั้งจำนวน และค่าจำนวน ระบบจะใช้จำนวน | ยาว | 
| ป้ายกำกับ | ไม่บังคับ | ระบุว่าป้ายกำกับการโต้ตอบใช้สำหรับอะไร เช่น "ชอบ" | สตริง ขนาดข้อความที่แนะนำ: สูงสุด 20 อักขระสำหรับจำนวน + ป้ายกำกับ รวมกัน | 
| ภาพ | ไม่บังคับ | ระบุว่าการโต้ตอบมีไว้เพื่ออะไร เช่น รูปภาพที่แสดง ไอคอนชอบ อีโมจิ ระบุรูปภาพได้มากกว่า 1 รูป แต่ระบบอาจไม่แสดงรูปภาพทั้งหมดในอุปกรณ์บางรูปแบบ หมายเหตุ: ต้องเป็นรูปภาพสี่เหลี่ยมจัตุรัส 1:1 | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| DisplayTimeWindow (ไม่บังคับ) - ตั้งค่ากรอบเวลา เพื่อให้เนื้อหาแสดงในแพลตฟอร์ม | |||
| การประทับเวลาเริ่มต้น | ไม่บังคับ | การประทับเวลา Epoch หลังจากที่ควรแสดงเนื้อหาบน แพลตฟอร์ม หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงในแพลตฟอร์ม | การประทับเวลา Epoch ในหน่วยมิลลิวินาที | 
| การประทับเวลาสิ้นสุด | ไม่บังคับ | การประทับเวลา Epoch หลังจากที่ระบบจะไม่แสดงเนื้อหาบนแพลตฟอร์มอีกต่อไป หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงในแพลตฟอร์ม | การประทับเวลา Epoch ในหน่วยมิลลิวินาที | 
SocialPostEntity
| แอตทริบิวต์ | ข้อกำหนด | คำอธิบาย | รูปแบบ | 
|---|---|---|---|
| URI ของการดำเนินการ | ต้องระบุ | Deep Link ไปยังเอนทิตีในแอปของผู้ให้บริการ หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้ | URI | 
| ข้อมูลเมตาที่เกี่ยวข้องกับโพสต์ (ต้องระบุ) ต้องระบุ TextContent, Image หรือ WebContent อย่างน้อย 1 รายการ | |||
| รูปภาพ | ไม่บังคับ | รูปภาพควรมีสัดส่วนภาพแนวตั้ง UI อาจแสดงรูปภาพเพียง 1 รูปเมื่อมีการระบุรูปภาพหลายรูป อย่างไรก็ตาม UI อาจแสดงภาพที่บ่งบอกว่ามีรูปภาพเพิ่มเติมใน แอป หากโพสต์เป็นวิดีโอ ผู้ให้บริการควรระบุภาพขนาดย่อของ วิดีโอเพื่อแสดงเป็นรูปภาพ | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| ชิ้นงานข้อความ | ไม่บังคับ | ข้อความหลักของโพสต์ ข้อมูลอัปเดต ฯลฯ | สตริง (แนะนำให้ใช้สูงสุด 140 อักขระ) | 
| เนื้อหาวิดีโอ (ไม่บังคับ) | |||
| ระยะเวลา | ต้องระบุ | ระยะเวลาของวิดีโอเป็นมิลลิวินาที | ยาว | 
| รูปภาพ | ต้องระบุ | แสดงตัวอย่างรูปภาพของเนื้อหาวิดีโอ | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| ตัวอย่างลิงก์ (ไม่บังคับ) | |||
| ตัวอย่างลิงก์ - ชื่อ | ต้องระบุ | ข้อความเพื่อระบุชื่อของเนื้อหาหน้าเว็บ | สตริง | 
| ตัวอย่างลิงก์ - ชื่อโฮสต์ | ต้องระบุ | ข้อความที่ระบุเจ้าของหน้าเว็บ เช่น "INSIDER" | สตริง | 
| ตัวอย่างลิงก์ - รูปภาพ | ไม่บังคับ | รูปภาพหลักสำหรับเนื้อหาเว็บ | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| การประทับเวลา | ไม่บังคับ | เวลาที่เผยแพร่โพสต์ | การประทับเวลา Epoch ในหน่วยมิลลิวินาที | 
| ข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์ (ไม่บังคับ) | |||
| ชื่อ | ต้องระบุ | ชื่อโปรไฟล์ รหัส หรือแฮนเดิล เช่น "John Doe" "@TeamPixel" | สตริง(แนะนำให้มีความยาวสูงสุด 25 อักขระ) | 
| ข้อความเพิ่มเติม | ไม่บังคับ | อาจใช้เป็นรหัสโปรไฟล์ แฮนเดิล หรือข้อมูลเมตาเพิ่มเติมได้ เช่น "@John-Doe", "ผู้ติดตาม 5 ล้านคน", "คุณอาจชอบ", "มาแรง", "โพสต์ใหม่ 5 รายการ" | สตริง(แนะนำให้ใช้อักขระไม่เกิน 40 ตัว) | 
| รูปโปรไฟล์ | ต้องระบุ | รูปโปรไฟล์หรือรูปโปรไฟล์ของผู้ใช้ รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1 | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| รูปภาพเพิ่มเติม | ไม่บังคับ | ป้ายโปรไฟล์ เช่น ป้ายยืนยันแล้ว รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1 | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| ข้อมูลเมตาที่เกี่ยวข้องกับการโต้ตอบ (ไม่บังคับ) | |||
| จำนวน | ต้องระบุ | ระบุจํานวนการโต้ตอบ เช่น "3.7 ล้าน" | สตริง (แนะนำให้ใช้สูงสุด 20 อักขระสำหรับรวมจำนวน + ป้ายกำกับ) | 
| ป้ายกำกับ | ไม่บังคับ หากไม่ได้ระบุไว้ คุณต้องระบุ Visual | ระบุว่าการโต้ตอบมีไว้เพื่ออะไร เช่น "ชอบ" | สตริง (แนะนำให้ใช้สูงสุด 20 อักขระสำหรับรวมจำนวน + ป้ายกำกับ) | 
| ภาพ | ไม่บังคับ หากไม่ได้ระบุไว้ คุณต้องระบุ Label | ระบุว่าการโต้ตอบมีไว้เพื่ออะไร เช่น รูปภาพที่แสดงไอคอน "ชอบ" และอีโมจิ ระบุรูปภาพได้มากกว่า 1 รูป แต่ระบบอาจไม่แสดงรูปภาพทั้งหมดในอุปกรณ์บางรูปแบบ รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1 | ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ | 
| DisplayTimeWindow (ไม่บังคับ) - ตั้งค่ากรอบเวลา เพื่อให้เนื้อหาแสดงในแพลตฟอร์ม | |||
| การประทับเวลาเริ่มต้น | ไม่บังคับ | การประทับเวลา Epoch หลังจากที่ควรแสดงเนื้อหาบน แพลตฟอร์ม หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงในแพลตฟอร์ม | การประทับเวลา Epoch ในหน่วยมิลลิวินาที | 
| การประทับเวลาสิ้นสุด | ไม่บังคับ | การประทับเวลา Epoch หลังจากที่ระบบจะไม่แสดงเนื้อหาบนแพลตฟอร์มอีกต่อไป หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงในแพลตฟอร์ม | การประทับเวลา Epoch ในหน่วยมิลลิวินาที | 
ข้อกำหนดเกี่ยวกับรูปภาพ
รูปภาพต้องโฮสต์อยู่ใน CDN สาธารณะเพื่อให้ Google เข้าถึง รูปภาพได้
รูปแบบไฟล์
PNG, JPG, GIF แบบภาพนิ่ง, WebP
ขนาดไฟล์สูงสุด
5120 KB
คำแนะนำเพิ่มเติม
- พื้นที่ปลอดภัยของรูปภาพ: ใส่เนื้อหาที่สําคัญไว้ตรงกลาง 80% ของ รูปภาพ
- ใช้พื้นหลังโปร่งใสเพื่อให้รูปภาพแสดงอย่างถูกต้องในการตั้งค่าธีมมืดและธีมสว่าง
ขั้นตอนที่ 2: ระบุข้อมูลคลัสเตอร์
ขอแนะนำให้เรียกใช้งานเนื้อหาที่เผยแพร่ในเบื้องหลัง (เช่น ใช้ WorkManager) และกำหนดเวลาเป็นประจำหรือตามเหตุการณ์ (เช่น ทุกครั้งที่ ผู้ใช้เปิดแอปหรือเมื่อผู้ใช้เพิ่งติดตามบัญชีใหม่)
AppEngageSocialClient มีหน้าที่เผยแพร่คลัสเตอร์โซเชียล
มี API ต่อไปนี้เพื่อเผยแพร่คลัสเตอร์ในไคลเอ็นต์
- isServiceAvailable
- publishRecommendationClusters
- publishUserAccountManagementRequest
- updatePublishStatus
- deleteRecommendationsClusters
- deleteUserManagementCluster
- deleteClusters
isServiceAvailable
API นี้ใช้เพื่อตรวจสอบว่าบริการพร้อมใช้งานสำหรับการผสานรวมหรือไม่ และ สามารถแสดงเนื้อหาในอุปกรณ์ได้หรือไม่
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 มีแอตทริบิวต์ต่อไปนี้ได้
| แอตทริบิวต์ | ข้อกำหนด | คำอธิบาย | 
|---|---|---|
| รายการ SocialPostEntity หรือ PortraitMediaEntity | ต้องระบุ | รายการเอนทิตีที่ประกอบกันเป็นคำแนะนำสำหรับ คลัสเตอร์คำแนะนำนี้ เอนทิตีในคลัสเตอร์เดียวต้องเป็นประเภทเดียวกัน | 
| ชื่อ | ต้องระบุ | ชื่อของคลัสเตอร์คำแนะนำ (เช่น ล่าสุด จากเพื่อนๆ) ขนาดข้อความที่แนะนำ: ไม่เกิน 25 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา) | 
| ชื่อรอง | ไม่บังคับ | คำบรรยายของคลัสเตอร์คำแนะนำ | 
| URI ของการดำเนินการ | ไม่บังคับ | Deep Link ไปยังหน้าในแอปพาร์ทเนอร์ที่ผู้ใช้จะดู รายการคำแนะนำทั้งหมดได้ หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้ | 
Kotlin
client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build())
Java
client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build());
เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว
- ระบบจะนำข้อมูลคลัสเตอร์คำแนะนำที่มีอยู่ออกทั้งหมด
- ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์คำแนะนำใหม่
ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะเดิมไว้
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());
deleteRecommendationClusters
API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์คำแนะนำ
Kotlin
client.deleteRecommendationClusters()
Java
client.deleteRecommendationClusters();
เมื่อได้รับคำขอ บริการจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์คำแนะนำ ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมด และคงสถานะเดิมไว้
deleteUserManagementCluster
API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์ UserAccountManagement
Kotlin
client.deleteUserManagementCluster()
Java
client.deleteUserManagementCluster();
เมื่อบริการได้รับคำขอแล้ว ระบบจะนำข้อมูลที่มีอยู่ออกจากคลัสเตอร์ UserAccountManagement ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะเดิมไว้
deleteClusters
API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์ประเภทหนึ่งๆ
Kotlin
client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      ...
      .build())
Java
client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .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 เพื่อรับ
คำขอเผยแพร่เนื้อหาด้วย
เป้าหมายของความตั้งใจในการออกอากาศคือการเปิดใช้งานแอปอีกครั้งและการบังคับซิงค์ข้อมูลเป็นหลัก Broadcast Intents ไม่ได้ออกแบบมาให้ส่งบ่อยมาก ระบบจะทริกเกอร์การอัปเดตก็ต่อเมื่อบริการ Engage ระบุว่าเนื้อหาอาจล้าสมัย (เช่น มีอายุ 1 สัปดาห์) ด้วยวิธีนี้ ผู้ใช้จึงมั่นใจได้มากขึ้นว่าจะได้รับประสบการณ์การใช้งานเนื้อหาใหม่ๆ แม้ว่าจะไม่ได้เรียกใช้แอปพลิเคชันเป็นเวลานานก็ตาม
ต้องตั้งค่า BroadcastReceiver ด้วย 2 วิธีต่อไปนี้
- ลงทะเบียนอินสแตนซ์ของคลาส - BroadcastReceiverแบบไดนามิกโดยใช้- Context.registerReceiver()ซึ่งจะช่วยให้แอปพลิเคชันที่ยังคงทำงานอยู่ในหน่วยความจำสื่อสารได้
Kotlin
class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
  // 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)
}
Java
class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION 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);
}
- ประกาศการติดตั้งใช้งานแบบคงที่ด้วยแท็ก - <receiver>ในไฟล์- AndroidManifest.xmlซึ่งจะช่วยให้แอปพลิเคชันรับ Broadcast 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>
   </receiver>
</application>
บริการจะส่ง Intent ต่อไปนี้
- com.google.android.engage.action.PUBLISH_RECOMMENDATIONเราขอแนะนำให้เริ่มการโทร- publishRecommendationClustersเมื่อ ได้รับความตั้งใจนี้
เวิร์กโฟลว์การผสานรวม
ดูคำแนะนำแบบทีละขั้นตอนเกี่ยวกับการยืนยันการผสานรวมหลังจากเสร็จสมบูรณ์ได้ที่ เวิร์กโฟลว์การผสานรวมนักพัฒนาแอป Engage
คำถามที่พบบ่อย
ดูคำถามที่พบบ่อยได้ที่คำถามที่พบบ่อยเกี่ยวกับ Engage SDK
รายชื่อติดต่อ
โปรดติดต่อ
engage-developers@google.com หากมีคำถาม
ในระหว่างกระบวนการผสานรวม ทีมของเราจะตอบกลับโดยเร็วที่สุด
ขั้นตอนถัดไป
หลังจากผสานรวมเสร็จสมบูรณ์แล้ว ขั้นตอนถัดไปมีดังนี้
- ส่งอีเมลไปที่
engage-developers@google.comและแนบ APK ที่ผสานรวมแล้วซึ่งพร้อมให้ Google ทดสอบ
- Google จะทำการยืนยันและตรวจสอบภายในเพื่อให้แน่ใจว่าการผสานรวมทำงานได้ตามที่คาดไว้ หากจำเป็นต้องเปลี่ยนแปลง Google จะติดต่อคุณพร้อมรายละเอียดที่จำเป็น
- เมื่อการทดสอบเสร็จสมบูรณ์และไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ Google จะติดต่อคุณเพื่อ แจ้งให้ทราบว่าคุณเริ่มเผยแพร่ APK ที่อัปเดตและผสานรวมไปยัง Play Store ได้แล้ว
- หลังจาก Google ยืนยันว่า APK ที่อัปเดตได้รับการเผยแพร่ใน Play Store แล้ว คำแนะนำและคลัสเตอร์จะได้รับการเผยแพร่และผู้ใช้จะมองเห็น
