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

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

คลัสเตอร์วิดีโอแนะนำ

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

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

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

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

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

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

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

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

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

Lenient

เราขอแนะนำให้อัปเดตวิดีโอแนะนำวันละครั้งเพื่อให้ผู้ใช้เห็นวิดีโอแนะนำใหม่ๆ ทุกวัน

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

Strict

เราขอแนะนำให้อัปเดตคลังเนื้อหาเมื่อผู้ใช้ออกจากแอปของนักพัฒนาแอป

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

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

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

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

Lenient

เราขอแนะนำให้อัปเดตวิดีโอแนะนำวันละครั้ง

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

Strict

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

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

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