คู่มือนี้ประกอบด้วยชุดหลักเกณฑ์สำหรับการเผยแพร่คลัสเตอร์ที่นักพัฒนาแอปสามารถใช้เมื่อผสานรวมกับ Engage SDK
คลัสเตอร์วิดีโอแนะนำ
ชื่อคลัสเตอร์
เราขอแนะนำให้ระบุชื่อคลัสเตอร์ที่ไม่ซ้ำกันและมีความเกี่ยวข้อง ซึ่งจะช่วยให้ผู้ใช้ได้รับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับเนื้อหาของคลัสเตอร์
ตัวอย่างชื่อคลัสเตอร์ที่ดีซึ่งอิงตามเนื้อหามีดังนี้
- คลัสเตอร์ที่เกี่ยวข้องกับ Shopping
- Lightning Deals
- สิ่งที่ต้องซื้อประจำสัปดาห์
- เกี่ยวข้องกับการซื้อ Pixel Buds
- รองเท้าบู๊ตกันฝนสำหรับผู้หญิง
- กลุ่มหนังสือเกี่ยวกับสุขภาพ
- สุขภาพ ใจและกาย
- แนะนำสำหรับคุณในหมวดหมู่สุขภาพ
- สินค้าขายดีในหมวดฟิตเนส
เนื้อหาคลัสเตอร์
เมื่อเผยแพร่คลัสเตอร์วิดีโอแนะนำ นักพัฒนาแอปต้องพิจารณาว่าผู้ใช้ลงชื่อเข้าใช้แอปพลิเคชันของนักพัฒนาแอปหรือไม่
เมื่อผู้ใช้ลงชื่อเข้าใช้
หากผู้ใช้ลงชื่อเข้าใช้แอปของนักพัฒนาแอป เราขอแนะนำให้เผยแพร่คลัสเตอร์เนื้อหาที่ปรับเปลี่ยนในแบบของผู้ใช้หรือเนื้อหาที่ผู้ใช้สร้างขึ้น เนื่องจากเนื้อหาที่ปรับเปลี่ยนในแบบของคุณและเนื้อหาที่ผู้ใช้สร้างขึ้นมีความเกี่ยวข้องกับผู้ใช้มากกว่า ผู้ใช้จึงมีแรงจูงใจมากขึ้นในการเข้าชมแอปของนักพัฒนาแอปจากแพลตฟอร์มของ Google
- เผยแพร่คำแนะนำที่ปรับเปลี่ยนในแบบของคุณได้
- ตัวอย่างคำแนะนำที่ปรับเปลี่ยนในแบบของคุณมีดังนี้
- รายการยอดนิยมที่อิงตามประวัติการดูของผู้ใช้
- หนังสือที่คล้ายกับหนังสือที่อยู่ในประวัติการอ่านของผู้ใช้
- เพลงจากศิลปินคนโปรดของผู้ใช้
- ตัวอย่างคำแนะนำที่ปรับเปลี่ยนในแบบของคุณมีดังนี้
- สามารถเผยแพร่คลังเนื้อหาที่ผู้ใช้สร้างขึ้นได้
- ตัวอย่างไลบรารีเนื้อหาที่ผู้ใช้สร้างขึ้นมีดังนี้
- รายการที่อยากดูของผู้ใช้จากแอปของนักพัฒนาแอป
- รายชื่อศิลปินที่ผู้ใช้ชื่นชอบซึ่งรายงานด้วยตนเองจากแอปของนักพัฒนาแอป
- ตัวอย่างไลบรารีเนื้อหาที่ผู้ใช้สร้างขึ้นมีดังนี้
| ประเภทคำแนะนำ | กลยุทธ์ความใหม่ของเนื้อหา | หลักเกณฑ์ด้านความใหม่ของเนื้อหา |
|---|---|---|
| คำแนะนำสำหรับคุณโดยเฉพาะ | Lenient เราขอแนะนำให้อัปเดตวิดีโอแนะนำวันละครั้งเพื่อให้ผู้ใช้เห็นวิดีโอแนะนำใหม่ๆ ทุกวัน |
เนื่องจากผู้ใช้ไม่ได้คาดหวังอย่างเจาะจงว่าเนื้อหาแนะนำจะเป็นอย่างไร กลยุทธ์ความสดใหม่ของเนื้อหาจึงอาจยืดหยุ่นได้ |
| คลังเนื้อหาที่ผู้ใช้สร้างขึ้น | Strict เราขอแนะนำให้อัปเดตคลังเนื้อหาเมื่อผู้ใช้ออกจากแอปของนักพัฒนาแอป |
เนื้อหานี้ต้องซิงค์กับข้อมูลที่แสดงในแพลตฟอร์มของ Google เนื่องจากผู้ใช้คาดหวังว่าจะได้รับชุดเนื้อหาที่ตรงกันทั้งหมด ซึ่งต่างจากคำแนะนำที่ปรับเปลี่ยนในแบบของคุณ ความล่าช้าอย่างมากในการเผยแพร่จะทำให้ผู้ใช้สับสน ดังนั้น กลยุทธ์ความใหม่ของเนื้อหาจึงต้องเข้มงวด |
เมื่อผู้ใช้ไม่ได้ลงชื่อเข้าใช้
หากผู้ใช้ไม่ได้ลงชื่อเข้าใช้แอปของนักพัฒนาแอป เรายังคงแนะนำให้เผยแพร่คลัสเตอร์เพื่อให้ผู้ใช้เข้าชมแอปของนักพัฒนาแอปจากแพลตฟอร์มของ Google
- ควรเผยแพร่คลัสเตอร์คำแนะนำที่ไม่ได้ปรับเปลี่ยนในแบบของคุณ
- ตัวอย่างคำแนะนำที่ไม่ปรับเปลี่ยนในแบบของคุณมีดังนี้
- หนังสือ 10 อันดับแรกที่อ่านในปีนี้
- ภาพยนตร์ที่เพิ่งออกใหม่
- พอดแคสต์ที่กำลังมาแรง
- ตัวอย่างคำแนะนำที่ไม่ปรับเปลี่ยนในแบบของคุณมีดังนี้
- เผยแพร่การ์ดการลงชื่อเข้าใช้
- นักพัฒนาแอปอาจเลือกเผยแพร่การ์ดการลงชื่อเข้าใช้พร้อมกับคลัสเตอร์คำแนะนำที่ไม่ได้ปรับเปลี่ยนในแบบของคุณเพื่อกระตุ้นให้ผู้ใช้ลงชื่อเข้าใช้แอปของนักพัฒนาแอป ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีเผยแพร่การ์ดลงชื่อเข้าใช้ได้ที่ส่วนด้านล่าง
| ประเภทคำแนะนำ | กลยุทธ์ความใหม่ของเนื้อหา | หลักเกณฑ์ด้านความใหม่ของเนื้อหา |
|---|---|---|
| คำแนะนำที่ไม่ได้ปรับเปลี่ยนในแบบของคุณ | Lenient เราขอแนะนำให้อัปเดตวิดีโอแนะนำวันละครั้ง |
เนื่องจากผู้ใช้ไม่ได้คาดหวังอย่างเจาะจงว่าเนื้อหาแนะนำจะเป็นอย่างไร กลยุทธ์ความสดใหม่ของเนื้อหาจึงอาจยืดหยุ่นได้ |
| การ์ดลงชื่อเข้าใช้ในวิดีโอแนะนำ | Strict เราขอแนะนำให้อัปเดตสถานะการ์ดการลงชื่อเข้าใช้เมื่อผู้ใช้ออกจากแอปของนักพัฒนาแอป หลังจากผู้ใช้ลงชื่อเข้าใช้แล้ว นักพัฒนาแอปต้องลบบัตรโดยเรียกใช้ API |
สิ่งสำคัญคือสถานะการลงชื่อเข้าใช้ต้องซิงค์กับแพลตฟอร์มของ Google ผู้ใช้อาจสับสนเมื่อเห็นการ์ดลงชื่อเข้าใช้บนแพลตฟอร์มของ Google ทั้งที่ลงชื่อเข้าใช้อยู่แล้ว ดังนั้น กลยุทธ์ความสดใหม่ของเนื้อหาจึงต้องเข้มงวด |
คลัสเตอร์ความต่อเนื่อง
เมื่อเผยแพร่คลัสเตอร์ความต่อเนื่อง นักพัฒนาแอปต้องพิจารณาว่าผู้ใช้ลงชื่อเข้าใช้แอปพลิเคชันของนักพัฒนาแอปหรือไม่
เมื่อผู้ใช้ลงชื่อเข้าใช้
- ควรเผยแพร่คลัสเตอร์ความต่อเนื่องที่ผู้ใช้สร้างขึ้น
- ตัวอย่างคลัสเตอร์ความต่อเนื่องที่ผู้ใช้สร้างขึ้นมีดังนี้
- รับชมต่อจากจุดที่ผู้ใช้ดูค้างไว้
- อ่านต่อจากจุดที่ผู้ใช้อ่านค้างไว้
- ตัวอย่างคลัสเตอร์ความต่อเนื่องที่ผู้ใช้สร้างขึ้นมีดังนี้
| ประเภทความต่อเนื่อง | กลยุทธ์ความใหม่ของเนื้อหา | หลักเกณฑ์ด้านความใหม่ของเนื้อหา |
|---|---|---|
| คลัสเตอร์ความต่อเนื่องที่ผู้ใช้สร้างขึ้น | Strict เราขอแนะนำให้อัปเดตคลังเนื้อหาเมื่อผู้ใช้ออกจากแอปของนักพัฒนาแอป |
เนื้อหานี้ต้องซิงค์กับข้อมูลที่แสดงในแพลตฟอร์มของ Google เนื่องจากผู้ใช้คาดหวังว่าจะได้รับชุดเนื้อหาที่ตรงกันทั้งหมด ซึ่งต่างจากคำแนะนำที่ปรับเปลี่ยนในแบบของคุณ ความล่าช้าอย่างมากในการเผยแพร่จะทำให้ผู้ใช้สับสน ดังนั้น กลยุทธ์ความใหม่ของเนื้อหาจึงต้องเข้มงวด |
เมื่อผู้ใช้ไม่ได้ลงชื่อเข้าใช้
เส้นทางการใช้งานต่อมีไว้สำหรับผู้ใช้ที่ลงชื่อเข้าใช้เป็นหลัก แต่คุณยังเผยแพร่คลัสเตอร์การใช้งานต่อสำหรับผู้ใช้ที่ออกจากระบบได้ด้วยหากแอปของคุณรองรับเซสชันผู้มาเยือน
คลัสเตอร์การจัดการผู้ใช้
เป้าหมายหลักของคลัสเตอร์การจัดการผู้ใช้คือการกระตุ้นให้ผู้ใช้ดำเนินการบางอย่างในแอปของผู้ให้บริการ การดำเนินการลงชื่อเข้าใช้จะนำผู้ใช้ไปยังหน้าลงชื่อเข้าใช้ของแอปเพื่อให้แอปเผยแพร่เนื้อหา (หรือแสดงเนื้อหาที่ปรับเปลี่ยนในแบบของผู้ใช้มากขึ้น) ได้
การ์ดลงชื่อเข้าใช้
| แอตทริบิวต์ | ข้อกำหนด | คำอธิบาย |
|---|---|---|
| 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()
appEngagePublishClient.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();
appEngagePublishClient.publishUserAccountManagementRequest(
new PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
หลังจากผู้ใช้ลงชื่อเข้าใช้แล้ว นักพัฒนาแอปต้องลบบัตรโดยเรียกใช้ API deleteUserManagementCluster()
อัปเดตสถานะการเผยแพร่
หากไม่มีการเผยแพร่คลัสเตอร์ใดเลยเนื่องจากเหตุผลทางธุรกิจภายใน เราขอแนะนำอย่างยิ่งให้อัปเดตสถานะการเผยแพร่โดยใช้ 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
หากเนื้อหาไม่ได้รับการเผยแพร่เนื่องจากผู้ใช้ไม่ได้เข้าสู่ระบบ เราขอแนะนำให้เผยแพร่การ์ดลงชื่อเข้าใช้ หากผู้ให้บริการไม่สามารถเผยแพร่การ์ดการลงชื่อเข้าใช้ไม่ว่าด้วยเหตุผลใดก็ตาม เราขอแนะนำให้เรียกใช้ 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());
WorkManager สำหรับการเผยแพร่คลัสเตอร์
เราขอแนะนำให้ใช้ WorkManager เพื่อเผยแพร่คลัสเตอร์ เนื่องจากเป็นโซลูชันที่แนะนำสำหรับงานเบื้องหลังที่การดำเนินการต้องทั้งเหมาะสมและเชื่อถือได้
- WorkManager จะทำงานในเบื้องหลังโดยเร็วที่สุด
- WorkManager จะจัดการตรรกะเพื่อเริ่มงานภายใต้เงื่อนไขต่างๆ แม้ว่าผู้ใช้จะออกจากแอปไปแล้วก็ตาม
เมื่อผู้ใช้ออกจากแอป เราขอแนะนำให้เริ่มงานเบื้องหลังที่เผยแพร่คลัสเตอร์การรับชมต่อพร้อมกับคลัสเตอร์วิดีโอแนะนำ ตำแหน่งที่เหมาะสมในการจัดการตรรกะนี้คือ Activity.onStop() ซึ่งจะเรียกใช้เมื่อผู้ใช้ออกจากแอป
เราขอแนะนำให้ใช้ PeriodicWorkRequest เพื่อกำหนดเวลางานที่เกิดซ้ำซึ่งจะเผยแพร่คลัสเตอร์ทุกๆ 24 ชั่วโมง การใช้นโยบาย CANCEL_AND_REENQUEUE สำหรับการทริกเกอร์งานช่วยให้นักพัฒนาแอปมั่นใจได้ว่า WorkManager จะส่งข้อมูลที่อัปเดตทุกครั้งที่ผู้ใช้ออกจากแอป ซึ่งจะช่วยป้องกันไม่ให้ผู้ใช้เห็นข้อมูลที่ล้าสมัย
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงกรณีดังกล่าว
// Define the PublishClusters Worker requiring input
public class PublishClusters extends Worker {
public PublishClusters(Context appContext, WorkerParameters workerParams) {
super(appContext, workerParams);
}
@NonNull
@Override
public Result doWork() {
// publish clusters
}
...
}
public static void schedulePublishClusters(Context appContext) {
// Create a PeriodicWorkRequest to schedule a recurring job to update
// clusters at a regular interval
PeriodicWorkRequest publishClustersEntertainmentSpace =
// Define the time for the periodic job
new PeriodicWorkRequest.Builder(PublishClusters.class, 24, TimeUnit.HOURS)
// Set up a tag for the worker.
// Tags are Unique identifier, which can be used to identify that work
// later in order to cancel the work or observe its progress.
.addTag("Publish Clusters to Entertainment Space")
.build();
// Trigger Periodic Job, this will ensure that the periodic job is triggered
// only once since we have defined a uniqueWorkName
WorkManager.getInstance(appContext).enqueueUniquePeriodicWork(
// uniqueWorkName
"publishClustersEntertainmentSpace",
// If a work with the uniqueWorkName is already running, it will cancel the
// existing running jobs and replace it with the new instance.
// ExistingPeriodicWorkPolicy#CANCEL_AND_REENQUEUE
ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
// Recurring Work Request
publishClustersEntertainmentSpace);
}
จัดการ Intent ของการออกอากาศ
นอกจากการเรียก API เนื้อหาการเผยแพร่ผ่านงานแล้ว คุณยังต้องตั้งค่า BroadcastReceiver เพื่อรับคำขอเผยแพร่เนื้อหาด้วย
อย่างไรก็ตาม นักพัฒนาแอปต้องระมัดระวังไม่พึ่งพาการออกอากาศเพียงอย่างเดียว เนื่องจากจะมีการทริกเกอร์ในบางสถานการณ์เท่านั้น โดยหลักๆ แล้วคือการเปิดใช้งานแอปอีกครั้งและการบังคับให้ซิงค์ข้อมูล ระบบจะทริกเกอร์ก็ต่อเมื่อบริการ Engage พิจารณาว่าเนื้อหาอาจล้าสมัย วิธีนี้จะช่วยเพิ่มความมั่นใจว่าผู้ใช้จะได้รับประสบการณ์การใช้งานเนื้อหาที่สดใหม่ แม้ว่าจะไม่ได้เปิดแอปพลิเคชันเป็นเวลานานก็ตาม
คุณต้องตั้งค่า BroadcastReceiver ด้วย 2 วิธีต่อไปนี้
- ลงทะเบียนอินสแตนซ์ของคลาส
BroadcastReceiverแบบไดนามิกโดยใช้Context.registerReceiver()ซึ่งจะช่วยให้แอปพลิเคชันที่ยังคงทำงานอยู่ในหน่วยความจำสามารถสื่อสารได้ - ประกาศการติดตั้งใช้งานแบบคงที่ด้วยแท็ก
<receiver>ในไฟล์AndroidManifest.xmlซึ่งจะช่วยให้แอปพลิเคชันได้รับ Intent การออกอากาศเมื่อไม่ได้ทำงาน และยังช่วยให้แอปพลิเคชันเผยแพร่เนื้อหาได้ด้วย