حزمة تطوير البرامج (SDK) لتفاعلات المستخدمين على الشبكات الاجتماعية: تعليمات الدمج الفني التابع لطرف ثالث

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

يتضمّن هذا الدليل تعليمات للشركاء المطوّرين حول كيفية تقديم محتوى وسائل التواصل الاجتماعي إلى مساحات عرض المحتوى في Engage.

الفئات ومساحات العرض المتوافقة

تعتمد أهلية مساحة العرض في حزمة Engage SDK على فئة محتوى تطبيقك. استخدِم الجدول التالي لتحديد أهليتك للظهور على مساحات عرض معيّنة:

الحالة فئة المحتوى أو حالة الاستخدام مساحات العرض المتوافقة
متاحة
(مؤهَّلة على جميع مساحات العرض)
  • شبكات اجتماعية
  • صور / ميمز
  • مقاطع فيديو / فيديوهات قصيرة
  • لقاءات شخصية
  • تخزين الصور في السحابة الإلكترونية
  • المجموعات
  • علامة تبويب "التطبيقات" في "متجر Google Play"
  • علامة التبويب "أنت" في "متجر Google Play"
  • صفحة بطاقة بيانات المتجر على "متجر Google Play"
غير متاح
  • محادثة فيديو مباشرة
  • المراسلة الفورية أو مشاركة الحضور على الإنترنت أو البيانات المباشرة
  • أدوات مشاركة وتنزيل الملفات
  • المواعدة
  • أدوات إنشاء الأفاتار

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

يتناول القسم التالي تفاصيل عملية الدمج.

المصطلحات

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

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

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

تتكوّن كل مجموعة اقتراحات من أحد نوعَي الكيانات التاليَين :

  • PortraitMediaEntity
  • SocialPostEntity

يجب أن يحتوي PortraitMediaEntity على صورة عمودية واحدة للمنشور. أما البيانات الوصفية المتعلقة بالملف الشخصي والتفاعل، فهي اختيارية.

  • نشر

    • صورة في وضع "بورتريه" وطابع زمني، أو
    • صورة في وضع "بورتريه" + محتوى نصي وطابع زمني
  • الملف الشخصي

    • الأفاتار أو الاسم أو الاسم المعرِّف أو صورة إضافية
  • التفاعلات

    • العدّ والتصنيف فقط، أو
    • العدد والمحتوى المرئي (رمز)

يحتوي SocialPostEntity على بيانات وصفية مرتبطة بالملف الشخصي والمنشور والتفاعل.

  • الملف الشخصي

    • الأفاتار أو الاسم أو الاسم المعرِّف، ونص إضافي، وصورة إضافية
  • نشر

    • النص والطابع الزمني، أو
    • وسائط تفاعلية متقدّمة (صورة أو عنوان URL تفاعلي) وطابع زمني، أو
    • نص ووسائط تفاعلية متقدّمة (صورة أو عنوان URL تفاعلي) وطابع زمني، أو
    • معاينة الفيديو (الصورة المصغّرة والمدة) والطابع الزمني
  • التفاعلات

    • العدّ والتصنيف فقط، أو
    • العدد والمرئيات (الرمز)

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

الحدّ الأدنى لمستوى واجهة برمجة التطبيقات: 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.6.0'
}

ملخّص

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

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

نوع المجموعة حدود المجموعة العنقودية الحدّ الأدنى لعدد الكيانات في المجموعة العنقودية الحدود القصوى للكيانات في مجموعة عنقودية
مجموعات الاقتراحات 7 على الأكثر سمة واحدة على الأقل (PortraitMediaEntity أو SocialPostEntity) ‫50 كحدّ أقصى (PortraitMediaEntity أو SocialPostEntity)

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

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

  1. PortraitMediaEntity
  2. SocialPostEntity

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

PortraitMediaEntity

السمة المتطلبات الوصف التنسيق
معرّف الموارد المنتظم (URI) للإجراء مطلوبة لجميع مساحات العرض باستثناء Google TV

رابط عميق للكيان في تطبيق مقدّم الخدمة

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

معرّف الموارد المنتظم (URI)
PlatformSpecificPlayback مطلوبة لسطح Google TV

رابط عميق يؤدي إلى الكيان في تطبيق مقدّم الخدمة لمنصات مثل Google TV والأجهزة الجوّالة

قائمة بعناصر PlatformSpecificPlayback
سبب تقديم هذا الاقتراح اختياري السبب وراء اقتراح المحتوى للمستخدم كائن RecommendationReason
ملخّص التعليقات اختياري ملخّص التعليقات على المنشور سلسلة
البيانات الوصفية ذات الصلة بالمنشور (مطلوبة)
صورة (صور) مطلوب

