ساعة حزمة تطوير البرامج (SDK) الخاصة بالتفاعل: تعليمات الدمج الفني التابعة لجهات خارجية

تعزيز التفاعل مع التطبيق من خلال الوصول إلى المستخدمين في الأماكن التي يتواجدون فيها يمكنك دمج حزمة Engage SDK لعرض محتوى "مواصلة المشاهدة" واقتراحات مخصّصة للمستخدمين مباشرةً على مساحات عرض متعددة على الجهاز، مثل المجموعات ومساحة الترفيه و"متجر Play". تضيف عملية الدمج أقل من 50 كيلوبايت (مضغوطة) إلى متوسط حجم حزمة APK، وتستغرق معظم التطبيقات أسبوعًا تقريبًا من وقت المطوّر. يمكنك الاطّلاع على مزيد من المعلومات على موقعنا الإلكتروني المخصّص للأنشطة التجارية.

يحتوي هذا الدليل على تعليمات للشركاء من المطوّرين لدمج محتوى الفيديو الخاص بهم باستخدام حزمة Engage SDK من أجل عرض المحتوى في مساحة العرض الجديدة هذه ومساحات العرض الحالية على Google.

تفاصيل عملية الدمج

المصطلحات

يشمل هذا الدمج ثلاثة أنواع من المجموعات: اقتراحات ومتابعة ومحتوى مقترَح.

  • تعرض مجموعات الاقتراحات اقتراحات مخصّصة بشأن المحتوى الذي يمكن مشاهدته من أحد شركاء المطوّرين.

    تتّخذ اقتراحاتك البنية التالية:

    • مجموعة الاقتراحات: هي طريقة عرض في واجهة المستخدم تتضمّن مجموعة من الاقتراحات من شريك المطوّر نفسه.

      الشكل 1. واجهة مستخدم "مساحة الترفيه" تعرض مجموعة اقتراحات من شريك واحد.
    • العنصر: هو كائن يمثّل عنصرًا واحدًا في مجموعة. يمكن أن يكون الكيان فيلمًا أو برنامجًا تلفزيونيًا أو مسلسلًا تلفزيونيًا أو فيديو مباشرًا أو غير ذلك. راجِع القسم توفير بيانات الكيانات للاطّلاع على قائمة بأنواع الكيانات المتوافقة.

      الشكل 2. واجهة مستخدم "مساحة الترفيه" تعرض كيانًا واحدًا ضمن مجموعة اقتراحات خاصة بشريك واحد
  • تعرض حزمة المحتوى المتسلسل الفيديوهات غير المكتملة والحلقات الجديدة ذات الصلة من عدة شركاء مطوّرين في مجموعة واحدة ضمن واجهة المستخدم. سيُسمح لكل شريك مطوِّر ببث 10 عناصر كحد أقصى في مجموعة Continuation. أظهرت الأبحاث أنّ الاقتراحات المخصّصة، بالإضافة إلى محتوى "المتابعة" المخصّص، يؤديان إلى تحقيق أفضل تفاعل مع المستخدمين.

    الشكل 3. واجهة مستخدم Entertainment Space تعرض مجموعة مستمرة تتضمّن اقتراحات غير مكتملة من عدّة شركاء (يظهر اقتراح واحد فقط حاليًا).
  • تعرض المجموعة المميّزة مجموعة من العناصر من عدة شركاء مطوّرين في مجموعة واحدة ضمن واجهة المستخدم. سيكون هناك مجموعة واحدة من "الميزات"، وستظهر بالقرب من أعلى واجهة المستخدم في موضع ذي أولوية أعلى من جميع مجموعات "الاقتراحات". سيُسمح لكل شريك مطوّر ببث ما يصل إلى 10 كيانات في المجموعة المميزة.

    الشكل 4. واجهة مستخدم "مساحة الترفيه" تعرض مجموعة "محتوى مقترَح" تتضمّن اقتراحات من شركاء متعدّدين (يظهر اقتراح واحد فقط حاليًا).

العمل التحضيري

الحد الأدنى لمستوى واجهة برمجة التطبيقات: 19

أضِف مكتبة 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.2'
}

لمزيد من المعلومات، يُرجى الاطّلاع على مستوى ظهور حِزم التطبيقات في الإصدار 11 من نظام التشغيل Android.

ملخّص

ويستند التصميم إلى تنفيذ خدمة مرتبطة.

