Engage SDK Watch: دستورالعمل‌های یکپارچه‌سازی فنی شخص ثالث

با دسترسی به کاربران خود در هر کجا که هستند، تعامل با برنامه را افزایش دهید. Engage SDK را ادغام کنید تا محتوای Continue Watching و توصیه‌های شخصی‌سازی‌شده را مستقیماً به کاربران در چندین سطح روی دستگاه مانند Collections ، Entertainment Space و Play Store ارائه دهید. این ادغام کمتر از ۵۰ کیلوبایت (فشرده‌شده) به میانگین APK اضافه می‌کند و برای اکثر برنامه‌ها حدود یک هفته زمان توسعه‌دهنده را می‌گیرد. برای اطلاعات بیشتر به سایت تجاری ما مراجعه کنید.

این راهنما شامل دستورالعمل‌هایی برای شرکای توسعه‌دهنده است تا محتوای ویدیویی خود را با استفاده از Engage SDK برای پر کردن این ناحیه جدید و سطوح موجود گوگل، ادغام کنند.

جزئیات ادغام

اصطلاحات

این ادغام شامل سه نوع خوشه زیر است: توصیه ، ادامه و ویژه .

  • خوشه‌های توصیه ، پیشنهادهای شخصی‌سازی‌شده‌ای را برای مشاهده محتوا از یک شریک توسعه‌دهنده نشان می‌دهند.

    توصیه‌های شما ساختار زیر را دارند:

    • خوشه توصیه: یک نمای رابط کاربری که شامل گروهی از توصیه‌ها از یک شریک توسعه‌دهنده است.

      شکل ۱. رابط کاربری Entertainment Space که خوشه توصیه‌ها را از یک شریک واحد نشان می‌دهد.
    • موجودیت: یک شیء که یک آیتم واحد را در یک خوشه نشان می‌دهد. یک موجودیت می‌تواند یک فیلم، یک برنامه تلویزیونی، یک سریال تلویزیونی، ویدیوی زنده و موارد دیگر باشد. برای مشاهده فهرستی از انواع موجودیت‌های پشتیبانی شده، به بخش «ارائه داده‌های موجودیت» مراجعه کنید.

      شکل ۲. رابط کاربری Entertainment Space که یک موجودیت واحد را در خوشه توصیه یک شریک واحد نشان می‌دهد.
  • خوشه Continuation ویدیوهای ناتمام و قسمت‌های مرتبط تازه منتشر شده از چندین شریک توسعه‌دهنده را در یک گروه‌بندی رابط کاربری نشان می‌دهد. هر شریک توسعه‌دهنده مجاز به پخش حداکثر ۱۰ موجودیت در خوشه Continuation خواهد بود. تحقیقات نشان داده است که توصیه‌های شخصی‌سازی‌شده همراه با محتوای شخصی‌سازی‌شده Continuation بهترین تعامل کاربر را ایجاد می‌کند.

    شکل ۳. رابط کاربری Entertainment Space که یک خوشه Continuation را با توصیه‌های ناتمام از چندین شریک نشان می‌دهد (در حال حاضر فقط یک توصیه قابل مشاهده است).
  • خوشه ویژه ، مجموعه‌ای از موجودیت‌ها را از چندین شریک توسعه‌دهنده در یک گروه‌بندی رابط کاربری نمایش می‌دهد. یک خوشه ویژه وجود خواهد داشت که در نزدیکی بالای رابط کاربری با اولویت بالاتر از همه خوشه‌های توصیه نمایش داده می‌شود. هر شریک توسعه‌دهنده مجاز به پخش حداکثر 10 موجودیت در خوشه ویژه خواهد بود.

    شکل ۴. رابط کاربری Entertainment Space که یک خوشه ویژه با توصیه‌هایی از چندین شریک را نشان می‌دهد (در حال حاضر فقط یک توصیه قابل مشاهده است).

پیش کار

حداقل سطح API: ۱۹

کتابخانه 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.12'
}

برای اطلاعات بیشتر، به بخش «قابلیت مشاهده بسته‌ها در اندروید ۱۱» مراجعه کنید.

خلاصه

طراحی بر اساس پیاده‌سازی یک سرویس محدود (bound service) است.

داده‌هایی که یک کلاینت می‌تواند منتشر کند، برای انواع مختلف خوشه‌ها مشمول محدودیت‌های زیر است:

نوع خوشه محدودیت‌های خوشه حداکثر محدودیت‌های موجودیت در یک خوشه
خوشه(های) پیشنهادی حداکثر ۷ عدد حداکثر ۵۰
خوشه ادامه حداکثر ۱ حداکثر 20
خوشه ویژه حداکثر ۱ حداکثر 20

مرحله ۰: مهاجرت از یکپارچه‌سازی SDK موجود Media Home

مدل‌های داده نقشه از یکپارچه‌سازی موجود

اگر از یکپارچه‌سازی موجود Media Home مهاجرت می‌کنید، جدول زیر نحوه نگاشت مدل‌های داده در SDK های موجود به Engage SDK جدید را شرح می‌دهد:

معادل ادغام قرارداد MediaHomeVideoContract معادل ادغام SDK را فعال کنید
com.google.android.mediahome.video.PreviewChannel com.google.android.engage.common.datamodel.RecommendationCluster
com.google.android.mediahome.video.PreviewChannel.Builder com.google.android.engage.common.datamodel.RecommendationCluster.Builder
com.google.android.mediahome.video.PreviewChannelHelper com.google.android.engage.video.service.AppEngageVideoClient
com.google.android.mediahome.video.PreviewProgram به کلاس‌های جداگانه تقسیم شده است: EventVideo ، LiveStreamingVideo ، Movie ، TvEpisode ، TvSeason ، TvShow ، VideoClipEntity
com.google.android.mediahome.video.PreviewProgram.Builder به سازندگان در کلاس‌های جداگانه تقسیم شده است: EventVideo ، LiveStreamingVideo ، Movie ، TvEpisode ، TvSeason ، TvShow ، VideoClipEntity
com.google.android.mediahome.video.VideoContract دیگر نیازی نیست.
com.google.android.mediahome.video.WatchNextProgram به ویژگی‌هایی در کلاس‌های جداگانه تقسیم شده است: EventVideoEntity ، LiveStreamingVideoEntity ، MovieEntity ، TvEpisodeEntity ، TvSeasonEntity ، TvShowEntity ، VideoClipEntity
com.google.android.mediahome.video.WatchNextProgram.Builder به ویژگی‌هایی در کلاس‌های جداگانه تقسیم شده است: EventVideoEntity ، LiveStreamingVideoEntity ، MovieEntity ، TvEpisodeEntity ، TvSeasonEntity ، TvShowEntity ، VideoClipEntity

خوشه‌های انتشار در Media Home SDK در مقابل Engage SDK

با استفاده از Media Home SDK، خوشه‌ها و موجودیت‌ها از طریق APIهای جداگانه منتشر شدند:

// 1. Fetch existing channels
List<PreviewChannel> channels = PreviewChannelHelper.getAllChannels();

// 2. If there are no channels, publish new channels
long channelId = PreviewChannelHelper.publishChannel(builder.build());

// 3. If there are existing channels, decide whether to update channel contents
PreviewChannelHelper.updatePreviewChannel(channelId, builder.build());

// 4. Delete all programs in the channel
PreviewChannelHelper.deleteAllPreviewProgramsByChannelId(channelId);

// 5. publish new programs in the channel
PreviewChannelHelper.publishPreviewProgram(builder.build());

با Engage SDK، انتشار خوشه و موجودیت در یک فراخوانی API واحد ترکیب می‌شوند. تمام موجودیت‌هایی که به یک خوشه تعلق دارند، همراه با آن خوشه منتشر می‌شوند:

کاتلین

RecommendationCluster.Builder()
            .addEntity(MOVIE_ENTITY)
            .addEntity(MOVIE_ENTITY)
            .addEntity(MOVIE_ENTITY)
            .setTitle("Top Picks For You")
            .build()

جاوا

new RecommendationCluster.Builder()
                        .addEntity(MOVIE_ENTITY)
                        .addEntity(MOVIE_ENTITY)
                        .addEntity(MOVIE_ENTITY)
                        .setTitle("Top Picks For You")
                        .build();

مرحله ۱: ارائه داده‌های موجودیت

SDK برای نمایش هر نوع آیتم، موجودیت‌های مختلفی تعریف کرده است. ما از موجودیت‌های زیر برای دسته‌ی Watch پشتیبانی می‌کنیم:

  1. MovieEntity
  2. TvShowEntity
  3. TvSeasonEntity
  4. TvEpisodeEntity
  5. LiveStreamingVideoEntity
  6. VideoClipEntity

نمودار زیر ویژگی‌ها و الزامات هر نوع را شرح می‌دهد.

MovieEntity

ویژگی مورد نیاز یادداشت‌ها
نام مورد نیاز
تصاویر پوستر مورد نیاز حداقل یک تصویر مورد نیاز است و باید با نسبت ابعاد ارائه شود. (تصویر افقی ترجیح داده می‌شود، اما برای سناریوهای مختلف، ارسال هر دو تصویر عمودی و افقی توصیه می‌شود.)

برای راهنمایی به مشخصات تصویر مراجعه کنید.

پخش از طریق url مورد نیاز

لینک عمیق به برنامه ارائه دهنده برای شروع پخش فیلم.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

آدرس صفحه اطلاعات اختیاری

لینک عمیق به برنامه ارائه دهنده برای نمایش جزئیات مربوط به فیلم.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

تاریخ انتشار اختیاری در واحد میلی ثانیه.
در دسترس بودن مورد نیاز

قابل دسترس: محتوا بدون هیچ اقدام دیگری برای کاربر در دسترس است.

FREE_WITH_SUBSCRIPTION: محتوا پس از خرید اشتراک توسط کاربر، در دسترس قرار می‌گیرد.

محتوای پولی: محتوا نیاز به خرید یا اجاره توسط کاربر دارد.

خریداری شده: محتوا توسط کاربر خریداری یا اجاره شده است.

قیمت پیشنهادی اختیاری متن رایگان
مدت زمان مورد نیاز در حد میلی ثانیه.
ژانر مورد نیاز متن رایگان
رتبه‌بندی محتوا اختیاری متن آزاد، از استاندارد صنعت پیروی کنید. ( مثال )
متن فراخوان برای اقدام اختیاری متن رایگان برای نمایش به عنوان فراخوان عمل.
برچسب‌ها اختیاری فهرست برچسب‌های مرتبط با موجودیت.
نوع بعدی را تماشا کنید مشروط مورد نیاز

باید زمانی که کالا در خوشه Continuation قرار دارد، ارائه شود و باید یکی از چهار نوع زیر باشد:

ادامه: کاربر بیش از ۱ دقیقه از این محتوا را تماشا کرده است.

