หลักเกณฑ์การเผยแพร่คลัสเตอร์ SDK ของ Engage

คู่มือนี้มีชุดหลักเกณฑ์สำหรับการเผยแพร่คลัสเตอร์ที่นักพัฒนาซอฟต์แวร์ สามารถใช้เมื่อผสานรวมกับ Engage SDK

คลัสเตอร์คำแนะนำ

ชื่อคลัสเตอร์

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

ตัวอย่างชื่อคลัสเตอร์ที่ดีซึ่งอิงจากเนื้อหามีดังนี้

  • คลัสเตอร์ที่เกี่ยวข้องกับ Shopping
    • ดีล Lightning
    • ต้องซื้อประจำสัปดาห์
    • เกี่ยวข้องกับการซื้อ Pixel Buds ของคุณ
    • รองเท้าบู๊ตกันฝนสำหรับผู้หญิง
  • กลุ่มหนังสือเกี่ยวกับสุขภาพ
    • สุขภาพ จิตใจ และ เนื้อความ
    • แนะนำสำหรับคุณใน Health
    • ขายดีที่สุดในกลุ่มฟิตเนส

เนื้อหาของคลัสเตอร์

เมื่อเผยแพร่คลัสเตอร์คำแนะนำ นักพัฒนาแอปต้องพิจารณาว่าจะ ผู้ใช้ได้ลงชื่อเข้าใช้แอปพลิเคชันของนักพัฒนาซอฟต์แวร์แล้ว

เมื่อผู้ใช้ลงชื่อเข้าใช้

หากผู้ใช้ลงชื่อเข้าใช้แอปสำหรับนักพัฒนาซอฟต์แวร์ เราขอแนะนำให้เผยแพร่ คลัสเตอร์เนื้อหาที่ปรับเปลี่ยนในแบบของคุณหรือที่ผู้ใช้สร้างขึ้น เนื่องจากปรับเปลี่ยนในแบบของคุณและ เนื้อหาที่ผู้ใช้สร้างขึ้นมีความเกี่ยวข้องกับผู้ใช้มากกว่า และมีแรงจูงใจที่จะ ให้ไปที่แอปนักพัฒนาซอฟต์แวร์ จากแพลตฟอร์มของ Google

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

ไม่เข้มงวด

เราขอแนะนำให้คุณอัปเดตคำแนะนำวันละครั้ง ผู้ใช้จะเห็นคำแนะนำใหม่ๆ ได้ทุกวัน

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

เข้มงวด

เราขอแนะนำให้อัปเดตไลบรารีเนื้อหาเมื่อผู้ใช้ออกจาก แอปสำหรับนักพัฒนาซอฟต์แวร์

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

เมื่อผู้ใช้ไม่ได้ลงชื่อเข้าใช้

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

  • คุณควรเผยแพร่คลัสเตอร์คำแนะนำที่ไม่ได้ปรับตามโปรไฟล์ของผู้ใช้
    • ตัวอย่างบางส่วนของคำแนะนำที่ไม่ได้ปรับตามโปรไฟล์ของผู้ใช้มีดังต่อไปนี้
      • หนังสือ 10 อันดับแรกที่มีการอ่านมากที่สุดในปีนี้
      • ภาพยนตร์ออกใหม่
      • พอดแคสต์มาแรง
  • เผยแพร่การ์ดการลงชื่อเข้าใช้
    • ในการกระตุ้นให้ผู้ใช้ลงชื่อเข้าใช้แอปสำหรับนักพัฒนาซอฟต์แวร์ นักพัฒนาแอป อาจเลือกที่จะเผยแพร่การ์ดลงชื่อเข้าใช้ พร้อมกับการ์ด คลัสเตอร์คำแนะนำ โปรดดูส่วนด้านล่างสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ วิธีเผยแพร่การ์ดลงชื่อเข้าใช้
ประเภทคำแนะนำ กลยุทธ์ความใหม่ของเนื้อหา หลักเกณฑ์ความใหม่ของเนื้อหา
คำแนะนำที่ไม่ได้ปรับตามโปรไฟล์ของผู้ใช้

ไม่เข้มงวด

เราแนะนำให้อัปเดตคำแนะนำ 1 ครั้ง วัน

เนื่องจากผู้ใช้ไม่คาดคิดได้เลยว่า เนื้อหาที่แนะนำ กลยุทธ์ความใหม่ของเนื้อหาอาจเป็น ผ่อนปรน
การ์ดลงชื่อเข้าใช้ในคำแนะนำ

เข้มงวด

เราขอแนะนำให้อัปเดตสถานะการ์ดลงชื่อเข้าใช้เมื่อผู้ใช้ออก แอปนักพัฒนาซอฟต์แวร์

หลังจากผู้ใช้ลงชื่อเข้าใช้แล้ว นักพัฒนาแอปต้องลบการ์ดด้วยการเรียกใช้ deleteUserManagementCluster() API

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

คลัสเตอร์แบบต่อเนื่อง

เมื่อเผยแพร่คลัสเตอร์อย่างต่อเนื่อง นักพัฒนาแอปต้องพิจารณาว่าจะ ผู้ใช้ได้ลงชื่อเข้าใช้แอปพลิเคชันของนักพัฒนาซอฟต์แวร์แล้ว

เมื่อผู้ใช้ลงชื่อเข้าใช้

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

เข้มงวด

เราขอแนะนำให้อัปเดตไลบรารีเนื้อหาเมื่อผู้ใช้ออกจาก แอปสำหรับนักพัฒนาซอฟต์แวร์

สิ่งสำคัญคือการทำให้เนื้อหานี้ตรงกับข้อมูลที่แสดงใน ในแพลตฟอร์มต่างๆ ของ 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 วิธีนี้ช่วยให้แอปพลิเคชันสามารถรับการออกอากาศ เมื่อไม่ได้ทำงานอยู่ และอนุญาตให้แอปพลิเคชันสามารถเผยแพร่ เนื้อหานั้น