تخضع البيانات التي يمكن للعميل نشرها للحدود التالية لأنواع المجموعات المختلفة:

نوع المجموعة حدود المجموعات الحدّ الأقصى لعدد العناصر في مجموعة
مجموعات الاقتراحات 7 على الأكثر 50 بحد أقصى
مجموعة المتابعة 1 على الأكثر 20 على الأكثر
المجموعة المميزة 1 على الأكثر 20 على الأكثر

الخطوة 0: نقل البيانات من عملية دمج حزمة تطوير البرامج الحالية في "الوسائط"

ربط نماذج البيانات من عملية الدمج الحالية

في حال نقل البيانات من عملية دمج حالية في Media Home، يوضّح الجدول التالي كيفية ربط نماذج البيانات في حِزم SDK الحالية بحزمة Engage SDK الجديدة:

المكافئ لعملية دمج MediaHomeVideoContract مكافئ عملية دمج حزمة Engage 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، تم نشر المجموعات والكيانات من خلال واجهات برمجة تطبيقات منفصلة:

// 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، يتم دمج نشر المجموعات والكيانات في طلب واحد من واجهة برمجة التطبيقات. يتم نشر جميع العناصر التي تنتمي إلى مجموعة مع هذه المجموعة:

Kotlin

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

Java

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

الخطوة 1: تقديم بيانات الجهة

حدّدت حزمة تطوير البرامج (SDK) عناصر مختلفة لتمثيل كل نوع من أنواع العناصر. نوفّر الدعم للكيانات التالية ضمن فئة "المشاهدة":

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

يوضّح الرسم البياني التالي السمات والمتطلبات لكل نوع.

MovieEntity

السمة المتطلب الملاحظات
الاسم مطلوبة
صور الملصقات مطلوبة يجب توفير صورة واحدة على الأقل مع نسبة عرض إلى ارتفاع. (يُفضّل استخدام الوضع الأفقي، ولكن يُنصح بتضمين صور بالوضعين العمودي والأفقي لتناسب سيناريوهات مختلفة).

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوبة

الرابط لصفحة معيّنة في تطبيق مقدّم الخدمة لبدء تشغيل الفيلم

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

معرّف الموارد المنتظم (URI) لصفحة المعلومات اختياري

الرابط لصفحة معيّنة في تطبيق مقدّم الخدمة لعرض تفاصيل حول الفيلم

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

تاريخ الإصدار اختياري بالملّي ثانية منذ بداية الفترة
مدى التوفّر مطلوبة

AVAILABLE: يشير إلى أنّ المحتوى متاح للمستخدم بدون الحاجة إلى اتّخاذ أي إجراء إضافي.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يجب أن يشتري المستخدم المحتوى أو يستأجره.

PURCHASED: يشير إلى أنّ المستخدم قد اشترى المحتوى أو استأجره.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
المدة مطلوبة بالمللي ثانية
النوع مطلوبة حقل التعبئة النصّية الحرّة
تقييمات المحتوى اختياري نص حر، اتّبِع المعيار المتّبع في المجال. (مثال)
نوع اقتراحات "اقتراحات أخرى" مطلوب بشكل مشروط

يجب توفيرها عندما يكون العنصر في مجموعة "المحتوى المتسلسل"، ويجب أن يكون أحد الأنواع الأربعة التالية:

CONTINUE: شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

NEW: شاهد المستخدم جميع الحلقات المتوفّرة من بعض المحتوى الذي يتضمّن حلقات، ولكن أصبحت حلقة جديدة متاحة، وهناك حلقة واحدة لم يشاهدها المستخدم. وينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة ضمن سلسلة وما إلى ذلك.

NEXT: شاهد المستخدم حلقة واحدة أو أكثر من بعض المحتوى الحلقي، ولكن لا يزال هناك أكثر من حلقة واحدة متبقية أو حلقة واحدة متبقية بالضبط، حيث إنّ الحلقة الأخيرة ليست "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة المحتوى الحلقي.

قائمة المشاهدة: اختار المستخدم بشكل صريح إضافة فيلم أو حدث أو مسلسل إلى قائمة مشاهدة لتنظيم المحتوى الذي يريد مشاهدته لاحقًا.

وقت آخر تفاعل مطلوب بشكل مشروط يجب تقديمها عندما يكون المنتج ضمن مجموعة "المنتجات المشابهة". بالملّي ثانية.
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيرها عندما يكون العنصر في مجموعة "المتابعة" ويكون WatchNextType هو CONTINUE. بالملّي ثانية منذ بداية الفترة