جدید: کاربر تمام قسمت‌های موجود از یک محتوای اپیزودیک را تماشا کرده است، اما یک قسمت جدید در دسترس قرار گرفته و دقیقاً یک قسمت تماشا نشده وجود دارد. این مورد برای برنامه‌های تلویزیونی، مسابقات فوتبال ضبط شده در یک سری و غیره صدق می‌کند.

بعدی: کاربر یک یا چند قسمت کامل از یک محتوای اپیزودیک را تماشا کرده است، اما یا بیش از یک قسمت باقی مانده است یا دقیقاً یک قسمت باقی مانده است که قسمت آخر "جدید" نیست و قبل از شروع تماشای محتوای اپیزودیک توسط کاربر منتشر شده است.

فهرست تماشا: کاربر صراحتاً انتخاب کرده است که یک فیلم، رویداد یا سریال را به فهرست تماشا اضافه کند تا به صورت دستی آنچه را که می‌خواهد در ادامه تماشا کند، انتخاب کند.

آخرین زمان نامزدی مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد، ارائه شود. بر حسب میلی‌ثانیه.
آخرین زمان موقعیت پخش مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد و WatchNextType روی CONTINUE تنظیم شده است، ارائه شود. این مقدار بر حسب میلی‌ثانیه است.

TvShowEntity

ویژگی مورد نیاز یادداشت‌ها
نام مورد نیاز
تصاویر پوستر مورد نیاز حداقل یک تصویر مورد نیاز است و باید با نسبت ابعاد ارائه شود. (تصویر افقی ترجیح داده می‌شود، اما برای سناریوهای مختلف، ارسال هر دو تصویر عمودی و افقی توصیه می‌شود.)

برای راهنمایی به مشخصات تصویر مراجعه کنید.

آدرس صفحه اطلاعات مورد نیاز

لینک عمیق به برنامه ارائه دهنده برای نمایش جزئیات برنامه تلویزیونی.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

پخش از طریق url اختیاری

لینک عمیق به برنامه ارائه دهنده برای شروع پخش برنامه تلویزیونی.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

تاریخ پخش اولین قسمت اختیاری در واحد میلی ثانیه.
تاریخ پخش آخرین قسمت اختیاری در واحد میلی ثانیه.
در دسترس بودن مورد نیاز

قابل دسترس: محتوا بدون هیچ اقدام دیگری برای کاربر در دسترس است.

FREE_WITH_SUBSCRIPTION: محتوا پس از خرید اشتراک توسط کاربر، در دسترس قرار می‌گیرد.

محتوای پولی: محتوا نیاز به خرید یا اجاره توسط کاربر دارد.

خریداری شده: محتوا توسط کاربر خریداری یا اجاره شده است.

قیمت پیشنهادی اختیاری متن رایگان
شمارش فصل مورد نیاز عدد صحیح مثبت
ژانر مورد نیاز متن رایگان
رتبه‌بندی محتوا اختیاری متن آزاد، از استاندارد صنعت پیروی کنید. ( مثال )
متن فراخوان برای اقدام اختیاری متن رایگان برای نمایش به عنوان فراخوان عمل.
برچسب‌ها اختیاری فهرست برچسب‌های مرتبط با موجودیت.
نوع بعدی را تماشا کنید مشروط مورد نیاز

باید زمانی که کالا در خوشه Continuation قرار دارد، ارائه شود و باید یکی از چهار نوع زیر باشد:

ادامه: کاربر بیش از ۱ دقیقه از این محتوا را تماشا کرده است.

جدید: کاربر تمام قسمت‌های موجود از یک محتوای اپیزودیک را تماشا کرده است، اما یک قسمت جدید در دسترس قرار گرفته و دقیقاً یک قسمت تماشا نشده وجود دارد. این مورد برای برنامه‌های تلویزیونی، مسابقات فوتبال ضبط شده در یک سری و غیره صدق می‌کند.

بعدی: کاربر یک یا چند قسمت کامل از یک محتوای اپیزودیک را تماشا کرده است، اما یا بیش از یک قسمت باقی مانده است یا دقیقاً یک قسمت باقی مانده است که قسمت آخر "جدید" نیست و قبل از شروع تماشای محتوای اپیزودیک توسط کاربر منتشر شده است.

فهرست تماشا: کاربر صراحتاً انتخاب کرده است که یک فیلم، رویداد یا سریال را به فهرست تماشا اضافه کند تا به صورت دستی آنچه را که می‌خواهد در ادامه تماشا کند، انتخاب کند.

آخرین زمان نامزدی مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد، ارائه شود. بر حسب میلی‌ثانیه.
آخرین زمان موقعیت پخش مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد و WatchNextType روی CONTINUE تنظیم شده است، ارائه شود. این مقدار بر حسب میلی‌ثانیه است.

TvSeasonEntity

ویژگی مورد نیاز یادداشت‌ها
نام مورد نیاز
تصاویر پوستر مورد نیاز حداقل یک تصویر مورد نیاز است و باید با نسبت ابعاد ارائه شود. (تصویر افقی ترجیح داده می‌شود، اما برای سناریوهای مختلف، ارسال هر دو تصویر عمودی و افقی توصیه می‌شود.)

برای راهنمایی به مشخصات تصویر مراجعه کنید.

آدرس صفحه اطلاعات مورد نیاز

لینک عمیق به اپلیکیشن ارائه دهنده برای نمایش جزئیات فصل برنامه‌های تلویزیونی.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

پخش از طریق url اختیاری

لینک عمیق به اپلیکیشن ارائه دهنده برای شروع پخش فصل برنامه‌های تلویزیونی.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

نمایش شماره فصل

