Grow SDK Food: تعليمات الدمج الفني التابعة لجهات خارجية

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

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

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

المصطلحات

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

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

    • يمكن أن تتألف مجموعة الاقتراحات من ProductEntity أو StoreEntity أو RecipeEntity بطاقات بيانات، ولكن ليس من مزيج من أنواع مختلفة من العناصر.
    الشكل :`ProductEntity` و`StoreEntity` و `RecipeEntity`. (*واجهة المستخدم لأغراض توضيحية فقط)
  • تعرض المجموعة المميّزة مجموعة من الكيانات من عدة شركاء مطوّرين في مجموعة واحدة ضمن واجهة المستخدم. ستكون هناك مجموعة واحدة من المجموعات المميزة، وستظهر بالقرب من أعلى واجهة المستخدم في موضع ذي أولوية أعلى من جميع مجموعات الاقتراحات. سيُسمح لكل شريك مطوِّر ببث ما يصل إلى 10 عناصر في المجموعة المميزة.

    الشكل : مجموعة مميّزة تتضمّن `RecipeEntity`. (*واجهة المستخدم لأغراض توضيحية فقط)
  • تعرض مجموعة سلة تسوّق الطعام معاينة سريعة لسلات تسوّق البقالة من عدة شركاء مطوّرين في مجموعة واحدة من واجهة المستخدم، ما يشجّع المستخدمين على إكمال سلاتهم غير المكتملة. هناك مجموعة واحدة من "عربات تسوّق الطعام".

    • يجب أن تعرض "مجموعة بطاقات تسوّق الطعام" إجمالي عدد السلع في سلة التسوّق، ويمكن أن تتضمّن أيضًا صورًا لعدد X من السلع في سلة تسوّق المستخدم.

      الشكل: مجموعة "سلة تسوّق" خاصة بالطعام من شريك واحد. (*واجهة المستخدم لأغراض توضيحية فقط)
  • تعرض حزمة قائمة التسوّق من البقالة معاينة لقوائم التسوّق من البقالة من عدة شركاء مطوّرين في مجموعة واحدة من واجهة المستخدم، ما يدفع المستخدمين إلى الرجوع إلى التطبيق المعنيّ لتعديل قوائمهم وإكمالها. هناك مجموعة واحدة من قوائم التسوّق الخاصة بالطعام.

    الشكل: مجموعة "قائمة تسوّق المواد الغذائية" من شريك واحد. (*UI for illustrative purposes only)
  • تعرض المجموعة إعادة الترتيب معاينة للطلبات السابقة من عدة شركاء مطوّرين في مجموعة واحدة ضمن واجهة المستخدم، ما يشجّع المستخدمين على إعادة الترتيب. تتوفّر مجموعة واحدة فقط من "إعادة الترتيب".

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

      • صور X منتجات في طلب المستخدم السابق
      • تصنيفات لـ X منتجات في طلب المستخدم السابق
    الشكل: مجموعة "إعادة طلب الطعام" من شريك واحد. (*UI for illustrative purposes only)

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

الحد الأدنى لمستوى واجهة برمجة التطبيقات: 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 على الأكثر 50 على الأكثر (ProductEntity أو RecipeEntity أو StoreEntity)
المجموعة المميزة 1 على الأكثر 20 على الأكثر (ProductEntity أو RecipeEntity أو StoreEntity)
مجموعة عربات تسوّق الطعام 1 على الأكثر ‫3 FoodShoppingCart على الأكثر
مجموعة قائمة التسوّق من البقالة 1 على الأكثر ‫3 FoodShoppingList على الأكثر
مجموعة إعادة طلب الطعام 1 على الأكثر ReorderEntity واحد على الأكثر

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

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

  1. ProductEntity
  2. StoreEntity
  3. RecipeEntity
  4. FoodShoppingCart
  5. FoodShoppingList
  6. FoodReorderCluster

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

ProductEntity

