คู่มือนี้มีชุดหลักเกณฑ์สำหรับการเผยแพร่คลัสเตอร์ที่นักพัฒนาซอฟต์แวร์ สามารถใช้เมื่อผสานรวมกับ Engage SDK
คลัสเตอร์คำแนะนำ
ชื่อคลัสเตอร์
เราขอแนะนำให้ระบุชื่อคลัสเตอร์ที่ไม่ซ้ำกันและเกี่ยวข้อง ซึ่งทำให้ผู้ใช้ ข้อมูลเชิงลึกเกี่ยวกับเนื้อหาของคลัสเตอร์มากขึ้น
ตัวอย่างชื่อคลัสเตอร์ที่ดีซึ่งอิงจากเนื้อหามีดังนี้
- คลัสเตอร์ที่เกี่ยวข้องกับ Shopping
- ดีล Lightning
- ต้องซื้อประจำสัปดาห์
- เกี่ยวข้องกับการซื้อ Pixel Buds ของคุณ
- รองเท้าบู๊ตกันฝนสำหรับผู้หญิง
- กลุ่มหนังสือเกี่ยวกับสุขภาพ
- สุขภาพ จิตใจ และ เนื้อความ
- แนะนำสำหรับคุณใน Health
- ขายดีที่สุดในกลุ่มฟิตเนส
เนื้อหาของคลัสเตอร์
เมื่อเผยแพร่คลัสเตอร์คำแนะนำ นักพัฒนาแอปต้องพิจารณาว่าจะ ผู้ใช้ได้ลงชื่อเข้าใช้แอปพลิเคชันของนักพัฒนาซอฟต์แวร์แล้ว
เมื่อผู้ใช้ลงชื่อเข้าใช้
หากผู้ใช้ลงชื่อเข้าใช้แอปสำหรับนักพัฒนาซอฟต์แวร์ เราขอแนะนำให้เผยแพร่ คลัสเตอร์เนื้อหาที่ปรับเปลี่ยนในแบบของคุณหรือที่ผู้ใช้สร้างขึ้น เนื่องจากปรับเปลี่ยนในแบบของคุณและ เนื้อหาที่ผู้ใช้สร้างขึ้นมีความเกี่ยวข้องกับผู้ใช้มากกว่า และมีแรงจูงใจที่จะ ให้ไปที่แอปนักพัฒนาซอฟต์แวร์ จากแพลตฟอร์มของ Google
- เผยแพร่คำแนะนำที่ปรับเปลี่ยนในแบบของคุณได้
- ตัวอย่างคำแนะนำที่ปรับเปลี่ยนในแบบของคุณมีดังนี้
- รายการยอดนิยมตามประวัติการดูของผู้ใช้
- หนังสือที่คล้ายกับหนังสือที่อยู่ในประวัติการอ่านของผู้ใช้
- เพลงโดยศิลปินคนโปรดของผู้ใช้
- ตัวอย่างคำแนะนำที่ปรับเปลี่ยนในแบบของคุณมีดังนี้
- คุณจะเผยแพร่ไลบรารีเนื้อหาที่ผู้ใช้สร้างขึ้นได้
- ต่อไปนี้คือตัวอย่างบางส่วนของไลบรารีเนื้อหาที่ผู้ใช้สร้างขึ้น
- รายการที่อยากดูของผู้ใช้จากแอปของนักพัฒนาแอป
- รายชื่อศิลปินโปรดของผู้ใช้จากนักพัฒนาแอปที่รายงานด้วยตนเอง แอป
- ต่อไปนี้คือตัวอย่างบางส่วนของไลบรารีเนื้อหาที่ผู้ใช้สร้างขึ้น
ประเภทคำแนะนำ | กลยุทธ์ความใหม่ของเนื้อหา | หลักเกณฑ์ความใหม่ของเนื้อหา |
---|---|---|
คำแนะนำสำหรับคุณโดยเฉพาะ | ไม่เข้มงวด เราขอแนะนำให้คุณอัปเดตคำแนะนำวันละครั้ง ผู้ใช้จะเห็นคำแนะนำใหม่ๆ ได้ทุกวัน |
เนื่องจากผู้ใช้ไม่คาดคิดได้เลยว่า เนื้อหาที่แนะนำ กลยุทธ์ความใหม่ของเนื้อหาอาจเป็น ผ่อนปรน |
ไลบรารีเนื้อหาที่ผู้ใช้สร้างขึ้น | เข้มงวด เราขอแนะนำให้อัปเดตไลบรารีเนื้อหาเมื่อผู้ใช้ออกจาก แอปสำหรับนักพัฒนาซอฟต์แวร์ |
สิ่งสำคัญคือการทำให้เนื้อหานี้ตรงกับข้อมูลที่แสดงใน แพลตฟอร์มของ Google นั่นเพราะว่า สิ่งนี้ต่างจากคำแนะนำที่ปรับเปลี่ยนในแบบของคุณ ผู้ใช้คาดหวังว่าจะได้เห็นเนื้อหาแบบใดแบบหนึ่ง ความล่าช้าอย่างมากใน การเผยแพร่จะทำให้ผู้ใช้สับสน ดังนั้นกลยุทธ์ความใหม่ของเนื้อหา จะต้องมีความเข้มงวด |
เมื่อผู้ใช้ไม่ได้ลงชื่อเข้าใช้
หากผู้ใช้ไม่ได้ลงชื่อเข้าใช้แอปนักพัฒนาแอป เรายังคงแนะนําให้เผยแพร่ คลัสเตอร์เพื่อให้ผู้ใช้ไปที่แอปของนักพัฒนาซอฟต์แวร์จาก แพลตฟอร์ม
- คุณควรเผยแพร่คลัสเตอร์คำแนะนำที่ไม่ได้ปรับตามโปรไฟล์ของผู้ใช้
- ตัวอย่างบางส่วนของคำแนะนำที่ไม่ได้ปรับตามโปรไฟล์ของผู้ใช้มีดังต่อไปนี้
- หนังสือ 10 อันดับแรกที่มีการอ่านมากที่สุดในปีนี้
- ภาพยนตร์ออกใหม่
- พอดแคสต์มาแรง
- ตัวอย่างบางส่วนของคำแนะนำที่ไม่ได้ปรับตามโปรไฟล์ของผู้ใช้มีดังต่อไปนี้
- เผยแพร่การ์ดการลงชื่อเข้าใช้
- ในการกระตุ้นให้ผู้ใช้ลงชื่อเข้าใช้แอปสำหรับนักพัฒนาซอฟต์แวร์ นักพัฒนาแอป อาจเลือกที่จะเผยแพร่การ์ดลงชื่อเข้าใช้ พร้อมกับการ์ด คลัสเตอร์คำแนะนำ โปรดดูส่วนด้านล่างสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ วิธีเผยแพร่การ์ดลงชื่อเข้าใช้
ประเภทคำแนะนำ | กลยุทธ์ความใหม่ของเนื้อหา | หลักเกณฑ์ความใหม่ของเนื้อหา |
---|---|---|
คำแนะนำที่ไม่ได้ปรับตามโปรไฟล์ของผู้ใช้ | ไม่เข้มงวด เราแนะนำให้อัปเดตคำแนะนำ 1 ครั้ง วัน |
เนื่องจากผู้ใช้ไม่คาดคิดได้เลยว่า เนื้อหาที่แนะนำ กลยุทธ์ความใหม่ของเนื้อหาอาจเป็น ผ่อนปรน |
การ์ดลงชื่อเข้าใช้ในคำแนะนำ | เข้มงวด เราขอแนะนำให้อัปเดตสถานะการ์ดลงชื่อเข้าใช้เมื่อผู้ใช้ออก แอปนักพัฒนาซอฟต์แวร์ หลังจากผู้ใช้ลงชื่อเข้าใช้แล้ว นักพัฒนาแอปต้องลบการ์ดด้วยการเรียกใช้
|
สถานะการลงชื่อเข้าใช้จะซิงค์กับ แพลตฟอร์ม ทำให้ผู้ใช้สับสนหากเห็นการ์ดลงชื่อเข้าใช้ในบัญชี จะปรากฏขึ้นเมื่อผู้ใช้ลงชื่อเข้าใช้แล้ว ดังนั้น ความใหม่ของเนื้อหา ต้องเป็นกลยุทธ์ที่เข้มงวด |
คลัสเตอร์แบบต่อเนื่อง
เมื่อเผยแพร่คลัสเตอร์อย่างต่อเนื่อง นักพัฒนาแอปต้องพิจารณาว่าจะ ผู้ใช้ได้ลงชื่อเข้าใช้แอปพลิเคชันของนักพัฒนาซอฟต์แวร์แล้ว
เมื่อผู้ใช้ลงชื่อเข้าใช้
- คุณควรเผยแพร่คลัสเตอร์ความต่อเนื่องที่ผู้ใช้สร้างขึ้น
- ตัวอย่างของคลัสเตอร์แบบต่อเนื่องที่ผู้ใช้สร้างขึ้นมีดังนี้
- รับชมต่อจากตำแหน่งที่ผู้ใช้ดูค้างไว้
- อ่านต่อจากจุดที่ผู้ใช้อ่านค้างไว้
- ตัวอย่างของคลัสเตอร์แบบต่อเนื่องที่ผู้ใช้สร้างขึ้นมีดังนี้
ประเภทความต่อเนื่อง | กลยุทธ์ความใหม่ของเนื้อหา | หลักเกณฑ์ความใหม่ของเนื้อหา |
---|---|---|
คลัสเตอร์ความต่อเนื่องที่ผู้ใช้สร้างขึ้น | เข้มงวด เราขอแนะนำให้อัปเดตไลบรารีเนื้อหาเมื่อผู้ใช้ออกจาก แอปสำหรับนักพัฒนาซอฟต์แวร์ |
สิ่งสำคัญคือการทำให้เนื้อหานี้ตรงกับข้อมูลที่แสดงใน ในแพลตฟอร์มต่างๆ ของ Google นั่นเพราะว่า สิ่งนี้ต่างจากคำแนะนำที่ปรับเปลี่ยนในแบบของคุณ ผู้ใช้คาดหวังว่าจะได้เห็นเนื้อหาแบบใดแบบหนึ่ง ความล่าช้าอย่างมากใน การเผยแพร่จะทำให้ผู้ใช้สับสน ดังนั้นกลยุทธ์ความใหม่ของเนื้อหา จะต้องมีความเข้มงวด |
เมื่อผู้ใช้ไม่ได้ลงชื่อเข้าใช้
เส้นทางต่อเนื่องมีไว้สำหรับผู้ใช้ที่ลงชื่อเข้าใช้เป็นหลัก อย่างไรก็ตาม คุณยังเผยแพร่คลัสเตอร์ Continuation สำหรับผู้ใช้ที่ออกจากระบบได้ด้วย หากแอปของคุณรองรับเซสชันผู้มาเยือน
คลัสเตอร์การจัดการผู้ใช้
จุดประสงค์หลักของคลัสเตอร์การจัดการผู้ใช้คือ กระตุ้นให้ผู้ใช้ดำเนินการบางอย่าง การดำเนินการในแอปผู้ให้บริการ การดำเนินการลงชื่อเข้าใช้จะนำผู้ใช้ไปยังเครื่องหมายของแอป ในหน้าเพื่อให้แอปเผยแพร่เนื้อหาได้ (หรือปรับให้เหมาะกับลูกค้าแต่ละรายมากขึ้น เนื้อหา)
บัตรลงชื่อเข้าใช้
แอตทริบิวต์ | ข้อกำหนด | คำอธิบาย |
---|---|---|
การดำเนินการ 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());
หลังจากผู้ใช้ลงชื่อเข้าใช้แล้ว นักพัฒนาแอปต้องลบการ์ดด้วยการเรียกใช้
deleteUserManagementCluster()
API
อัปเดตสถานะการเผยแพร่
หากไม่มีการเผยแพร่คลัสเตอร์ใดเลยด้วยเหตุผลทางธุรกิจภายใน เราขอแนะนำเป็นอย่างยิ่งให้อัปเดตสถานะการเผยแพร่โดยใช้ updatePublishStatus API ซึ่งเป็นสิ่งสำคัญเนื่องจาก :
- การแจ้งสถานะในทุกสถานการณ์ แม้ว่าจะมีการเผยแพร่เนื้อหาแล้วก็ตาม (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
หากเนื้อหาไม่ได้รับการเผยแพร่เนื่องจากผู้ใช้ไม่ได้เข้าสู่ระบบ เราขอแนะนำให้เผยแพร่การ์ดลงชื่อเข้าใช้ หากผู้ให้บริการไม่สามารถเผยแพร่การ์ดลงชื่อเข้าใช้ได้ ไม่ว่าจะด้วยเหตุผลใดก็ตาม เราขอแนะนำให้เรียกใช้ updatePublishStatus API มีรหัสสถานะ 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
นอกจากการเผยแพร่การเรียก Content API ผ่านงานแล้ว
ที่จำเป็นต่อการตั้งค่า
BroadcastReceiver
เพื่อรับ
คำขอสำหรับการเผยแพร่เนื้อหา
อย่างไรก็ตาม นักพัฒนาซอฟต์แวร์ต้องไม่พึ่งการออกอากาศเพียงอย่างเดียว เนื่องจากจะมีการทริกเกอร์ในบางสถานการณ์เท่านั้น โดยจะใช้กับแอป การเปิดใช้งานใหม่และบังคับให้ซิงค์ข้อมูล โดยจะทริกเกอร์ก็ต่อเมื่อ บริการพิจารณาว่าเนื้อหาอาจไม่มีอัปเดตแล้ว วิธีนี้ทำให้ มั่นใจว่าผู้ใช้จะได้รับประสบการณ์ เนื้อหาที่สดใหม่ แม้ว่า ไม่มีการเปิดแอปพลิเคชันเป็นเวลานาน
ต้องตั้งค่า BroadcastReceiver
ด้วย 2 วิธีต่อไปนี้
- ลงทะเบียนอินสแตนซ์ของคลาส
BroadcastReceiver
แบบไดนามิกโดยใช้Context.registerReceiver()
การดำเนินการนี้จะทำให้แอปพลิเคชันสามารถสื่อสารกันได้ ที่ยังหลงเหลืออยู่ในความทรงจำ - ประกาศการติดตั้งใช้งานที่มีแท็ก
<receiver>
แบบคงที่ในบัญชีAndroidManifest.xml
วิธีนี้ช่วยให้แอปพลิเคชันสามารถรับการออกอากาศ เมื่อไม่ได้ทำงานอยู่ และอนุญาตให้แอปพลิเคชันสามารถเผยแพร่ เนื้อหานั้น