اختیاری

موجود در نسخه ۱.۳.۱

رشته
تاریخ پخش اولین قسمت اختیاری در واحد میلی ثانیه.
تاریخ پخش آخرین قسمت اختیاری در واحد میلی ثانیه.
در دسترس بودن مورد نیاز

قابل دسترس: محتوا بدون هیچ اقدام دیگری برای کاربر در دسترس است.

FREE_WITH_SUBSCRIPTION: محتوا پس از خرید اشتراک توسط کاربر، در دسترس قرار می‌گیرد.

محتوای پولی: محتوا نیاز به خرید یا اجاره توسط کاربر دارد.

خریداری شده: محتوا توسط کاربر خریداری یا اجاره شده است.

قیمت پیشنهادی اختیاری متن رایگان
تعداد قسمت‌ها مورد نیاز عدد صحیح مثبت
ژانر مورد نیاز متن رایگان
رتبه‌بندی محتوا اختیاری متن آزاد، از استاندارد صنعت پیروی کنید. ( مثال )
متن فراخوان برای اقدام اختیاری متن رایگان برای نمایش به عنوان فراخوان عمل.
برچسب‌ها اختیاری فهرست برچسب‌های مرتبط با موجودیت.
نوع بعدی را تماشا کنید مشروط مورد نیاز

باید زمانی که کالا در خوشه Continuation قرار دارد، ارائه شود و باید یکی از چهار نوع زیر باشد:

ادامه: کاربر بیش از ۱ دقیقه از این محتوا را تماشا کرده است.

جدید: کاربر تمام قسمت‌های موجود از یک محتوای اپیزودیک را تماشا کرده است، اما یک قسمت جدید در دسترس قرار گرفته و دقیقاً یک قسمت تماشا نشده وجود دارد. این مورد برای برنامه‌های تلویزیونی، مسابقات فوتبال ضبط شده در یک سری و غیره صدق می‌کند.

بعدی: کاربر یک یا چند قسمت کامل از یک محتوای اپیزودیک را تماشا کرده است، اما یا بیش از یک قسمت باقی مانده است یا دقیقاً یک قسمت باقی مانده است که قسمت آخر "جدید" نیست و قبل از شروع تماشای محتوای اپیزودیک توسط کاربر منتشر شده است.

فهرست تماشا: کاربر صراحتاً انتخاب کرده است که یک فیلم، رویداد یا سریال را به فهرست تماشا اضافه کند تا به صورت دستی آنچه را که می‌خواهد در ادامه تماشا کند، انتخاب کند.

آخرین زمان نامزدی مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد، ارائه شود. بر حسب میلی‌ثانیه.
آخرین زمان موقعیت پخش مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد و WatchNextType روی CONTINUE تنظیم شده است، ارائه شود. این مقدار بر حسب میلی‌ثانیه است.

TvEpisodeEntity

ویژگی مورد نیاز یادداشت‌ها
نام مورد نیاز
تصاویر پوستر مورد نیاز حداقل یک تصویر مورد نیاز است و باید با نسبت ابعاد ارائه شود. (تصویر افقی ترجیح داده می‌شود، اما برای سناریوهای مختلف، ارسال هر دو تصویر عمودی و افقی توصیه می‌شود.)

برای راهنمایی به مشخصات تصویر مراجعه کنید.

پخش از طریق url مورد نیاز

لینک عمیق به برنامه ارائه دهنده برای شروع پخش قسمت.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

آدرس صفحه اطلاعات اختیاری

لینک عمیق به برنامه ارائه دهنده برای نمایش جزئیات مربوط به قسمت برنامه تلویزیونی.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

نمایش شماره قسمت

اختیاری

موجود در نسخه ۱.۳.۱

رشته
تاریخ پرواز مورد نیاز در واحد میلی ثانیه.
در دسترس بودن مورد نیاز

قابل دسترس: محتوا بدون هیچ اقدام دیگری برای کاربر در دسترس است.

FREE_WITH_SUBSCRIPTION: محتوا پس از خرید اشتراک توسط کاربر، در دسترس قرار می‌گیرد.

محتوای پولی: محتوا نیاز به خرید یا اجاره توسط کاربر دارد.

خریداری شده: محتوا توسط کاربر خریداری یا اجاره شده است.

قیمت پیشنهادی اختیاری متن رایگان
مدت زمان مورد نیاز باید یک مقدار مثبت بر حسب میلی ثانیه باشد.
ژانر مورد نیاز متن رایگان
رتبه‌بندی محتوا اختیاری متن آزاد، از استاندارد صنعت پیروی کنید. ( مثال )
متن فراخوان برای اقدام اختیاری متن رایگان برای نمایش به عنوان فراخوان عمل.
برچسب‌ها اختیاری فهرست برچسب‌های مرتبط با موجودیت.
نوع بعدی را تماشا کنید مشروط مورد نیاز

باید زمانی که کالا در خوشه Continuation قرار دارد، ارائه شود و باید یکی از چهار نوع زیر باشد:

ادامه: کاربر بیش از ۱ دقیقه از این محتوا را تماشا کرده است.

جدید: کاربر تمام قسمت‌های موجود از یک محتوای اپیزودیک را تماشا کرده است، اما یک قسمت جدید در دسترس قرار گرفته و دقیقاً یک قسمت تماشا نشده وجود دارد. این مورد برای برنامه‌های تلویزیونی، مسابقات فوتبال ضبط شده در یک سری و غیره صدق می‌کند.