يمثّل العنصر ProductEntity منتجًا فرديًا (مثل منتج بقالة أو طبق من مطعم أو عرض ترويجي) يريد شركاء المطوّرين نشره.

الشكل : سمات ProductEntity

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

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

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

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

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

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

السعر - الحالي مطلوب بشكل مشروط

تمثّل هذه السمة السعر الحالي للمنتج.

يجب توفيرها إذا تم توفير السعر الأصلي المشطوب.

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

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

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

ملاحظات مهمة بشأن وسيلة الشرح اختياري نص الأحكام والشروط الدقيقة لوسيلة الشرح.

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

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

التقييم (اختياري) - ملاحظة: يتم عرض جميع التقييمات باستخدام نظام التقييم العادي بالنجوم.
التقييم - الحد الأقصى للقيمة اختياري

تمثّل هذه السمة الحد الأقصى لمقياس التقييم.

يجب توفيرها إذا تم توفير القيمة الحالية للتقييم أيضًا.

عدد >= 0.0
التقييم - القيمة الحالية اختياري

القيمة الحالية لمقياس التقييم

يجب توفيرها إذا تم توفير الحد الأقصى لقيمة التقييم أيضًا.

عدد >= 0.0
التقييم - العدد اختياري

تمثّل هذه السمة عدد التقييمات التي حصل عليها المنتج.

ملاحظة: يجب توفير هذا الحقل إذا كان تطبيقك يتحكّم في طريقة عرض العدد للمستخدمين. استخدِم سلسلة موجزة. على سبيل المثال، إذا كان العدد 1,000,000، ننصحك باستخدام اختصار مثل 1M حتى لا يتم اقتطاع العدد على أحجام العرض الأصغر.

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

تمثّل هذه السمة عدد التقييمات التي حصل عليها المنتج.

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

الصيغة الطويلة
DisplayTimeWindow (اختياري): ضبط فترة زمنية لعرض المحتوى على مساحة العرض
الطابع الزمني للبدء اختياري

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

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

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

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

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

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

StoreEntity

يمثّل العنصر StoreEntity متجرًا فرديًا يريد شركاء المطوّرين نشره، مثل مطعم أو متجر بقالة.

الشكل : سمات StoreEntity

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

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

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

معرّف موارد منتظم (URI)
العنوان اختياري تمثّل هذه السمة اسم المتجر.

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

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

الموقع الجغرافي اختياري تمثّل هذه السمة الموقع الجغرافي للمتجر.

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

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

وسيلة الشرح اختياري تمثّل هذه السمة وسيلة شرح لعرض عرض ترويجي أو حدث أو آخر الأخبار عن المتجر، إذا كانت متاحة.

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

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

ملاحظات مهمة بشأن وسيلة الشرح اختياري نص الأحكام والشروط الدقيقة لوسيلة الشرح.

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

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

الوصف اختياري تمثّل هذه السمة وصفًا للمتجر.

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

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

الفئة اختياري

فئة المتجر، وفي سياق أماكن تناول الطعام، يمكن أن تكون مطبخًا مثل "فرنسي" أو "أمريكي جديد" أو "رامن" أو "مأكولات راقية".

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

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

ملاحظة: يتم عرض جميع التقييمات باستخدام نظام التقييم بالنجوم العادي.
التقييم - الحد الأقصى للقيمة اختياري

تمثّل هذه السمة الحد الأقصى لمقياس التقييم.

يجب توفيرها إذا تم توفير القيمة الحالية للتقييم أيضًا.

عدد >= 0.0
التقييم - القيمة الحالية اختياري

القيمة الحالية لمقياس التقييم

يجب توفيرها إذا تم توفير الحد الأقصى لقيمة التقييم أيضًا.

عدد >= 0.0
التقييم - العدد اختياري

عدد التقييمات للمتجر

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

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

عدد التقييمات للمتجر

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

الصيغة الطويلة

RecipeEntity