TvShowEntity

السمة المتطلب الملاحظات
الاسم مطلوبة
صور الملصقات مطلوبة يجب توفير صورة واحدة على الأقل مع نسبة عرض إلى ارتفاع. (يُفضّل استخدام الوضع الأفقي، ولكن يُنصح بتضمين صور بالوضعين العمودي والأفقي لتناسب سيناريوهات مختلفة).

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) لصفحة المعلومات مطلوبة

تمثّل هذه السمة الرابط لصفحة معيّنة في تطبيق مقدّم الخدمة لعرض تفاصيل البرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

معرّف الموارد المنتظم (URI) للتشغيل اختياري

الرابط لصفحة معيّنة في تطبيق مقدّم الخدمة لبدء تشغيل البرنامج التلفزيوني

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

تاريخ بث الحلقة الأولى اختياري بالملّي ثانية منذ بداية الفترة
تاريخ بث الحلقة الأخيرة اختياري بالملّي ثانية منذ بداية الفترة
مدى التوفّر مطلوبة

AVAILABLE: يشير إلى أنّ المحتوى متاح للمستخدم بدون الحاجة إلى اتّخاذ أي إجراء إضافي.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يجب أن يشتري المستخدم المحتوى أو يستأجره.

PURCHASED: يشير إلى أنّ المستخدم قد اشترى المحتوى أو استأجره.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
عدد المواسم مطلوبة عدد صحيح موجب
النوع مطلوبة حقل التعبئة النصّية الحرّة
تقييمات المحتوى اختياري نص حر، اتّبِع المعيار المتّبع في المجال. (مثال)
نوع اقتراحات "اقتراحات أخرى" مطلوب بشكل مشروط

يجب توفيرها عندما يكون العنصر في مجموعة "المحتوى المتسلسل"، ويجب أن يكون أحد الأنواع الأربعة التالية:

CONTINUE: شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

NEW: شاهد المستخدم جميع الحلقات المتوفّرة من بعض المحتوى الذي يتضمّن حلقات، ولكن أصبحت حلقة جديدة متاحة، وهناك حلقة واحدة لم يشاهدها المستخدم. وينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة ضمن سلسلة وما إلى ذلك.

NEXT: شاهد المستخدم حلقة واحدة أو أكثر من بعض المحتوى الحلقي، ولكن لا يزال هناك أكثر من حلقة واحدة متبقية أو حلقة واحدة متبقية بالضبط، حيث إنّ الحلقة الأخيرة ليست "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة المحتوى الحلقي.

قائمة المشاهدة: اختار المستخدم بشكل صريح إضافة فيلم أو حدث أو مسلسل إلى قائمة مشاهدة لتنظيم المحتوى الذي يريد مشاهدته لاحقًا.

وقت آخر تفاعل مطلوب بشكل مشروط يجب تقديمها عندما يكون المنتج ضمن مجموعة "المنتجات المشابهة". بالملّي ثانية.
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيرها عندما يكون العنصر في مجموعة "المتابعة" ويكون WatchNextType هو CONTINUE. بالملّي ثانية منذ بداية الفترة

TvSeasonEntity

السمة المتطلب الملاحظات
الاسم مطلوبة
صور الملصقات مطلوبة يجب توفير صورة واحدة على الأقل مع نسبة عرض إلى ارتفاع. (يُفضّل استخدام الوضع الأفقي، ولكن يُنصح بتضمين صور بالوضعين العمودي والأفقي لتناسب سيناريوهات مختلفة).

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) لصفحة المعلومات مطلوبة

تمثّل هذه السمة الرابط لصفحة معيّنة في تطبيق مقدّم الخدمة لعرض تفاصيل الموسم الخاص بالبرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

معرّف الموارد المنتظم (URI) للتشغيل اختياري

تمثّل هذه السمة الرابط لصفحة معيّنة في تطبيق مقدّم الخدمة لبدء تشغيل موسم البرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

عرض رقم الموسم

اختياري

متاحة في الإصدار 1.3.1

سلسلة
تاريخ بث الحلقة الأولى اختياري بالملّي ثانية منذ بداية الفترة
تاريخ بث الحلقة الأخيرة اختياري بالملّي ثانية منذ بداية الفترة
مدى التوفّر مطلوبة