بعدی: کاربر یک یا چند قسمت کامل از یک محتوای اپیزودیک را تماشا کرده است، اما یا بیش از یک قسمت باقی مانده است یا دقیقاً یک قسمت باقی مانده است که قسمت آخر "جدید" نیست و قبل از شروع تماشای محتوای اپیزودیک توسط کاربر منتشر شده است.

فهرست تماشا: کاربر صراحتاً انتخاب کرده است که یک فیلم، رویداد یا سریال را به فهرست تماشا اضافه کند تا به صورت دستی آنچه را که می‌خواهد در ادامه تماشا کند، انتخاب کند.

آخرین زمان نامزدی مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد، ارائه شود. بر حسب میلی‌ثانیه.
آخرین زمان موقعیت پخش مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد و WatchNextType روی CONTINUE تنظیم شده است، ارائه شود. این مقدار بر حسب میلی‌ثانیه است.

LiveStreamingVideoEntity

ویژگی مورد نیاز یادداشت‌ها
نام مورد نیاز
تصاویر پوستر مورد نیاز حداقل یک تصویر مورد نیاز است و باید با نسبت ابعاد ارائه شود. (تصویر افقی ترجیح داده می‌شود، اما برای سناریوهای مختلف، ارسال هر دو تصویر عمودی و افقی توصیه می‌شود.)

برای راهنمایی به مشخصات تصویر مراجعه کنید.

پخش از طریق url مورد نیاز

لینک عمیق به برنامه ارائه دهنده برای شروع پخش ویدیو.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

پخش کننده مورد نیاز متن رایگان
زمان شروع اختیاری در واحد میلی ثانیه.
زمان پایان اختیاری در واحد میلی ثانیه.
تعداد مشاهده اختیاری متن آزاد، باید بومی‌سازی شود.
متن فراخوان برای اقدام اختیاری متن رایگان برای نمایش به عنوان فراخوان عمل.
برچسب‌ها اختیاری فهرست برچسب‌های مرتبط با موجودیت.
نوع بعدی را تماشا کنید مشروط مورد نیاز

باید زمانی که کالا در خوشه Continuation قرار دارد، ارائه شود و باید یکی از چهار نوع زیر باشد:

ادامه: کاربر بیش از ۱ دقیقه از این محتوا را تماشا کرده است.

جدید: کاربر تمام قسمت‌های موجود از یک محتوای اپیزودیک را تماشا کرده است، اما یک قسمت جدید در دسترس قرار گرفته و دقیقاً یک قسمت تماشا نشده وجود دارد. این مورد برای برنامه‌های تلویزیونی، مسابقات فوتبال ضبط شده در یک سری و غیره صدق می‌کند.

بعدی: کاربر یک یا چند قسمت کامل از یک محتوای اپیزودیک را تماشا کرده است، اما یا بیش از یک قسمت باقی مانده است یا دقیقاً یک قسمت باقی مانده است که قسمت آخر "جدید" نیست و قبل از شروع تماشای محتوای اپیزودیک توسط کاربر منتشر شده است.

فهرست تماشا: کاربر صراحتاً انتخاب کرده است که یک فیلم، رویداد یا سریال را به فهرست تماشا اضافه کند تا به صورت دستی آنچه را که می‌خواهد در ادامه تماشا کند، انتخاب کند.

آخرین زمان نامزدی مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد، ارائه شود. بر حسب میلی‌ثانیه.
آخرین زمان موقعیت پخش مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد و WatchNextType روی CONTINUE تنظیم شده است، ارائه شود. این مقدار بر حسب میلی‌ثانیه است.

VideoClipEntity

شیء VideoClipEntity نشان‌دهنده یک موجودیت ویدیویی است که از رسانه‌های اجتماعی مانند TikTok یا YouTube می‌آید.

ویژگی مورد نیاز یادداشت‌ها
نام مورد نیاز
تصاویر پوستر مورد نیاز حداقل یک تصویر مورد نیاز است و باید با نسبت ابعاد ارائه شود. (تصویر افقی ترجیح داده می‌شود، اما برای سناریوهای مختلف، ارسال هر دو تصویر عمودی و افقی توصیه می‌شود.)

برای راهنمایی به مشخصات تصویر مراجعه کنید.

پخش از طریق url مورد نیاز

لینک عمیق به برنامه ارائه دهنده برای شروع پخش ویدیو.

توجه: می‌توانید از لینک‌های عمیق برای ارجاع استفاده کنید. به این سوالات متداول مراجعه کنید.

زمان ایجاد شده مورد نیاز در واحد میلی ثانیه.
مدت زمان مورد نیاز باید یک مقدار مثبت بر حسب میلی ثانیه باشد.
خالق مورد نیاز متن رایگان
تصویر خالق اختیاری تصویر آواتار خالق
تعداد مشاهده اختیاری متن آزاد، باید بومی‌سازی شود.
متن فراخوان برای اقدام اختیاری متن رایگان برای نمایش به عنوان فراخوان عمل.
برچسب‌ها اختیاری فهرست برچسب‌های مرتبط با موجودیت.
نوع بعدی را تماشا کنید مشروط مورد نیاز

باید زمانی که کالا در خوشه Continuation قرار دارد، ارائه شود و باید یکی از چهار نوع زیر باشد:

ادامه: کاربر بیش از ۱ دقیقه از این محتوا را تماشا کرده است.

جدید: کاربر تمام قسمت‌های موجود از یک محتوای اپیزودیک را تماشا کرده است، اما یک قسمت جدید در دسترس قرار گرفته و دقیقاً یک قسمت تماشا نشده وجود دارد. این مورد برای برنامه‌های تلویزیونی، مسابقات فوتبال ضبط شده در یک سری و غیره صدق می‌کند.