يمثّل عنصر RecipeEntity وصفة يريد شركاء المطوّرين نشرها.

الشكل : سمات RecipeEntity

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

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

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

معرّف موارد منتظم (URI)
العنوان اختياري تمثّل هذه السمة اسم وصفة الطعام.

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

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

المؤلِّف اختياري تمثّل هذه السمة مؤلف الوصفة.

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

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

مدة الطهي/التحضير اختياري تمثّل هذه السمة مدة طهي الوصفة.

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

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

وسيلة الشرح اختياري تمثّل هذه السمة وسيلة عرض مميّزة لعرض عرض ترويجي أو حدث أو معلومات جديدة حول الوصفة، إذا كان ذلك متاحًا.

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

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

الفئة اختياري تمثّل هذه السمة فئة الوصفة.

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

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

الوصف اختياري تمثّل هذه السمة وصفًا للوصفة.

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

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

ملاحظة: يتم عرض جميع التقييمات باستخدام نظام التقييم بالنجوم المعياري.
التقييم - الحد الأقصى للقيمة اختياري

تمثّل هذه السمة الحد الأقصى لمقياس التقييم.

يجب توفيرها إذا تم توفير القيمة الحالية للتقييم أيضًا.

عدد >= 0.0
التقييم - القيمة الحالية اختياري

القيمة الحالية لمقياس التقييم

يجب توفيرها إذا تم توفير الحد الأقصى لقيمة التقييم أيضًا.

عدد >= 0.0
التقييم - العدد اختياري

تمثّل هذه السمة عدد التقييمات التي حصلت عليها الوصفة.

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

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

تمثّل هذه السمة عدد التقييمات التي حصلت عليها الوصفة.

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

الصيغة الطويلة

FoodShoppingCart

الشكل: سمات مجموعة "سلة تسوّق الطعام".

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

الرابط لصفحة سلة التسوق في تطبيق الشريك

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

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

عدد السلع (وليس عدد المنتجات فقط) في سلّة التسوّق.

مثال: إذا كان هناك 3 برتقالات وتفاحة واحدة في سلة التسوق، يجب أن يكون هذا الرقم 4.

عدد صحيح >= 1
الطابع الزمني لآخر تفاعل للمستخدم مطلوبة عدد المللي ثانية التي انقضت منذ بداية الفترة الزمنية، والتي تحدّد آخر مرة تفاعل فيها المستخدم مع سلة التسوق. الطابع الزمني لحقبة Unix بالملي ثانية
العنوان اختياري

عنوان سلة التسوّق (مثلاً، سلة التسوّق).

في حال عدم توفير المطوّر للعنوان، ستكون القيمة التلقائية هي

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

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

نص الحث على اتّخاذ إجراء اختياري

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

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

تتوفّر هذه السمة في الإصدار 1.1.0 والإصدارات الأحدث.

سلسلة
صور سلة التسوّق اختياري

صور لكل منتج في سلة التسوّق

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

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

قائمة بتصنيفات السلع في قائمة التسوّق.

يعتمد العدد الفعلي للتصنيفات المعروضة على شكل الجهاز.

قائمة التصنيفات النصية الحرة

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

DisplayTimeWindow (اختياري): ضبط فترة زمنية لعرض المحتوى على السطح
الطابع الزمني للبدء اختياري

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

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

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

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

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

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

FoodShoppingList

الشكل: مجموعة "قائمة تسوّق المأكولات".

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

الرابط لصفحة معيّنة في تطبيق الشريك تؤدي إلى قائمة التسوّق

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

معرّف موارد منتظم (URI)
عدد العناصر مطلوبة عدد السلع في قائمة التسوّق. عدد صحيح >= 1
الطابع الزمني لآخر تفاعل للمستخدم مطلوبة عدد المللي ثانية التي انقضت منذ بداية الحقبة، والتي تحدّد آخر مرّة تفاعل فيها المستخدم مع قائمة التسوّق. الطابع الزمني لحقبة Unix بالملي ثانية
العنوان اختياري