AVAILABLE: يشير إلى أنّ المحتوى متاح للمستخدم بدون الحاجة إلى اتّخاذ أي إجراء إضافي.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يجب أن يشتري المستخدم المحتوى أو يستأجره.

PURCHASED: يشير إلى أنّ المستخدم قد اشترى المحتوى أو استأجره.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
عدد الحلقات مطلوبة عدد صحيح موجب
النوع مطلوبة حقل التعبئة النصّية الحرّة
تقييمات المحتوى اختياري نص حر، اتّبِع المعيار المتّبع في المجال. (مثال)
نوع "اقتراحات أخرى" مطلوب بشكل مشروط

يجب توفيرها عندما يكون العنصر في مجموعة "المحتوى المتسلسل"، ويجب أن يكون أحد الأنواع الأربعة التالية:

CONTINUE: شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

NEW: شاهد المستخدم جميع الحلقات المتوفّرة من بعض المحتوى الذي يتضمّن حلقات، ولكن أصبحت حلقة جديدة متاحة، وهناك حلقة واحدة لم يشاهدها المستخدم. وينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة ضمن سلسلة وما إلى ذلك.

NEXT: شاهد المستخدم حلقة واحدة أو أكثر من بعض المحتوى الحلقي، ولكن لا يزال هناك أكثر من حلقة واحدة متبقية أو حلقة واحدة متبقية بالضبط، حيث إنّ الحلقة الأخيرة ليست "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة المحتوى الحلقي.

قائمة المشاهدة: اختار المستخدم بشكل صريح إضافة فيلم أو حدث أو مسلسل إلى قائمة مشاهدة لتنظيم المحتوى الذي يريد مشاهدته لاحقًا.

وقت آخر تفاعل مطلوب بشكل مشروط يجب تقديمها عندما يكون المنتج ضمن مجموعة "المنتجات المشابهة". بالملّي ثانية.
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيرها عندما يكون العنصر في مجموعة "المتابعة" ويكون WatchNextType هو CONTINUE. بالملّي ثانية منذ بداية الفترة

TvEpisodeEntity

السمة المتطلب الملاحظات
الاسم مطلوبة
صور الملصقات مطلوبة يجب توفير صورة واحدة على الأقل مع نسبة عرض إلى ارتفاع. (يُفضّل استخدام الوضع الأفقي، ولكن يُنصح بتضمين صور بالوضعين العمودي والأفقي لتناسب سيناريوهات مختلفة).

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوبة

الرابط لصفحة معيّنة في تطبيق مقدّم الخدمة لبدء تشغيل الحلقة

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

معرّف الموارد المنتظم (URI) لصفحة المعلومات اختياري

تمثّل هذه السمة الرابط المؤدي إلى صفحة معيّنة في تطبيق مقدّم الخدمة لعرض تفاصيل حول حلقة البرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

عرض رقم الحلقة

اختياري

متاحة في الإصدار 1.3.1

سلسلة
تاريخ البث المباشر مطلوبة بالملّي ثانية منذ بداية الفترة
مدى التوفّر مطلوبة

AVAILABLE: يشير إلى أنّ المحتوى متاح للمستخدم بدون الحاجة إلى اتّخاذ أي إجراء إضافي.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يجب أن يشتري المستخدم المحتوى أو يستأجره.

PURCHASED: يشير إلى أنّ المستخدم قد اشترى المحتوى أو استأجره.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
المدة مطلوبة يجب أن تكون قيمة موجبة بالملي ثانية.
النوع مطلوبة حقل التعبئة النصّية الحرّة
تقييمات المحتوى اختياري نص حر، اتّبِع المعيار المتّبع في المجال. (مثال)
نوع "اقتراحات أخرى" مطلوب بشكل مشروط

يجب توفيرها عندما يكون العنصر في مجموعة "المحتوى المتسلسل"، ويجب أن يكون أحد الأنواع الأربعة التالية:

CONTINUE: شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

NEW: شاهد المستخدم جميع الحلقات المتوفّرة من بعض المحتوى الذي يتضمّن حلقات، ولكن أصبحت حلقة جديدة متاحة، وهناك حلقة واحدة لم يشاهدها المستخدم. وينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة ضمن سلسلة وما إلى ذلك.

NEXT: شاهد المستخدم حلقة واحدة أو أكثر من بعض المحتوى الحلقي، ولكن لا يزال هناك أكثر من حلقة واحدة متبقية أو حلقة واحدة متبقية بالضبط، حيث إنّ الحلقة الأخيرة ليست "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة المحتوى الحلقي.