يجب أن تكون الصور بنسبة عرض إلى ارتفاع عمودية.

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

إذا كان المنشور عبارة عن فيديو، على مقدّم الخدمة توفير صورة مصغّرة للفيديو ليتم عرضها كصورة.

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
محتوى النص اختياري النص الرئيسي لمنشور أو تحديث أو ما إلى ذلك. سلسلة (ننصح بحدّ أقصى يبلغ 140 حرفًا)
الطابع الزمني اختياري وقت نشر المنشور الطابع الزمني للحقبة بالملي ثانية
عبارة عن محتوى فيديو اختياري هل المنشور عبارة عن فيديو؟ قيمة منطقية
مدة الفيديو اختياري تشير هذه العلامة إلى مدة الفيديو بالملي ثانية. الصيغة الطويلة
البيانات الوصفية ذات الصلة بالملف الشخصي (اختياري)
الاسم مطلوب اسم الملف الشخصي أو معرّفه أو الاسم المعرِّف، مثل "John Doe" أو "‎@TeamPixel" سلسلة(الحد الأقصى المقترَح هو 25 حرفًا)
الأفاتار مطلوب

صورة الملف الشخصي أو الصورة الرمزية للمستخدم

الصورة المربّعة (1:1)

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
صورة إضافية اختياري

شارة الملف الشخصي، مثل شارة "تم التحقّق منه"

الصورة المربّعة (1:1)

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
البيانات الوصفية ذات الصلة بالتفاعلات (اختيارية)
العدد اختياري

أشِر إلى عدد التفاعلات، على سبيل المثال "3.7 مليون".

ملاحظة: في حال تقديم كل من "العدد" و"قيمة العدد"، سيتم استخدام "العدد".

ملاحظة: على الشركاء استخدام إما Count أو CountWithOptionalLabel.

سلسلة

CountWithOptionalLabel اختياري

أشِر إلى عدد التفاعلات باستخدام تصنيف اختياري، على سبيل المثال: "3.7 مليون إعجاب".

ملاحظة: في حال تقديم كلّ من CountWithOptionalLabel وCount Value، سيتم استخدام أحدهما.

ملاحظة: على الشركاء استخدام إما Count أو CountWithOptionalLabel.

سلسلة

قيمة العدد اختياري

عدد التفاعلات كقيمة

ملاحظة: يجب تقديم قيمة العدد بدلاً من العدد إذا كان تطبيقك لا يتعامل مع المنطق المتعلّق بكيفية تحسين عدد كبير من أحجام العرض المختلفة. في حال تقديم كل من "العدد" و"قيمة العدد"، يتم استخدام "العدد".

الصيغة الطويلة
التصنيف اختياري أشِر إلى الغرض من تصنيف التفاعل. على سبيل المثال، "المعجبون".

سلسلة

مرئي اختياري

أشِر إلى الغرض من التفاعل. على سبيل المثال، صورة تعرض رمز الإعجاب ورمز الإيموجي.

يمكنك تقديم أكثر من صورة واحدة، ولكن قد لا يتم عرضها جميعًا على جميع أشكال الأجهزة.

ملاحظة: يجب أن تكون الصورة مربّعة بنسبة عرض إلى ارتفاع 1:1

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
‫DisplayTimeWindow (اختياري): لضبط فترة زمنية لعرض المحتوى على مساحة العرض
الطابع الزمني للبدء اختياري

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

وفي حال عدم ضبطها، يكون المحتوى مؤهلاً للظهور على مساحة العرض.

الطابع الزمني للحقبة بالملي ثانية
الطابع الزمني للنهاية اختياري

الطابع الزمني الذي يشير إلى الوقت الذي لن يظهر فيه المحتوى على مساحة العرض.

وفي حال عدم ضبطها، يكون المحتوى مؤهلاً للظهور على مساحة العرض.

الطابع الزمني للحقبة بالملي ثانية

SocialPostEntity

السمة المتطلبات الوصف التنسيق
معرّف الموارد المنتظم (URI) للإجراء مطلوبة

رابط عميق للكيان في تطبيق مقدّم الخدمة

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

معرّف الموارد المنتظم (URI)
عناوين URI الخاصة بـ PlatformSpecificPlayback مطلوبة لسطح Google TV

رابط عميق يؤدي إلى الكيان في تطبيق مقدّم الخدمة لمنصات مثل Google TV والأجهزة الجوّالة

قائمة بعناصر PlatformSpecificPlayback
سبب تقديم هذا الاقتراح اختياري السبب وراء اقتراح المحتوى للمستخدم كائن RecommendationReason
ملخّص التعليقات اختياري ملخّص التعليقات على المنشور سلسلة

