زيادة التفاعل مع التطبيق من خلال الوصول إلى المستخدمين في الأماكن التي يتواجدون فيها يمكنك ربط تطبيقك بحزمة Engage SDK لعرض اقتراحات مخصّصة ومحتوى يمكن للمستخدمين مواصلته مباشرةً على مساحات عرض متعددة على الجهاز فقط، مثل المجموعات ومساحة الترفيه و"متجر Google Play". تضيف عملية الدمج أقل من 50 كيلوبايت (مضغوطة) إلى متوسط حجم حزمة APK، وتستغرق معظم التطبيقات حوالي أسبوع من وقت المطوّر. يمكنك الاطّلاع على مزيد من المعلومات على الموقع الإلكتروني الخاص بالأنشطة التجارية.
يحتوي هذا الدليل على تعليمات للمطوّرين الشركاء حول كيفية عرض محتوى وسائل التواصل الاجتماعي على مساحات عرض Engage.
الفئات ومساحات العرض المتوافقة
تستند أهلية مساحة العرض في حزمة Engage SDK إلى فئة محتوى تطبيقك. استخدِم الجدول التالي لتحديد أهليتك للاستفادة من مساحات عرض معيّنة:
| الحالة | فئة المحتوى أو حالة الاستخدام | مساحات العرض المتوافقة |
|---|---|---|
|
متاحة (مؤهَّلة للظهور على جميع مساحات العرض) |
|
|
| غير متاح |
|
مهارات Android
عرض على GitHubدمج حزمة Engage SDK
android skills add engage-sdk-integrationتفاصيل عملية الدمج
يعرض القسم التالي تفاصيل الدمج.
المصطلحات
تعرض مجموعات الاقتراحات اقتراحات مخصّصة من أحد شركاء المطوّرين.
تتّبع اقتراحاتك البنية التالية:
مجموعة الاقتراحات: هي طريقة عرض في واجهة المستخدم تحتوي على مجموعة من الاقتراحات المقدَّمة من شريك المطوّر نفسه.
تتألف كل مجموعة توصيات من أحد النوعَين التاليَين من الكيانات :
- 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 مع العناصر التالية ضمن فئة "الشبكات الاجتماعية":
PortraitMediaEntitySocialPostEntity
توضّح الرسومات البيانية أدناه السمات والمتطلبات المتاحة لكل نوع.
PortraitMediaEntity
| السمة | المتطلبات | الوصف | التنسيق |
|---|---|---|---|
| معرّف الموارد المنتظم (URI) للإجراء | مطلوبة لجميع مساحات العرض باستثناء Google TV |
رابط لصفحة معيّنة في تطبيق مقدّم الخدمة ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق لتحديد مصدر الإحالة. يُرجى الرجوع إلى الأسئلة الشائعة |
معرّف الموارد المنتظم (URI) |
| PlatformSpecificPlayback | مطلوب لسطح Google TV |
رابط عميق يؤدي إلى الجهة في تطبيق مقدّم الخدمة على منصات مثل Google TV والأجهزة الجوّالة |
قائمة بكائنات PlatformSpecificPlayback |
| سبب تقديم هذا الاقتراح | اختياري | سبب اقتراح المحتوى على المستخدم | RecommendationReason object |
| ملخّص التعليقات | اختياري | ملخّص التعليقات على المشاركة | سلسلة |
| البيانات الوصفية ذات الصلة بالمنشور (مطلوبة) | |||
| صورة (صور) | مطلوب |
يجب أن تكون الصور بنسبة عرض إلى ارتفاع عمودية. قد تعرض واجهة المستخدم صورة واحدة فقط عند تقديم صور متعددة. ومع ذلك، قد توفّر واجهة المستخدم إشارة مرئية إلى توفّر المزيد من الصور في التطبيق. إذا كان المنشور عبارة عن فيديو، على مقدّم الخدمة توفير صورة مصغّرة للفيديو ليتم عرضها كصورة. |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| محتوى النص | اختياري | تمثّل هذه السمة النص الرئيسي في مشاركة أو تحديث أو غير ذلك. | سلسلة (ننصح بحدّ أقصى يبلغ 140 حرفًا) |
| الطابع الزمني | اختياري | تمثّل هذه السمة وقت نشر المشاركة. | الطابع الزمني لحقبة Unix بالملّي ثانية |
| عبارة عن محتوى فيديو | اختياري | هل المنشور عبارة عن فيديو؟ | قيمة منطقية |
| مدة الفيديو | اختياري | تمثّل هذه السمة مدة الفيديو بالمللي ثانية. | الصيغة الطويلة |
| البيانات الوصفية المرتبطة بالملف الشخصي (اختياري) | |||
| الاسم | مطلوب | اسم الملف الشخصي أو معرّفه أو اسمه المعرِّف، مثل "John Doe" أو "@TeamPixel" | سلسلة(يُنصح بألا تتجاوز 25 حرفًا) |
| الأفاتار | مطلوب |
صورة الملف الشخصي للمستخدم أو صورة الأفاتار الصورة المربّعة (1:1) |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| صورة إضافية | اختياري |
شارة الملف الشخصي، مثل شارة "تم التحقّق منه" الصورة المربّعة (1:1) |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| البيانات الوصفية ذات الصلة بالتفاعلات (اختياري) | |||
| العدد | اختياري |
أدخِل عدد التفاعلات، على سبيل المثال "3.7 مليون". ملاحظة: إذا تم توفير كلّ من "العدد" و"قيمة العدد"، سيتم استخدام "العدد". ملاحظة: على الشركاء استخدام Count أو CountWithOptionalLabel. |
سلسلة |
| CountWithOptionalLabel | اختياري |
أدرِج عدد التفاعلات مع تصنيف اختياري، مثل "3.7 مليون إعجاب". ملاحظة: إذا تم توفير كلّ من CountWithOptionalLabel وCount Value، سيتم استخدام إحداهما. ملاحظة: على الشركاء استخدام Count أو CountWithOptionalLabel. |
سلسلة |
| قيمة العدد | اختياري | تمثّل هذه السمة عدد التفاعلات كقيمة. ملاحظة: قدِّم قيمة العدد بدلاً من العدد إذا كان تطبيقك لا يتعامل مع منطق كيفية تحسين عدد كبير ليناسب أحجام العرض المختلفة. في حال توفير كل من Count وCount Value، يتم استخدام Count. |
الصيغة الطويلة |
| التصنيف | اختياري | حدِّد الغرض من تصنيف التفاعل. على سبيل المثال، "أعجبني". | سلسلة |
| مرئي | اختياري |
حدِّدوا الغرض من التفاعل. على سبيل المثال، صورة تعرض رمز الإعجاب أو إيموجي. يمكن تقديم أكثر من صورة واحدة، ولكن قد لا يتم عرضها كلها على جميع أشكال الأجهزة. ملاحظة: يجب أن تكون الصورة مربّعة بنسبة 1:1 |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| DisplayTimeWindow (اختياري): ضبط فترة زمنية لعرض المحتوى على مساحة العرض | |||
| الطابع الزمني للبدء | اختياري |
الطابع الزمني للحقبة الذي يجب أن يظهر بعده المحتوى على مساحة العرض. في حال عدم ضبط هذه السمة، يكون المحتوى مؤهَّلاً للعرض على مساحة العرض. |
الطابع الزمني لحقبة Unix بالملّي ثانية |
| الطابع الزمني للنهاية | اختياري |
يشير هذا الحقل إلى الطابع الزمني لوقت يونكس الذي يتوقف بعده عرض المحتوى على السطح. في حال عدم ضبط هذه السمة، يكون المحتوى مؤهَّلاً للعرض على مساحة العرض. |
الطابع الزمني لحقبة Unix بالملّي ثانية |
SocialPostEntity
| السمة | المتطلبات | الوصف | التنسيق |
|---|---|---|---|
| معرّف الموارد المنتظم (URI) للإجراء | مطلوب |
رابط لصفحة معيّنة في تطبيق مقدّم الخدمة ملاحظة: يمكنك استخدام الروابط لصفحات في التطبيق لتحديد مصدر الإحالة. يُرجى الرجوع إلى الأسئلة الشائعة |
معرّف الموارد المنتظم (URI) |
| PlatformSpecificPlayback URIs | مطلوب لسطح Google TV |
رابط عميق يؤدي إلى الجهة في تطبيق مقدّم الخدمة على منصات مثل Google TV والأجهزة الجوّالة |
قائمة بكائنات PlatformSpecificPlayback |
| سبب تقديم هذا الاقتراح | اختياري | سبب اقتراح المحتوى على المستخدم | RecommendationReason object |
| ملخّص التعليقات | اختياري | ملخّص التعليقات على المشاركة | سلسلة |
|
البيانات الوصفية ذات الصلة بالمنشور (مطلوبة) يجب توفير سمة واحدة على الأقل من TextContent أو Image أو WebContent |
|||
| صورة (صور) | اختياري |
يجب أن تكون الصور بنسبة عرض إلى ارتفاع عمودية. قد تعرض واجهة المستخدم صورة واحدة فقط عند تقديم صور متعددة. ومع ذلك، قد توفّر واجهة المستخدم إشارة مرئية إلى توفّر المزيد من الصور في التطبيق. إذا كان المنشور عبارة عن فيديو، على مقدّم الخدمة توفير صورة مصغّرة للفيديو ليتم عرضها كصورة. |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| محتوى النص | اختياري | تمثّل هذه السمة النص الرئيسي في مشاركة أو تحديث أو غير ذلك. | سلسلة (ننصح بحدّ أقصى يبلغ 140 حرفًا) |
| محتوى الفيديو (اختياري) | |||
| المدة | مطلوب | تمثّل هذه السمة مدة الفيديو بالمللي ثانية. | الصيغة الطويلة |
| صورة | مطلوب | صورة معاينة لمحتوى الفيديو | للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| معاينة الرابط (اختياري) | |||
| معاينة الرابط - العنوان | مطلوب | نص للإشارة إلى عنوان محتوى صفحة الويب | سلسلة |
| معاينة الرابط - اسم المضيف | مطلوب | نص يشير إلى مالك صفحة الويب، مثل "INSIDER" | سلسلة |
| معاينة الرابط - صورة | اختياري | الصورة الرئيسية لمحتوى الويب | للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| الطابع الزمني | اختياري | تمثّل هذه السمة وقت نشر المشاركة. | الطابع الزمني لحقبة Unix بالملّي ثانية |
| البيانات الوصفية المرتبطة بالملف الشخصي (اختياري) | |||
| الاسم | مطلوب | اسم الملف الشخصي أو معرّفه أو اسمه المستعار، مثل "John Doe" أو "@TeamPixel" | سلسلة(يُنصح بألا تتجاوز 25 حرفًا) |
| نص إضافي | اختياري |
يمكن استخدامها كمعرّف ملف شخصي أو اسم مستخدم أو بيانات وصفية إضافية على سبيل المثال، "@John-Doe"، و"5 ملايين متابع"، و"قد يعجبك"، و"المحتوى الرائج"، و"5 مشاركات جديدة" |
سلسلة(40 حرفًا بحدّ أقصى يُنصح به) |
| الأفاتار | مطلوب |
صورة الملف الشخصي للمستخدم أو صورة الأفاتار الصورة المربّعة (1:1) |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| صورة إضافية | اختياري |
شارة الملف الشخصي، مثل شارة "تم التحقّق منه" الصورة المربّعة (1:1) |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| البيانات الوصفية ذات الصلة بالتفاعلات (اختياري) | |||
| العدد | مطلوب |
يشير هذا المقياس إلى عدد التفاعلات، مثلاً "3.7 مليون". ملاحظة: على الشركاء استخدام Count أو CountWithOptionalLabel. |
سلسلة |
| CountWithOptionalLabel | مطلوب |
أدرِج عدد التفاعلات مع تصنيف اختياري، مثل "3.7 مليون إعجاب". ملاحظة: على الشركاء استخدام Count أو CountWithOptionalLabel. |
سلسلة |
| التصنيف |
اختياري في حال عدم توفّرها، يجب تقديم إثبات مرئي. |
حدِّدوا الغرض من التفاعل. على سبيل المثال، "الإعجابات". | سلسلة (يُفضّل ألا يزيد عدد الأحرف عن 20 حرفًا للعدد والتسمية معًا) |
| مرئي |
اختياري في حال عدم توفيرها، يجب توفير التصنيف. |
حدِّدوا الغرض من التفاعل. على سبيل المثال، صورة تعرض رمز الإعجاب ورمز إيموجي. يمكن تقديم أكثر من صورة واحدة، ولكن قد لا يتم عرضها كلها على جميع أشكال الأجهزة. الصورة المربّعة (1:1) |
للحصول على إرشادات، يُرجى الاطّلاع على مواصفات الصور. |
| DisplayTimeWindow (اختياري): ضبط فترة زمنية لعرض المحتوى على مساحة العرض | |||
| الطابع الزمني للبدء | اختياري |
الطابع الزمني للحقبة الذي يجب أن يظهر بعده المحتوى على مساحة العرض. في حال عدم ضبط هذه السمة، يكون المحتوى مؤهَّلاً للعرض على مساحة العرض. |
الطابع الزمني لحقبة Unix بالملّي ثانية |
| الطابع الزمني للنهاية | اختياري |
يشير هذا الحقل إلى الطابع الزمني لوقت يونكس الذي يتوقف بعده عرض المحتوى على السطح. في حال عدم ضبط هذه السمة، يكون المحتوى مؤهَّلاً للعرض على مساحة العرض. |
الطابع الزمني لحقبة Unix بالملّي ثانية |
مواصفات الصور
يجب استضافة الصور على شبكات توصيل محتوى (CDN) عامة كي يتمكّن Google من الوصول إليها.
تنسيقات الملفات
PNG أو JPG أو GIF ثابت أو WebP
الحد الأقصى لحجم الملف
5,120 كيلوبايت
اقتراحات إضافية
- مساحة القسم المهم في الصور: ضَع المحتوى المهم في الوسط ليشغل 80% من الصورة.
- استخدِم خلفية شفافة حتى يمكن عرض الصورة بشكل صحيح في إعدادات المظهرَين الداكن والفاتح.
الخطوة 2: تقديم بيانات المجموعة
ننصح بتنفيذ مهمة نشر المحتوى في الخلفية (على سبيل المثال، باستخدام WorkManager) وجدولتها بانتظام أو استنادًا إلى حدث معيّن (على سبيل المثال، في كل مرة يفتح فيها المستخدم التطبيق أو عندما يتابع المستخدم حسابًا جديدًا).
AppEngageSocialClient هي المسؤولة عن نشر المجموعات الاجتماعية.
في ما يلي واجهات برمجة التطبيقات لنشر المجموعات في العميل:
isServiceAvailablepublishRecommendationClusterspublishUserAccountManagementRequestupdatePublishStatusdeleteRecommendationsClustersdeleteUserManagementClusterdeleteClusters
isServiceAvailable
تُستخدَم واجهة برمجة التطبيقات هذه للتأكّد من أنّ الخدمة متاحة للدمج وما إذا كان يمكن عرض المحتوى على الجهاز.
بالنسبة إلى الإصدار 1.6.0 من Engage SDK والإصدارات الأحدث (ننصح به)
مهارات Android
عرض على GitHubدمج حزمة Engage SDK
android skills add engage-sdk-integrationUse the engage-sdk-integration skill to use Engage SDK 1.6.0 and refactor isServiceAvailable to pass ServiceAvailabilityRequest for publishing all cluster types.يمكنك التحقّق من مدى توفّر الخدمة لكل نوع من أنواع المجموعات التي تريد نشرها. تقبل واجهة برمجة التطبيقات 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، تتيح حزمة تطوير البرامج (SDK) الخاصة بمنصة 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 السمات التالية:
| السمة | المتطلبات | الوصف |
|---|---|---|
| قائمة SocialPostEntity أو PortraitMediaEntity | مطلوب | قائمة بالكيانات التي تشكّل الاقتراحات الخاصة بمجموعة الاقتراحات هذه. يجب أن تكون الكيانات في مجموعة عنقودية واحدة من النوع نفسه. |
| العنوان | مطلوب | عنوان مجموعة الاقتراحات (مثلاً، آخر الأخبار من أصدقائك) حجم النص المقترَح: أقل من 25 حرفًا (قد تظهر علامات حذف إذا كان النص طويلاً جدًا) |
| العنوان الفرعي | اختياري | العنوان الفرعي لمجموعة الاقتراحات |
| Action 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
تُستخدَم واجهة برمجة التطبيقات هذه لنشر بطاقة "تسجيل الدخول". يوجه إجراء تسجيل الدخول المستخدمين إلى صفحة تسجيل الدخول في التطبيق حتى يتمكّن التطبيق من نشر المحتوى (أو تقديم محتوى أكثر تخصيصًا).
تشكّل البيانات الوصفية التالية جزءًا من "بطاقة تسجيل الدخول":
| السمة | المتطلبات | الوصف |
|---|---|---|
| Action Uri | مطلوب | رابط لصفحة معيّنة تؤدي إلى إجراء (أي الانتقال إلى صفحة تسجيل الدخول إلى التطبيق) |
| صورة | اختياري: إذا لم يتم توفيرها، يجب توفير "العنوان" |
الصورة المعروضة على البطاقة صور بنسبة عرض إلى ارتفاع 16:9 وبدرجة دقة 1264x712 |
| العنوان | اختياري - إذا لم يتم توفيرها، يجب توفير الصورة | الاسم المكتوب على البطاقة |
| نص الإجراء | اختياري | النص المعروض على عبارة الحثّ على اتّخاذ إجراء (مثل تسجيل الدخول) |
| العنوان الفرعي | اختياري | الترجمة والشرح الاختياريان على البطاقة |
Kotlin
var SIGN_IN_CARD_ENTITY =
SignInCardEntity.Builder()
.addPosterImage(
Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build()
client.publishUserAccountManagementRequest(
PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
Java
SignInCardEntity SIGN_IN_CARD_ENTITY =
new SignInCardEntity.Builder()
.addPosterImage(
new Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build();
client.publishUserAccountManagementRequest(
new PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
عندما تتلقّى الخدمة الطلب، يتم اتّخاذ الإجراءات التالية في معاملة واحدة:
- تتم إزالة بيانات
UserAccountManagementClusterالحالية من الشريك المطوِّر. - يتم تحليل البيانات من الطلب وتخزينها في مجموعة UserAccountManagementCluster المعدَّلة.
في حال حدوث خطأ، يتم رفض الطلب بالكامل ويتم الحفاظ على الحالة الحالية.
updatePublishStatus
إذا لم يتم نشر أي من المجموعات لأي سبب تجاري داخلي، ننصحك بشدة بتعديل حالة النشر باستخدام واجهة برمجة التطبيقات updatePublishStatus. هذا مهم للأسباب التالية :
- من المهم توفير الحالة في جميع السيناريوهات، حتى عندما يكون المحتوى منشورًا (STATUS == PUBLISHED)، وذلك لملء لوحات البيانات التي تستخدم هذه الحالة الواضحة لنقل حالة التكامل ومقاييسه الأخرى.
- إذا لم يتم نشر أي محتوى ولكن حالة الدمج لم تتوقف (STATUS == NOT_PUBLISHED)، يمكن أن تتجنّب Google إرسال تنبيهات في لوحات بيانات سلامة التطبيق. ويؤكّد هذا الرمز أنّه لم يتم نشر المحتوى بسبب حالة متوقّعة من وجهة نظر مقدّم الخدمة.
- ويساعد المطوّرين في تقديم إحصاءات حول وقت نشر البيانات ووقت عدم نشرها.
- قد تستخدم Google رموز الحالة لتشجيع المستخدم على اتّخاذ إجراءات معيّنة في التطبيق كي يتمكّن من الاطّلاع على محتوى التطبيق أو التغلّب على المشكلة.
في ما يلي قائمة برموز حالة النشر المؤهّلة :
// Content is published
AppEngagePublishStatusCode.PUBLISHED,
// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,
// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,
// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,
// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,
// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,
// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,
// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,
// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER
إذا لم يتم نشر المحتوى لأنّ المستخدم لم يسجّل الدخول، تنصح Google بنشر "بطاقة تسجيل الدخول". إذا تعذّر على مقدّمي الخدمة نشر "بطاقة تسجيل الدخول" لأي سبب، ننصحهم باستخدام واجهة برمجة التطبيقات updatePublishStatus مع رمز الحالة NOT_PUBLISHED_REQUIRES_SIGN_IN.
Kotlin
client.updatePublishStatus(
PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build())
Java
client.updatePublishStatus(
new PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build());
deleteRecommendationClusters
يتم استخدام واجهة برمجة التطبيقات هذه لحذف محتوى "مجموعات الاقتراحات".
Kotlin
client.deleteRecommendationClusters()
Java
client.deleteRecommendationClusters();
عندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من "مجموعات الاقتراحات". في حال حدوث خطأ، يتم رفض الطلب بالكامل والاحتفاظ بالحالة الحالية.
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 لتلقّي طلب نشر المحتوى.
والهدف من عمليات البث هذه هو إعادة تفعيل التطبيق بشكل أساسي وفرض مزامنة البيانات. لم يتم تصميم أغراض البث لإرسالها بشكل متكرر جدًا. لا يتم تفعيلها إلا عندما تحدّد "خدمة التفاعل" أنّ المحتوى قد يكون قديمًا (على سبيل المثال، مضى أسبوع على نشره). بهذه الطريقة، يمكن للمستخدم أن يثق بأنّه سيحصل على تجربة محتوى جديدة، حتى إذا لم يتم تنفيذ التطبيق لفترة طويلة من الوقت.
يجب إعداد 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 SDK.
معلومات الاتصال
يُرجى التواصل مع
engage-developers@google.com إذا كانت لديك أي أسئلة أثناء عملية الدمج. سيردّ عليك فريقنا في أقرب وقت ممكن.
الخطوات التالية
بعد إكمال عملية الربط هذه، إليك الخطوات التالية:
- أرسِل رسالة إلكترونية إلى
engage-developers@google.comوأرفِق بها حِزمة APK المدمَجة الجاهزة للاختبار من قِبل Google. - تُجري Google عملية تحقّق وتراجع داخليًا للتأكّد من أنّ عملية الدمج تعمل على النحو المتوقّع. في حال الحاجة إلى إجراء تغييرات، ستتواصل معك Google لتقديم أي تفاصيل ضرورية.
- عند اكتمال الاختبار وعدم الحاجة إلى إجراء أي تغييرات، ستتواصل معك Google لإعلامك بأنّه يمكنك بدء نشر حِزمة APK المعدَّلة والمدمجة على متجر Google Play.
- بعد أن تؤكّد Google أنّه تم نشر حزمة APK المعدَّلة على متجر Google Play، سيتم نشر الاقتراح والمجموعات وستصبح مرئية للمستخدمين.