قائمة المشاهدة: اختار المستخدم بشكل صريح إضافة فيلم أو حدث أو مسلسل إلى قائمة مشاهدة لتنظيم المحتوى الذي يريد مشاهدته لاحقًا.

وقت آخر تفاعل مطلوب بشكل مشروط يجب تقديمها عندما يكون المنتج ضمن مجموعة "المنتجات المشابهة". بالملّي ثانية.
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيرها عندما يكون العنصر في مجموعة "المتابعة" ويكون WatchNextType هو CONTINUE. بالملّي ثانية منذ بداية الفترة

LiveStreamingVideoEntity

السمة المتطلب الملاحظات
الاسم مطلوبة
صور الملصقات مطلوبة يجب توفير صورة واحدة على الأقل مع نسبة عرض إلى ارتفاع. (يُفضّل استخدام الوضع الأفقي، ولكن يُنصح بتضمين صور بالوضعين العمودي والأفقي لتناسب سيناريوهات مختلفة).

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوبة

الرابط لصفحة في تطبيق مقدّم الخدمة لبدء تشغيل الفيديو

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

محطة البث مطلوبة حقل التعبئة النصّية الحرّة
وقت البدء اختياري بالملّي ثانية منذ بداية الفترة
وقت الانتهاء اختياري بالملّي ثانية منذ بداية الفترة
عدد مرّات المشاهدة اختياري نص حر يجب ترجمته
نوع "اقتراحات أخرى" مطلوب بشكل مشروط

يجب توفيرها عندما يكون العنصر في مجموعة "المحتوى المتسلسل"، ويجب أن يكون أحد الأنواع الأربعة التالية:

CONTINUE: شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

NEW: شاهد المستخدم جميع الحلقات المتوفّرة من بعض المحتوى الذي يتضمّن حلقات، ولكن أصبحت حلقة جديدة متاحة، وهناك حلقة واحدة لم يشاهدها المستخدم. وينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة ضمن سلسلة وما إلى ذلك.

NEXT: شاهد المستخدم حلقة واحدة أو أكثر من بعض المحتوى الحلقي، ولكن لا يزال هناك أكثر من حلقة واحدة متبقية أو حلقة واحدة متبقية بالضبط، حيث إنّ الحلقة الأخيرة ليست "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة المحتوى الحلقي.

قائمة المشاهدة: اختار المستخدم بشكل صريح إضافة فيلم أو حدث أو مسلسل إلى قائمة مشاهدة لتنظيم المحتوى الذي يريد مشاهدته لاحقًا.

وقت آخر تفاعل مطلوب بشكل مشروط يجب تقديمها عندما يكون المنتج ضمن مجموعة "المنتجات المشابهة". بالملّي ثانية.
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيرها عندما يكون العنصر في مجموعة "المتابعة" ويكون WatchNextType هو CONTINUE. بالملّي ثانية منذ بداية الفترة

VideoClipEntity

يمثّل العنصر VideoClipEntity كيان فيديو واردًا من وسائل التواصل الاجتماعي، مثل TikTok أو YouTube.

السمة المتطلب الملاحظات
الاسم مطلوبة
صور الملصقات مطلوبة يجب توفير صورة واحدة على الأقل مع نسبة عرض إلى ارتفاع. (يُفضّل استخدام الوضع الأفقي، ولكن يُنصح بتضمين صور بالوضعين العمودي والأفقي لتناسب سيناريوهات مختلفة).

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوبة

الرابط لصفحة في تطبيق مقدّم الخدمة لبدء تشغيل الفيديو

ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق من أجل تحديد المصدر. يُرجى الرجوع إلى الأسئلة الشائعة

تاريخ الإنشاء مطلوبة بالملّي ثانية منذ بداية الفترة
المدة مطلوبة يجب أن تكون قيمة موجبة بالملي ثانية.
صانع المحتوى مطلوبة حقل التعبئة النصّية الحرّة
صورة صانع المحتوى اختياري صورة لأفاتار صانع المحتوى
عدد مرّات المشاهدة اختياري نص حر يجب ترجمته
نوع "اقتراحات أخرى" مطلوب بشكل مشروط

يجب توفيرها عندما يكون العنصر في مجموعة "المحتوى المتسلسل"، ويجب أن يكون أحد الأنواع الأربعة التالية:

CONTINUE: شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

NEW: شاهد المستخدم جميع الحلقات المتوفّرة من بعض المحتوى الذي يتضمّن حلقات، ولكن أصبحت حلقة جديدة متاحة، وهناك حلقة واحدة لم يشاهدها المستخدم. وينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة ضمن سلسلة وما إلى ذلك.

NEXT: شاهد المستخدم حلقة واحدة أو أكثر من بعض المحتوى الحلقي، ولكن لا يزال هناك أكثر من حلقة واحدة متبقية أو حلقة واحدة متبقية بالضبط، حيث إنّ الحلقة الأخيرة ليست "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة المحتوى الحلقي.

قائمة المشاهدة: اختار المستخدم بشكل صريح إضافة فيلم أو حدث أو مسلسل إلى قائمة مشاهدة لتنظيم المحتوى الذي يريد مشاهدته لاحقًا.

وقت آخر تفاعل مطلوب بشكل مشروط يجب تقديمها عندما يكون المنتج ضمن مجموعة "المنتجات المشابهة". بالملّي ثانية.
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيرها عندما يكون العنصر في مجموعة "المتابعة" ويكون WatchNextType هو CONTINUE. بالملّي ثانية منذ بداية الفترة

مواصفات الصور

يسرد القسم التالي المواصفات المطلوبة لمواد عرض الصور:

تنسيقات الملفات

‫PNG أو JPG أو GIF ثابت أو WebP

الحد الأقصى لحجم الملف

5120 كيلوبايت

اقتراحات إضافية

  • مساحة القسم المهم في الصور: ضَع المحتوى المهم في الوسط ليشغل ‎80% من الصورة.

مثال

Kotlin

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)
    .build()

Java

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

الخطوة 2: تقديم بيانات المجموعة

ننصح بتنفيذ مهمة نشر المحتوى في الخلفية (على سبيل المثال، باستخدام WorkManager) وجدولتها بانتظام أو استنادًا إلى حدث معيّن (على سبيل المثال، في كل مرة يفتح فيها المستخدم التطبيق أو عندما يضيف المستخدم عنصرًا إلى سلة التسوق).

AppEngagePublishClient هي المسؤولة عن نشر المجموعات. تتوفّر واجهات برمجة التطبيقات التالية في العميل:

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

isServiceAvailable

تُستخدَم واجهة برمجة التطبيقات هذه للتأكّد من أنّ الخدمة متاحة للدمج وما إذا كان يمكن عرض المحتوى على الجهاز.

Kotlin

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

Java

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

تُستخدَم واجهة برمجة التطبيقات هذه لنشر قائمة بعناصر RecommendationCluster.

Kotlin

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

Java

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

عندما تتلقّى الخدمة الطلب، يتم تنفيذ الإجراءات التالية ضمن معاملة واحدة:

  • تتم إزالة بيانات RecommendationCluster الحالية من حساب المطوّر الشريك.
  • يتم تحليل البيانات الواردة من الطلب وتخزينها في مجموعة الاقتراحات المعدَّلة.

في حال حدوث خطأ، يتم رفض الطلب بأكمله ويتم الحفاظ على الحالة الحالية.

publishFeaturedCluster

تُستخدَم واجهة برمجة التطبيقات هذه لنشر قائمة بعناصر FeaturedCluster.

Kotlin

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

Java

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

عندما تتلقّى الخدمة الطلب، يتم تنفيذ الإجراءات التالية ضمن معاملة واحدة:

  • تتم إزالة بيانات FeaturedCluster الحالية من حساب المطوّر الشريك.
  • يتم تحليل البيانات من الطلب وتخزينها في "المجموعة المميّزة" المعدَّلة.

في حال حدوث خطأ، يتم رفض الطلب بأكمله ويتم الحفاظ على الحالة الحالية.

publishContinuationCluster

يتم استخدام واجهة برمجة التطبيقات هذه لنشر عنصر ContinuationCluster.

Kotlin

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

Java

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

عندما تتلقّى الخدمة الطلب، يتم تنفيذ الإجراءات التالية ضمن معاملة واحدة:

  • تتم إزالة بيانات ContinuationCluster الحالية من حساب المطوّر الشريك.
  • يتم تحليل البيانات الواردة من الطلب وتخزينها في Continuation Cluster المعدَّل.