البيانات الوصفية ذات الصلة بالمنشور (مطلوبة)

يجب توفير سمة واحدة على الأقل من TextContent أو Image أو WebContent

صورة (صور) اختياري

يجب أن تكون الصور بنسبة عرض إلى ارتفاع عمودية.

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

إذا كان المنشور عبارة عن فيديو، على مقدّم الخدمة توفير صورة مصغّرة للفيديو ليتم عرضها كصورة.

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
محتوى النص اختياري النص الرئيسي لمنشور أو تحديث أو ما إلى ذلك. سلسلة (ننصح بحدّ أقصى يبلغ 140 حرفًا)
محتوى الفيديو (اختياري)
المدة مطلوب تشير هذه العلامة إلى مدة الفيديو بالملي ثانية. الصيغة الطويلة
صورة مطلوب صورة معاينة لمحتوى الفيديو يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
معاينة الرابط (اختياري)
معاينة الرابط - العنوان مطلوب نص يشير إلى عنوان محتوى صفحة الويب سلسلة
معاينة الرابط - اسم المضيف مطلوب نص يشير إلى مالك صفحة الويب، مثل "INSIDER" سلسلة
معاينة الرابط - صورة اختياري صورة رئيسية للمحتوى على الويب يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
الطابع الزمني اختياري وقت نشر المنشور الطابع الزمني للحقبة بالملي ثانية
البيانات الوصفية ذات الصلة بالملف الشخصي (اختياري)
الاسم مطلوب اسم الملف الشخصي أو معرّفه أو الاسم المعرِّف، مثل "John Doe" أو "‎@TeamPixel" سلسلة(الحد الأقصى المقترَح هو 25 حرفًا)
نص إضافي اختياري

يمكن استخدامه كرقم تعريف للملف الشخصي أو اسم معرِّف أو بيانات وصفية إضافية

مثال: "@John-Doe"، "5 مليون متابع"، "قد يعجبك"، "رائج"، "5 منشورات جديدة"

سلسلة(الحدّ الأقصى المقترَح هو 40 حرفًا)
الأفاتار مطلوب

صورة الملف الشخصي أو الصورة الرمزية للمستخدم

الصورة المربّعة (1:1)

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
صورة إضافية اختياري

شارة الملف الشخصي، مثل شارة "تم التحقّق منه"

الصورة المربّعة (1:1)

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
البيانات الوصفية ذات الصلة بالتفاعلات (اختيارية)
العدد مطلوب

يُرجى الإشارة إلى عدد التفاعلات، على سبيل المثال "3.7 مليون".

ملاحظة: على الشركاء استخدام إما Count أو CountWithOptionalLabel.

سلسلة
CountWithOptionalLabel مطلوب

أشِر إلى عدد التفاعلات باستخدام تصنيف اختياري، على سبيل المثال: "3.7 مليون إعجاب".

ملاحظة: على الشركاء استخدام إما Count أو CountWithOptionalLabel.

سلسلة
التصنيف

اختياري

في حال عدم تقديمها، يجب تقديم السمة Visual.

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

اختياري

في حال عدم تقديمها، يجب تقديم التصنيف.

أشِر إلى الغرض من التفاعل. على سبيل المثال، صورة تعرض رمز الإعجاب ورمز إيموجي.

يمكنك تقديم أكثر من صورة واحدة، ولكن قد لا يتم عرضها كلها على جميع أشكال الأجهزة.

الصورة المربّعة (1:1)

يُرجى الاطّلاع على مواصفات الصور للحصول على إرشادات.
‫DisplayTimeWindow (اختياري): لضبط فترة زمنية لعرض المحتوى على مساحة العرض
الطابع الزمني للبدء اختياري

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

وفي حال عدم ضبطها، يكون المحتوى مؤهلاً للظهور على مساحة العرض.

الطابع الزمني للحقبة بالملي ثانية
الطابع الزمني للنهاية اختياري

الطابع الزمني الذي يشير إلى الوقت الذي لن يظهر فيه المحتوى على مساحة العرض.

وفي حال عدم ضبطها، يكون المحتوى مؤهلاً للظهور على مساحة العرض.

الطابع الزمني للحقبة بالملي ثانية

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

يجب استضافة الصور على شبكات توصيل محتوى (CDN) عامة لكي تتمكّن Google من الوصول إليها.

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

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

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

‫5,120 كيلوبايت

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

  • المنطقة الآمنة للصور: ضَع المحتوى المهم في الوسط بحيث يشغل% 80 من الصورة.
  • استخدِم خلفية شفافة لكي يتم عرض الصورة بشكل صحيح في إعدادات المظهرَين الداكن والفاتح.

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

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