عنوان القائمة (مثلاً، قائمة مشترياتك)

إذا لم يقدّم المطوّر عنوانًا، سيكون العنوان التلقائي هو قائمة التسوّق.

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

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

تصنيفات العناصر مطلوبة

قائمة بتصنيفات السلع في قائمة التسوّق.

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

قائمة التصنيفات النصية الحرة

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

FoodReorderCluster

الشكل: مجموعة "إعادة طلب الطعام".

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

الرابط لصفحة في تطبيق الشريك لإعادة ترتيب الطلب

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

معرّف موارد منتظم (URI)
نص الحث على اتّخاذ إجراء اختياري

نص عبارة الحث على اتخاذ إجراء في الزر "إعادة الطلب" (مثلاً، طلب مجددًا).

في حال عدم توفير المطوّر لنص الإجراء، تكون القيمة التلقائية هي إعادة الترتيب.

تتوفّر هذه السمة في الإصدار 1.1.0 والإصدارات الأحدث.

سلسلة
عدد العناصر مطلوبة

تمثّل هذه السمة عدد السلع (وليس عدد المنتجات فقط) في الطلب السابق.

على سبيل المثال: إذا كان الطلب السابق يتضمّن 3 أكواب قهوة صغيرة وقطعة كرواسون واحدة، يجب أن يكون هذا الرقم 4.

عدد صحيح >= 1
العنوان مطلوبة تمثّل هذه السمة عنوان المنتج الذي يمكن إعادة طلبه.

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

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

تصنيفات العناصر

اختياري

(في حال عدم توفُّرها، يجب تقديم صور الملصقات)

قائمة بتصنيفات المنتجات للطلب السابق

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

قائمة النصوص الحرة

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

صور الملصقات

اختياري

(في حال عدم توفيرها، يجب توفير تصنيفات العناصر)

صور المنتجات في الطلب السابق

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

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

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

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

نسبة العرض إلى الارتفاع الحدّ الأدنى لعدد وحدات البكسل وحدات البكسل المقترَحة

مربّعة (1x1)

الشبكة المفضّلة

300x300 1200x1200
أفقية (1.91x1) 600x314 ‫1200 x ‏628
عمودية (4x5) 480x600 960x1200

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

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

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

5120 كيلوبايت

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

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

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

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

تتحمّل AppEngageFoodClient مسؤولية نشر مجموعات المأكولات.

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

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishFoodShoppingCarts
  • publishFoodShoppingLists
  • publishReorderCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteFoodShoppingCartCluster
  • deleteFoodShoppingListCluster
  • deleteReorderCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

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

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

نوع المجموعة ثابت نوع المجموعة قيمة العدد الصحيح
غير معروف TYPE_UNKNOWN 0
مجموعة الاقتراحات TYPE_RECOMMENDATION 1
المجموعة المميزة TYPE_FEATURED 2
مجموعة المتابعة TYPE_CONTINUATION 3
مجموعة إعادة طلب الطعام TYPE_FOOD_REORDER 5
مجموعة عربات تسوّق الطعام TYPE_FOOD_SHOPPING_CART 6
مجموعة قائمة التسوّق من البقالة TYPE_FOOD_SHOPPING_LIST 7
مجموعة إدارة المستخدمين 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، تتيح حزمة تطوير البرامج (SDK) الخاصة بمنصة Engage التحقّق من مدى التوفّر لأنواع معيّنة من المجموعات. يوفّر ذلك مرونة أكبر، فإذا اعتمد تطبيق معيّن استراتيجية المحتوى المتقطّع، يمكن أن تتّبع بعض أنواع المجموعات هذه الاستراتيجية المتقطّعة، بينما يتم تفعيل أنواع المجموعات الأخرى دائمًا (أي مجموعات المواصلة).

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

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

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

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

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

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

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

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Big savings on Thanksgiving menu")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Big savings on Thanksgiving menu")
                        .build())
                .build());

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

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

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