في حال حدوث خطأ، يتم رفض الطلب بأكمله ويتم الحفاظ على الحالة الحالية.

publishUserAccountManagementRequest

يتم استخدام واجهة برمجة التطبيقات هذه لنشر بطاقة "تسجيل الدخول". يوجه إجراء تسجيل الدخول المستخدمين إلى صفحة تسجيل الدخول في التطبيق حتى يتمكّن التطبيق من نشر المحتوى (أو تقديم محتوى أكثر تخصيصًا).

تشكّل البيانات الوصفية التالية جزءًا من "بطاقة تسجيل الدخول":

السمة المتطلب الوصف
Action Uri مطلوب رابط لصفحة معيّنة في التطبيق (أي ينتقل إلى صفحة تسجيل الدخول إلى التطبيق)
صورة اختياري - إذا لم يتم توفير هذا الحقل، يجب توفير حقل "العنوان"

الصورة المعروضة على البطاقة

صور بنسبة عرض إلى ارتفاع 16:9 وبدرجة دقة 1264x712

العنوان اختياري - إذا لم يتم توفيرها، يجب توفير الصورة الاسم المكتوب على البطاقة
نص الإجراء اختياري النص المعروض على عبارة الحثّ على اتّخاذ إجراء (مثل تسجيل الدخول)
العنوان الفرعي اختياري عنوان فرعي اختياري على البطاقة

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

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

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

عندما تتلقّى الخدمة الطلب، يتم تنفيذ الإجراءات التالية ضمن معاملة واحدة:

  • تتم إزالة بيانات UserAccountManagementCluster الحالية من الشريك المطوّر.
  • يتم تحليل البيانات من الطلب وتخزينها في مجموعة UserAccountManagementCluster المعدَّلة.

في حال حدوث خطأ، يتم رفض الطلب بأكمله ويتم الحفاظ على الحالة الحالية.

updatePublishStatus

إذا لم يتم نشر أي من المجموعات لأي سبب تجاري داخلي، ننصحك بشدة بتعديل حالة النشر باستخدام واجهة برمجة التطبيقات 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

إذا لم يتم نشر المحتوى لأنّ المستخدم لم يسجّل الدخول، تنصح Google بنشر "بطاقة تسجيل الدخول". إذا تعذّر على مقدّمي الخدمات نشر بطاقة تسجيل الدخول لأي سبب، ننصحك باستدعاء واجهة برمجة التطبيقات 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());

deleteRecommendationClusters

يتم استخدام واجهة برمجة التطبيقات هذه لحذف محتوى "مجموعات الاقتراحات".

Kotlin

client.deleteRecommendationClusters()

Java

client.deleteRecommendationClusters();

عندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من مجموعات الاقتراحات. في حال حدوث خطأ، يتم رفض الطلب بالكامل والاحتفاظ بالحالة الحالية.

deleteFeaturedCluster

يتم استخدام واجهة برمجة التطبيقات هذه لحذف محتوى "المجموعة المميّزة".

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

عندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من &quot;المجموعة المميزة&quot;. في حال حدوث خطأ، يتم رفض الطلب بالكامل والاحتفاظ بالحالة الحالية.

deleteContinuationCluster

تُستخدَم واجهة برمجة التطبيقات هذه لحذف محتوى مجموعة استمرار.

Kotlin

client.deleteContinuationCluster()

Java

client.deleteContinuationCluster();

عندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من مجموعة بيانات المتابعة. في حال حدوث خطأ، يتم رفض الطلب بالكامل والاحتفاظ بالحالة الحالية.

deleteUserManagementCluster

تُستخدَم واجهة برمجة التطبيقات هذه لحذف محتوى مجموعة UserAccountManagement.

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

عندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من مجموعة UserAccountManagement. في حال حدوث خطأ، سيتم رفض الطلب بأكمله وسيتم الحفاظ على الحالة الحالية.

deleteClusters

تُستخدَم واجهة برمجة التطبيقات هذه لحذف محتوى نوع مجموعة معيّن.

Kotlin

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

Java

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

عندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من جميع المجموعات المتطابقة مع أنواع المجموعات المحدّدة. يمكن للعملاء اختيار تمرير نوع واحد أو عدة أنواع من المجموعات. في حال حدوث خطأ، يتم رفض الطلب بأكمله ويتم الحفاظ على الحالة الحالية.

معالجة الأخطاء