‫AppEngageSocialClient مسؤول عن نشر المجموعات الاجتماعية.

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

  • isServiceAvailable
  • publishRecommendationClusters
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

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

يمكنك التحقّق من توفّر الخدمة لكل نوع مجموعة تريد نشرها. تقبل واجهة برمجة التطبيقات isServiceAvailable عنصر طلب، ServiceAvailabilityRequest، يحتوي على أنواع المجموعات التي يجب التحقّق من توفّر الخدمة لها. يمكنك العثور على قيم التعداد ClusterType المطلوبة لـ ServiceAvailabilityRequest من الجدول التالي.

نوع المجموعة ثابت نوع المجموعة قيمة العدد الصحيح
غير معروف TYPE_UNKNOWN 0
مجموعة الاقتراحات TYPE_RECOMMENDATION 1
مجموعة "المحتوى المميّز" TYPE_FEATURED 2
مجموعة المتابعة TYPE_CONTINUATION 3
مجموعة إدارة المستخدمين TYPE_ENGAGEMENT 8
مجموعة الاشتراكات TYPE_SUBSCRIPTION 12

Kotlin

val request = ServiceAvailabilityRequest.Builder()
    .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
    .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
    .build()

client.isServiceAvailable(request).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val availabilityMap = task.result
        if (availabilityMap[ClusterType.TYPE_CONTINUATION] == true) {
            // Proceed with publishing continuation content
        }
        if (availabilityMap[ClusterType.TYPE_RECOMMENDATION] == true) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
}

Java

ServiceAvailabilityRequest request =
    new ServiceAvailabilityRequest.Builder()
        .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
        .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
        .build();

client.isServiceAvailable(request).addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
        Map<Integer, Boolean> availabilityMap = task.getResult();
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_CONTINUATION))) {
            // Proceed with publishing continuation content
        }
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_RECOMMENDATION))) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
});
ميزة "توفّر الخدمة المشروط"

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

اعتبارًا من الإصدار 1.6.0، تتيح حزمة Engage SDK التحقّق من مدى توفّر أنواع معيّنة من المجموعات. إذا أردت تفعيل هذه الميزة لأي نوع من المجموعات، يُرجى التواصل مع engage-developers@google.com.

بالنسبة إلى إصدارات حزمة تطوير البرامج (SDK) الأقدم من 1.6.0 (تم إيقافها نهائيًا)

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.

يمكن أن يتضمّن عنصر RecommendationCluster السمات التالية:

السمة المتطلبات الوصف
قائمة SocialPostEntity أو PortraitMediaEntity مطلوبة قائمة بالكيانات التي تشكّل الاقتراحات لهذه المجموعة من الاقتراحات يجب أن تكون الكيانات في مجموعة واحدة من النوع نفسه.
العنوان مطلوبة

عنوان "مجموعة الاقتراحات" (على سبيل المثال، آخر الأخبار من أصدقائك)

حجم النص المقترَح: أقل من 25 حرفًا (قد تظهر علامات حذف في النص الطويل جدًا)

العنوان الفرعي اختياري العنوان الفرعي لمجموعة الاقتراحات
معرّف الموارد المنتظم (URI) للإجراء اختياري

الرابط لصفحة معيّنة في تطبيق الشريك حيث يمكن للمستخدمين الاطّلاع على القائمة الكاملة للاقتراحات.

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

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build());

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

  • تتم إزالة جميع بيانات "مجموعات الاقتراحات" الحالية.
  • يتم تحليل البيانات من الطلب وتخزينها في مجموعات اقتراحات جديدة.

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

publishUserAccountManagementRequest

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

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

السمة المتطلبات الوصف
معرّف الموارد المنتظم (URI) للإجراء مطلوب رابط لصفحة معيّنة يؤدي إلى إجراء (أي ينقل المستخدم إلى صفحة تسجيل الدخول إلى التطبيق)
صورة اختيارية: إذا لم يتم تقديمها، يجب تقديم سمة "العنوان" (Title)

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

صور بنسبة عرض إلى ارتفاع 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());

deleteRecommendationsClusters

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

Kotlin

client.deleteRecommendationsClusters()

Java

client.deleteRecommendationsClusters();

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

deleteUserManagementCluster

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

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

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

deleteClusters

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

Kotlin

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

Java

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

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

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

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

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

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

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

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

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
  // 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)
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION 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);
}
  • يجب الإعلان بشكل ثابت عن عملية التنفيذ باستخدام علامة <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>
   </receiver>
</application>

سترسل الخدمة الطلبات التالية:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION ننصحك ببدء مكالمة publishRecommendationClusters عند تلقّي هذا الطلب.

سير عمل الدمج

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

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

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

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

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

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

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

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