بعدی: کاربر یک یا چند قسمت کامل از یک محتوای اپیزودیک را تماشا کرده است، اما یا بیش از یک قسمت باقی مانده است یا دقیقاً یک قسمت باقی مانده است که قسمت آخر "جدید" نیست و قبل از شروع تماشای محتوای اپیزودیک توسط کاربر منتشر شده است.

فهرست تماشا: کاربر صراحتاً انتخاب کرده است که یک فیلم، رویداد یا سریال را به فهرست تماشا اضافه کند تا به صورت دستی آنچه را که می‌خواهد در ادامه تماشا کند، انتخاب کند.

آخرین زمان نامزدی مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد، ارائه شود. بر حسب میلی‌ثانیه.
آخرین زمان موقعیت پخش مشروط مورد نیاز باید زمانی که آیتم در خوشه Continuation قرار دارد و WatchNextType روی CONTINUE تنظیم شده است، ارائه شود. این مقدار بر حسب میلی‌ثانیه است.

مشخصات تصویر

بخش زیر مشخصات مورد نیاز برای تصاویر را فهرست می‌کند:

فرمت‌های فایل

PNG، JPG، GIF ثابت، WebP

حداکثر اندازه فایل

۵۱۲۰ کیلوبایت

توصیه‌های اضافی

  • ناحیه امن تصویر: محتوای مهم خود را در مرکز ۸۰٪ تصویر قرار دهید.

مثال

کاتلین

var movie = MovieEntity.Builder()
    .setName("Avengers")
    .addPosterImage(Image.Builder()
                          .setImageUri(Uri.parse("http://www.x.com/image.png"))
                          .setImageHeightInPixel(960)
                          .setImageWidthInPixel(408)
                          .build())
    .setPlayBackUri(Uri.parse("http://tv.com/playback/1"))
    .setReleaseDateEpochMillis(1633032895L)
    .setAvailability(ContentAvailability.AVAILABILITY_AVAILABLE)
    .setDurationMillis(12345678L)
    .addGenre("action")
    .addContentRating("R")
    .setWatchNextType(WatchNextType.TYPE_NEW)
    .setLastEngagementTimeMillis(1664568895L)
    .setCallToActionText("Watch Now")
    .addTag("Action")
    .build()

جاوا

MovieEntity movie = new MovieEntity.Builder()
                  .setName("Avengers")
                  .addPosterImage(
                      new Image.Builder()
                          .setImageUri(Uri.parse("http://www.x.com/image.png"))
                          .setImageHeightInPixel(960)
                          .setImageWidthInPixel(408)
                          .build())
                  .setPlayBackUri(Uri.parse("http://tv.com/playback/1"))
                  .setReleaseDateEpochMillis(1633032895L)
                  .setAvailability(ContentAvailability.AVAILABILITY_AVAILABLE)
                  .setDurationMillis(12345678L)
                  .addGenre("action")
                  .addContentRating("R")
                  .setWatchNextType(WatchNextType.TYPE_NEW)
                  .setLastEngagementTimeMillis(1664568895L)
                  .setCallToActionText("Watch Now")
                  .addTag("Action")
                  .build();

مرحله ۲: ارائه داده‌های خوشه‌ای

توصیه می‌شود که کار انتشار محتوا در پس‌زمینه اجرا شود (برای مثال، با استفاده از WorkManager ) و به صورت منظم یا بر اساس یک رویداد (مثلاً هر بار که کاربر برنامه را باز می‌کند یا وقتی کاربر چیزی را به سبد خرید خود اضافه می‌کند) برنامه‌ریزی شود.

AppEngagePublishClient مسئول انتشار کلاسترها است. APIهای زیر در کلاینت موجود هستند:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishContinuationCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteContinuationCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

این API برای بررسی اینکه آیا سرویس برای ادغام در دسترس است و آیا محتوا می‌تواند روی دستگاه ارائه شود، استفاده می‌شود.

کاتلین

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.
    }
}

جاوا

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 استفاده می‌شود.

کاتلین

client.publishRecommendationClusters(
      PublishRecommendationClustersRequest.Builder()
        .addRecommendationCluster(
          RecommendationCluster.Builder()
            .addEntity(entity1)
            .addEntity(entity2)
            .setTitle("Top Picks For You")
            .build()
        )
        .build()
    )

جاوا

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Top Picks For You")
                        .build())
                .build());

وقتی سرویس درخواست را دریافت می‌کند، اقدامات زیر در یک تراکنش انجام می‌شود:

  • داده‌های RecommendationCluster موجود از شریک توسعه‌دهنده حذف شده است.
  • داده‌های درخواست تجزیه و تحلیل شده و در خوشه توصیه به‌روزرسانی‌شده ذخیره می‌شوند.

در صورت بروز خطا، کل درخواست رد می‌شود و وضعیت موجود حفظ می‌شود.

publishFeaturedCluster

این API برای انتشار فهرستی از اشیاء FeaturedCluster استفاده می‌شود.

کاتلین