ننصح بشدة بالاستماع إلى نتيجة المهمة من واجهات برمجة التطبيقات الخاصة بالنشر، وذلك لاتّخاذ إجراء متابعة لاسترداد مهمة ناجحة وإعادة إرسالها.

Kotlin

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

Java

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 تعذّر تنفيذ المهمة بسبب مشاكل في سلاسل التعليمات. في هذه الحالة، يمكن إعادة المحاولة.
4 SERVICE_CALL_PERMISSION_DENIED لا يُسمح للمتصل بإجراء مكالمة الخدمة.
5 SERVICE_CALL_INVALID_ARGUMENT يحتوي الطلب على بيانات غير صالحة (على سبيل المثال، أكثر من عدد المجموعات المسموح به).
6 SERVICE_CALL_INTERNAL حدث خطأ من جهة الخدمة.
7 SERVICE_CALL_RESOURCE_EXHAUSTED يتم إجراء طلب الخدمة بشكل متكرّر جدًا.

الخطوة 3: معالجة الأهداف المتعلقة بالبث

بالإضافة إلى إجراء طلبات البيانات من واجهة برمجة التطبيقات لنشر المحتوى من خلال مهمة، يجب أيضًا إعداد BroadcastReceiver لتلقّي طلب نشر المحتوى.

الهدف من أغراض البث هو بشكل أساسي إعادة تنشيط التطبيق وفرض مزامنة البيانات. لم يتم تصميم مكوّنات البث ليتم إرسالها بشكل متكرر جدًا. لا يتم تشغيلها إلا عندما تحدّد &quot;خدمة التفاعل&quot; أنّ المحتوى قد يكون قديمًا (على سبيل المثال، مضى أسبوع على نشره). بهذه الطريقة، يمكن للمستخدم أن يثق أكثر في الحصول على تجربة محتوى جديدة، حتى إذا لم يتم تنفيذ التطبيق لفترة طويلة من الوقت.

يجب إعداد BroadcastReceiver بإحدى الطريقتَين التاليتَين:

  • تسجيل مثيل لفئة BroadcastReceiver بشكل ديناميكي باستخدام Context.registerReceiver() يتيح ذلك التواصل من التطبيقات التي لا تزال نشطة في الذاكرة.

Kotlin

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

Java

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. يتيح ذلك للتطبيق تلقّي نوايا البث عندما لا يكون قيد التشغيل، كما يتيح له نشر المحتوى.

<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 يُنصح ببدء مكالمة publishRecommendationClusters عند تلقّي هذه النية.
  • com.google.android.engage.action.PUBLISH_FEATURED يُنصح ببدء مكالمة publishFeaturedCluster عند تلقّي هذا الغرض.
  • com.google.android.engage.action.PUBLISH_CONTINUATION يُنصح ببدء مكالمة publishContinuationCluster عند تلقّي هذا الغرض.

سير عمل الدمج

للحصول على دليل تفصيلي حول كيفية إثبات صحة عملية الدمج بعد اكتمالها، يُرجى الاطّلاع على سير عمل دمج المطوّرين في Engage.

الأسئلة الشائعة

يمكنك الاطّلاع على الأسئلة الشائعة حول حزمة تطوير البرامج Engage SDK.

معلومات الاتصال

يُرجى التواصل مع engage-developers@google.com إذا كانت لديك أي أسئلة أثناء عملية الدمج.

الخطوات التالية

بعد إكمال عملية الربط هذه، إليك الخطوات التالية:

  • أرسِل رسالة إلكترونية إلى engage-developers@google.com وأرفِق بها حزمة APK المدمَجة الجاهزة للاختبار من قِبل Google.
  • تُجري Google عملية تحقّق ومراجعات داخلية للتأكّد من أنّ عملية الدمج تعمل على النحو المتوقّع. إذا كانت هناك حاجة إلى إجراء تغييرات، ستتواصل معك Google لإعلامك بأي تفاصيل ضرورية.
  • عند اكتمال الاختبار وعدم الحاجة إلى إجراء أي تغييرات، ستتواصل معك Google لإعلامك بأنّه يمكنك بدء نشر حزمة APK المعدَّلة والمدمجة على &quot;متجر Play&quot;.
  • بعد أن يؤكّد Google أنّه تم نشر حزمة APK المعدَّلة على &quot;متجر Play&quot;، قد يتم نشر المجموعات مقترَحة ومميّزة ومتابعة وإتاحتها للمستخدمين.