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

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

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

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

المصطلحات

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

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

    تتّبع الاقتراحات البنية التالية:

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

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

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

    الشكل 3. واجهة مستخدم "مساحة الترفيه" تعرض مجموعة محتوى متسلسلاً مع اقتراحات غير مكتملة من شركاء عدّة (يظهر اقتراح واحد فقط حاليًا).
  • تعرض مجموعة التطبيقات المميّزة مجموعة من التطبيقات من عدة شركاء مطوّرين في مجموعة واحدة من واجهة المستخدم. ستكون هناك مجموعة واحدة مميّزة ، يتم عرضها بالقرب من أعلى واجهة المستخدم مع موضع أولوية فوق جميع مجموعات الاقتراحات. سيتم السماح لكل شريك مطوّر ببث ما يصل إلى 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 .

ملخّص

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

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

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

الخطوة 0: نقل البيانات من عملية دمج حزمة تطوير البرامج (SDK) الحالية في تطبيق Media Home

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

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

مكافئ دمج MediaHomeVideoContract الإجراء المكافئ لدمج حزمة تطوير البرامج (SDK) من Engage
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 مقارنةً بحزمة Engage SDK

باستخدام حزمة تطوير البرامج (SDK) لـ Media Home، تم نشر المجموعات والكيانات من خلال واجهات برمجة تطبيقات منفصلة، وهي:

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

باستخدام حزمة SDK لبرنامج Engage، يتم دمج نشر المجموعات والكيانات في طلب واحد لواجهة برمجة التطبيقات. يتم نشر جميع الكيانات التي تنتمي إلى مجموعة عنقودية مع تلك المجموعة:

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) لتشغيل المحتوى مطلوبة

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

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

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

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

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

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

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

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

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

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

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

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

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

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

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

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

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

TvShowEntity

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

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

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

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

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

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

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

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

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

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

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

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

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

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

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

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

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

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

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

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

TvSeasonEntity

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

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

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

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

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

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

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

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

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

اختياري

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

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

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

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

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

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

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

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

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

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

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

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

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

TvEpisodeEntity

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

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

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

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

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

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

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

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

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

اختياري

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

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

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

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

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

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

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

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

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

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

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

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

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

LiveStreamingVideoEntity

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

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

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

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

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

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

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

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

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

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

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

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

VideoClipEntity

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5,120 كيلوبايت

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

  • المساحة الآمنة للصور: ضَع المحتوى المهم في الوسط بحيث يشغل ‎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

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

البيانات الوصفية التالية هي جزء من بطاقة تسجيل الدخول:

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

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

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

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

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 الحالية من المطوِّر الشريك .
  • يتم تحليل البيانات الواردة من الطلب وتخزينها في ملف تعريف clustered 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();

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

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 لتلقّي طلب نشر المحتوى.

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

يجب إعداد 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))

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED))

// Register Continuation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION))
}

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

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));

// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION));

}
  • حدِّد التنفيذ بشكلٍ ثابت باستخدام علامة <receiver> في ملف AndroidManifest.xml. يتيح ذلك للتطبيق تلقّي طلبات البث عندما لا يكون قيد التشغيل، كما يتيح للتطبيق نشر المحتوى.
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      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 developer integration workflow (سير عمل دمج المطوّرين).

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

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

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

يمكنك التواصل مع Engage-developers@google.com إذا كانت لديك أي أسئلة خلال عملية الدمج.

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

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

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