client.publishFeaturedCluster(
    PublishFeaturedClusterRequest.Builder()
      .setFeaturedCluster(
        FeaturedCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

جاوا

client.publishFeaturedCluster(
            new PublishFeaturedClustersRequest.Builder()
                .addFeaturedCluster(
                    new FeaturedCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

وقتی سرویس درخواست را دریافت می‌کند، اقدامات زیر در یک تراکنش انجام می‌شود:

  • داده‌های FeaturedCluster موجود از شریک توسعه‌دهنده حذف می‌شوند.
  • داده‌های حاصل از درخواست، تجزیه و تحلیل شده و در Featured Cluster به‌روزرسانی‌شده ذخیره می‌شوند.

در صورت بروز خطا، کل درخواست رد می‌شود و وضعیت موجود حفظ می‌شود.

publishContinuationCluster

این API برای انتشار یک شیء ContinuationCluster استفاده می‌شود.

کاتلین

client.publishContinuationCluster(
    PublishContinuationClusterRequest.Builder()
      .setContinuationCluster(
        ContinuationCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

جاوا

client.publishContinuationCluster(
            new PublishContinuationClusterRequest.Builder()
                .setContinuationCluster(
                    new ContinuationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

وقتی سرویس درخواست را دریافت می‌کند، اقدامات زیر در یک تراکنش انجام می‌شود:

  • داده‌های موجود در ContinuationCluster از شریک توسعه‌دهنده حذف می‌شوند.
  • داده‌های حاصل از درخواست تجزیه و تحلیل شده و در خوشه ادامه به‌روزرسانی‌شده ذخیره می‌شوند.

در صورت بروز خطا، کل درخواست رد می‌شود و وضعیت موجود حفظ می‌شود.

publishUserAccountManagementRequest

این API برای انتشار یک کارت ورود به سیستم استفاده می‌شود. عمل ورود به سیستم، کاربران را به صفحه ورود به سیستم برنامه هدایت می‌کند تا برنامه بتواند محتوا را منتشر کند (یا محتوای شخصی‌سازی‌شده‌تری ارائه دهد).

فراداده‌های زیر بخشی از کارت ورود به سیستم هستند -

ویژگی مورد نیاز توضیحات
اکشن اوری مورد نیاز پیوند عمیق به اقدام (یعنی به صفحه ورود به برنامه هدایت می‌شود)
تصویر اختیاری - در صورت عدم ارائه، عنوان باید ارائه شود

تصویر نشان داده شده روی کارت

تصاویر با نسبت تصویر ۱۶x۹ و وضوح تصویر ۱۲۶۴x۷۱۲

عنوان اختیاری - در صورت عدم ارائه، تصویر باید ارائه شود عنوان روی کارت
متن اکشن اختیاری متن نمایش داده شده در فراخوان عمل (مثلاً ورود)
زیرنویس اختیاری زیرنویس اختیاری روی کارت

کاتلین

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());

جاوا

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 == NOT_PUBLISHED)، گوگل می‌تواند از نمایش هشدارها در داشبوردهای سلامت برنامه جلوگیری کند. این تأیید می‌کند که محتوا به دلیل وضعیت مورد انتظار از دیدگاه ارائه‌دهنده منتشر نشده است.
  • این به توسعه‌دهندگان کمک می‌کند تا بینشی در مورد زمان انتشار داده‌ها در مقابل عدم انتشار آنها ارائه دهند.
  • گوگل ممکن است از کدهای وضعیت برای ترغیب کاربر به انجام اقدامات خاصی در برنامه استفاده کند تا بتواند محتوای برنامه را ببیند یا از آن عبور کند.

لیست کدهای وضعیت انتشار واجد شرایط عبارتند از:

// 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 فراخوانی کنید.

کاتلین

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

جاوا

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationClusters

این API برای حذف محتوای خوشه‌های توصیه استفاده می‌شود.

کاتلین

client.deleteRecommendationClusters()

جاوا

client.deleteRecommendationClusters();

وقتی سرویس درخواست را دریافت می‌کند، داده‌های موجود را از خوشه‌های توصیه حذف می‌کند. در صورت بروز خطا، کل درخواست رد می‌شود و وضعیت موجود حفظ می‌شود.

deleteFeaturedCluster

این API برای حذف محتوای Featured Cluster استفاده می‌شود.

کاتلین

client.deleteFeaturedCluster()

جاوا

client.deleteFeaturedCluster();

وقتی سرویس درخواست را دریافت می‌کند، داده‌های موجود را از Featured Cluster حذف می‌کند. در صورت بروز خطا، کل درخواست رد شده و وضعیت موجود حفظ می‌شود.

deleteContinuationCluster

این API برای حذف محتوای Continuation Cluster استفاده می‌شود.

کاتلین

client.deleteContinuationCluster()

جاوا

client.deleteContinuationCluster();

وقتی سرویس درخواست را دریافت می‌کند، داده‌های موجود را از خوشه ادامه حذف می‌کند. در صورت بروز خطا، کل درخواست رد می‌شود و وضعیت موجود حفظ می‌شود.

deleteUserManagementCluster

این API برای حذف محتوای کلاستر UserAccountManagement استفاده می‌شود.

کاتلین

client.deleteUserManagementCluster()

جاوا

client.deleteUserManagementCluster();

وقتی سرویس درخواست را دریافت می‌کند، داده‌های موجود را از کلاستر UserAccountManagement حذف می‌کند. در صورت بروز خطا، کل درخواست رد شده و وضعیت موجود حفظ می‌شود.

deleteClusters

این API برای حذف محتوای یک نوع خوشه مشخص استفاده می‌شود.

کاتلین

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_CONTINUATION)
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      .build())

جاوا

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_CONTINUATION)
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                .build());

وقتی سرویس درخواست را دریافت می‌کند، داده‌های موجود را از تمام خوشه‌هایی که با انواع خوشه‌های مشخص‌شده مطابقت دارند، حذف می‌کند. کلاینت‌ها می‌توانند یک یا چند نوع خوشه را ارسال کنند. در صورت بروز خطا، کل درخواست رد می‌شود و وضعیت موجود حفظ می‌شود.

مدیریت خطا

اکیداً توصیه می‌شود که به نتیجه‌ی وظیفه از APIهای انتشار گوش دهید تا بتوان اقدامات بعدی را برای بازیابی و ارسال مجدد یک وظیفه‌ی موفق انجام داد.

کاتلین

client.publishRecommendationClusters(
        PublishRecommendationClustersRequest.Builder()
          .addRecommendationCluster(..)
          .build())
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          // do something
        } else {
          val exception = task.exception
          if (exception is AppEngageException) {
            @AppEngageErrorCode val errorCode = exception.errorCode
            if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
              // do something
            }
          }
        }
      }