publishFeaturedCluster

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

Kotlin

client.publishFeaturedCluster(
            PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    FeaturedCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFeaturedCluster(
            new PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    new FeaturedCluster.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishFoodShoppingCarts

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

Kotlin

client.publishFoodShoppingCarts(
            PublishFoodShoppingCartsRequest.Builder()
                .addFoodShoppingCart(
                    FoodShoppingCart.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFoodShoppingCarts(
            new PublishFoodShoppingCartsRequest.Builder()
                .addFoodShoppingCart(
                    new FoodShoppingCart.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishFoodShoppingLists

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

Kotlin

client.publishFoodShoppingLists(
            PublishFoodShoppingListsRequest.Builder()
                .addFoodShoppingList(
                    FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFoodShoppingLists(
            new PublishFoodShoppingListsRequest.Builder()
                .addFoodShoppingList(
                    new FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishReorderCluster

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

Kotlin

client.publishReorderCluster(
            PublishReorderClusterRequest.Builder()
                .setReorderCluster(
                    FoodReorderCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishReorderCluster(
            new PublishReorderClusterRequest.Builder()
                .setReorderCluster(
                    new FoodReorderCluster.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishUserAccountManagementRequest

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

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

السمة المتطلبات الوصف
معرّف الموارد المنتظم (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;. في حال حدوث خطأ، يتم رفض الطلب بالكامل والاحتفاظ بالحالة الحالية.

deleteFoodShoppingCartCluster

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

Kotlin

client.deleteFoodShoppingCartCluster()

Java

client.deleteFoodShoppingCartCluster();

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

deleteFoodShoppingListCluster

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

Kotlin

client.deleteFoodShoppingListCluster()

Java

client.deleteFoodShoppingListCluster();

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

deleteReorderCluster

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

Kotlin

client.deleteReorderCluster()

Java

client.deleteReorderCluster();

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

deleteUserManagementCluster

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

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

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

deleteClusters

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

Kotlin

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

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_FEATURED)
                .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 لتلقّي طلب نشر المحتوى.

الغرض من أغراض البث هو بشكل أساسي إعادة تفعيل التطبيق وفرض مزامنة البيانات. لم يتم تصميم مكوّنات intent للبث لإرسالها بشكل متكرر جدًا. لا يتم تشغيلها إلا عندما تحدّد &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 food shopping cart cluster publish when PUBLISH_FOOD_SHOPPING_CART broadcast
  // is received
  // Trigger food shopping list cluster publish when PUBLISH_FOOD_SHOPPING_LIST broadcast
  // is received
  // Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER 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 food Shopping Cart Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FOOD_SHOPPING_CART),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

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

// Register Reorder Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_REORDER_CLUSTER),
                           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 food shopping cart cluster publish when PUBLISH_FOOD_SHOPPING_CART broadcast is
// received

// Trigger food shopping list cluster publish when PUBLISH_FOOD_SHOPPING_LIST broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER 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 food Shopping Cart Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_FOOD_SHOPPING_CART),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register food Shopping List Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_FOOD_SHOPPING_LIST),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Reorder Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER),
                         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.food.PUBLISH_FOOD_SHOPPING_CART" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_LIST" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_REORDER_CLUSTER" />
      </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.food.PUBLISH_FOOD_SHOPPING_CART يُنصح ببدء مكالمة publishFoodShoppingCarts عند تلقّي هذا الغرض.
  • com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_LIST يُنصح ببدء مكالمة publishFoodShoppingLists عند تلقّي هذا الغرض.
  • com.google.android.engage.action.food.PUBLISH_REORDER_CLUSTER يُنصح ببدء مكالمة publishReorderCluster عند تلقّي هذا الغرض.

سير عمل الدمج

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

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

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

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

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

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

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

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