جاوا

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 اجرای وظیفه به دلیل مشکلات نخ‌بندی (threading) با شکست مواجه شد. در این صورت، می‌توان آن را دوباره امتحان کرد.
4 SERVICE_CALL_PERMISSION_DENIED تماس گیرنده مجاز به برقراری تماس خدماتی نیست.
5 SERVICE_CALL_INVALID_ARGUMENT درخواست شامل داده‌های نامعتبر است (برای مثال، بیش از تعداد مجاز خوشه‌ها).
6 SERVICE_CALL_INTERNAL در سمت سرویس خطایی رخ داده است.
7 SERVICE_CALL_RESOURCE_EXHAUSTED تماس با سرویس خیلی زیاد انجام می‌شود.

مرحله ۳: مدیریت اهداف پخش

علاوه بر فراخوانی‌های API مربوط به انتشار محتوا از طریق یک job، لازم است یک BroadcastReceiver نیز برای دریافت درخواست انتشار محتوا راه‌اندازی شود.

هدف از اعلان‌های هدف عمدتاً فعال‌سازی مجدد برنامه و همگام‌سازی اجباری داده‌ها است. اعلان‌های هدف برای ارسال مکرر طراحی نشده‌اند. این اعلان‌ها فقط زمانی فعال می‌شوند که سرویس Engage تشخیص دهد محتوا ممکن است قدیمی باشد (مثلاً یک هفته قدیمی). به این ترتیب، حتی اگر برنامه برای مدت طولانی اجرا نشده باشد، اطمینان بیشتری وجود دارد که کاربر می‌تواند تجربه محتوای جدیدی داشته باشد.

BroadcastReceiver باید به دو روش زیر تنظیم شود:

  • با استفاده از Context.registerReceiver() یک نمونه از کلاس BroadcastReceiver را به صورت پویا ثبت کنید. این کار امکان ارتباط از برنامه‌هایی را که هنوز در حافظه فعال هستند، فراهم می‌کند.

کاتلین

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
  // is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
  // Trigger continuation cluster publish when PUBLISH_CONTINUATION 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)

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register Continuation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
}

جاوا

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger continuation cluster publish when PUBLISH_CONTINUATION 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);

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

}
  • یک پیاده‌سازی را به صورت ایستا با تگ <receiver> در فایل AndroidManifest.xml خود تعریف کنید. این به برنامه اجازه می‌دهد تا در زمانی که در حال اجرا نیست، اهداف پخش (broadcast intents) را دریافت کند و همچنین به برنامه اجازه می‌دهد تا محتوا را منتشر کند.

<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>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_CONTINUATION" />
      </intent-filter>
   </receiver>
</application>

اینتنت‌های زیر توسط سرویس ارسال می‌شوند:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION توصیه می‌شود هنگام دریافت این intent، یک فراخوانی publishRecommendationClusters آغاز شود.
  • com.google.android.engage.action.PUBLISH_FEATURED توصیه می‌شود هنگام دریافت این intent، یک فراخوانی publishFeaturedCluster آغاز شود.
  • com.google.android.engage.action.PUBLISH_CONTINUATION توصیه می‌شود هنگام دریافت این intent، یک فراخوانی publishContinuationCluster آغاز شود.

گردش کار یکپارچه‌سازی

برای راهنمای گام به گام تأیید ادغام پس از تکمیل، به گردش کار ادغام توسعه‌دهنده مراجعه کنید.

سوالات متداول

برای سوالات متداول به بخش سوالات متداول Engage SDK مراجعه کنید.

تماس

در صورت وجود هرگونه سوال در طول فرآیند ادغام، engage-developers@google.com تماس بگیرید.

مراحل بعدی

پس از تکمیل این ادغام، مراحل بعدی به شرح زیر است:

  • یک ایمیل به engage-developers@google.com ارسال کنید و APK یکپارچه خود را که آماده آزمایش توسط گوگل است، پیوست کنید.
  • گوگل یک بررسی داخلی انجام می‌دهد تا مطمئن شود که ادغام طبق انتظار کار می‌کند. در صورت نیاز به تغییرات، گوگل با شما تماس می‌گیرد و جزئیات لازم را ارائه می‌دهد.
  • وقتی آزمایش کامل شد و نیازی به تغییر نبود، گوگل با شما تماس می‌گیرد تا به شما اطلاع دهد که می‌توانید APK به‌روزرسانی‌شده و یکپارچه‌شده را در فروشگاه Play منتشر کنید.
  • پس از اینکه گوگل تأیید کرد که APK به‌روزرسانی‌شده شما در فروشگاه Play منتشر شده است، خوشه‌های توصیه ، ویژه و ادامه شما ممکن است منتشر شده و برای کاربران قابل مشاهده باشند.