כדי להגביר את ההתעניינות באפליקציה, כדאי להגיע למשתמשים במקומות שבהם הם נמצאים. אפשר לשלב את Engage SDK כדי להציג המלצות מותאמות אישית ותוכן להמשך ישירות למשתמשים בכמה פלטפורמות במכשיר, כמו אוספים, חבילת הבידור וחנות Play. השילוב מוסיף פחות מ-50KB (דחוסים) ל-APK הממוצע, ולוקח למפתחים בערך שבוע להטמיע אותו ברוב האפליקציות. מידע נוסף זמין באתר העסקי שלנו.
המדריך הזה כולל הוראות לשותפי פיתוח בנושא העברת תוכן של רשתות חברתיות לפלטפורמות התוכן של Engage.
תמיכה בקטגוריות ופלטפורמות
הזכאות לפלטפורמות של Engage SDK מבוססת על קטגוריית התוכן של האפליקציה. בטבלה הבאה מפורטות הדרישות שצריך לעמוד בהן כדי להציג מוצרים בפלטפורמות ספציפיות:
| סטטוס | קטגוריית תוכן או תרחיש לדוגמה | פלטפורמות נתמכות |
|---|---|---|
|
יש תמיכה (אפשר להציג בכל הפלטפורמות) |
|
|
| לא נתמך |
|
מיומנויות ב-Android
הצגת הקוד ב-GitHubשילוב של Engage SDK
android skills add engage-sdk-integrationפרטי השילוב
בקטע הבא מפורטים פרטי השילוב.
הסברים על המונחים
אשכולות של המלצות מציגים הצעות בהתאמה אישית משותף פיתוח ספציפי.
ההמלצות מוצגות במבנה הבא:
אשכול המלצות: תצוגה בממשק המשתמש שמכילה קבוצת המלצות מאותו שותף פיתוח.
כל קבוצת המלצות מורכבת מאחד משני סוגי הישויות הבאים :
- PortraitMediaEntity
- SocialPostEntity
השדה PortraitMediaEntity חייב להכיל תמונה אחת לאורך בשביל הפוסט. המטא-נתונים שקשורים לפרופיל ולאינטראקציה הם אופציונליים.
פוסט
- תמונה במצב לאורך וחותמת זמן, או
- תמונה במצב לאורך + תוכן טקסט וחותמת זמן
פרופיל
- דמות, שם או כינוי, תמונה נוספת
אינטראקציות
- ספירה ותיוג בלבד, או
- מספר ורכיב חזותי (סמל)
הישות SocialPostEntity מכילה מטא-נתונים שקשורים לפרופיל, לפוסט ולאינטראקציה.
פרופיל
- דמות, שם או כינוי, טקסט נוסף, תמונה נוספת
פוסט
- טקסט וחותמת זמן, או
- מדיה עשירה (תמונה או כתובת URL עשירה) וחותמת זמן, או
- טקסט ומדיה עשירה (תמונה או כתובת URL עשירה) וחותמת זמן, או
- תצוגה מקדימה של הסרטון (תמונה ממוזערת ומשך זמן) וחותמת זמן
אינטראקציות
- ספירה ותיוג בלבד, או
- מספר וסמל (אייקון)
הכנה
רמת API מינימלית: 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'
}
סיכום
העיצוב מבוסס על הטמעה של שרת מאגד (bound service).
הנתונים שלקוח יכול לפרסם כפופים למגבלות הבאות, בהתאם לסוגי האשכולות השונים:
| סוג האשכול | מגבלות על אשכולות | מספר הישויות המינימלי באשכול | מגבלות מקסימליות על ישויות באשכול |
|---|---|---|---|
| אשכולות של המלצות | עד 7 | לפחות אחד (PortraitMediaEntity או
SocialPostEntity) |
עד 50 (PortraitMediaEntity או SocialPostEntity) |
שלב 1: מסירת נתוני הישות
ב-SDK מוגדרות ישויות שונות שמייצגות כל סוג פריט. ה-SDK תומך בישויות הבאות בקטגוריה "רשתות חברתיות":
PortraitMediaEntitySocialPostEntity
בטבלאות הבאות מפורטים המאפיינים הזמינים והדרישות לכל סוג.
PortraitMediaEntity
| מאפיין | דרישה | תיאור | פורמט |
|---|---|---|---|
| URI של פעולה | חובה בכל הפלטפורמות מלבד Google TV |
קישור עומק לישות באפליקציה של הספק. הערה: אפשר להשתמש בקישורי עומק לצורך שיוך (Attribution). כדאי לעיין בשאלות הנפוצות האלה |
URI |
| PlatformSpecificPlayback | חובה בפלטפורמת Google TV |
קישור עומק לישות באפליקציה של הספק לפלטפורמות כמו Google TV וניידים. |
רשימה של אובייקטים מסוג PlatformSpecificPlayback |
| הסיבה להמלצה | אופציונלי | הסיבה להמלצה על התוכן למשתמש. | אובייקט RecommendationReason |
| סיכום התגובות | אופציונלי | סיכום של התגובות לפוסט. | מחרוזת |
| מטא-נתונים שקשורים לפוסט (חובה) | |||
| תמונות | חובה |
התמונות צריכות להיות ביחס גובה-רוחב לאורך. יכול להיות שבממשק המשתמש תוצג רק תמונה אחת גם אם סיפקתם כמה תמונות. עם זאת, יכול להיות שבממשק המשתמש תהיה אינדיקציה ויזואלית לכך שיש עוד תמונות באפליקציה. אם הפוסט הוא סרטון, הספק צריך לספק תמונה ממוזערת של הסרטון שתוצג כתמונה. |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| תוכן הטקסט | אופציונלי | הטקסט הראשי של פוסט, עדכון וכו'. | מחרוזת (מומלץ עד 140 תווים) |
| חותמת זמן | אופציונלי | השעה שבה הפוסט פורסם. | חותמת זמן של תקופת זמן המערכת באלפיות השנייה |
| קטע וידאו | אופציונלי | האם הפוסט הוא סרטון? | בוליאני |
| משך הסרטון | אופציונלי | משך הסרטון באלפיות השנייה. | ארוך |
| מטא-נתונים שקשורים לפרופיל (אופציונלי) | |||
| שם | חובה | שם הפרופיל, המזהה או הכינוי, למשל "ישראל ישראלי", "@TeamPixel" | מחרוזת(מומלץ עד 25 תווים) |
| דמות | חובה |
תמונת הפרופיל או תמונת הדמות של המשתמש. תמונה ריבועית אחת ביחס 1:1 |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| תמונה נוספת | אופציונלי |
תג פרופיל, למשל תג אימות תמונה ריבועית אחת ביחס 1:1 |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| מטא-נתונים שקשורים לאינטראקציות (אופציונלי) | |||
| מספר כולל | אופציונלי |
מציינים את מספר האינטראקציות, לדוגמה – "3.7 מיליון". הערה: אם צוינו גם Count וגם Count Value, המערכת תשתמש ב-Count. הערה: שותפים צריכים להשתמש ב-Count או ב-CountWithOptionalLabel. |
מחרוזת |
| CountWithOptionalLabel | אופציונלי |
מציינים את מספר האינטראקציות עם תווית אופציונלית, לדוגמה: "3.7 מיליון לייקים". הערה: אם צוינו גם CountWithOptionalLabel וגם Count Value, המערכת תשתמש באחד מהם. הערה: שותפים צריכים להשתמש ב-Count או ב-CountWithOptionalLabel. |
מחרוזת |
| ערך הספירה | אופציונלי | מספר האינטראקציות כערך. הערה: אם האפליקציה לא מטפלת בלוגיקה של אופטימיזציה של מספר גדול לגדלים שונים של תצוגה, צריך לספק את Count Value במקום Count. אם צוינו גם Count וגם Count Value, המערכת תשתמש ב-Count. |
ארוך |
| תווית | אופציונלי | מציינים מהי מטרת התווית של האינטראקציה. לדוגמה: "לייקים". | מחרוזת |
| ויזואלי | אופציונלי |
מציינים את מטרת האינטראקציה. לדוגמה – תמונה שמוצג בה סמל לייקים, אמוג'י. אפשר לספק יותר מתמונה אחת, אבל יכול להיות שלא כולן יוצגו בכל גורמי הצורה. הערה: התמונה חייבת להיות ריבועית (1:1) |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| DisplayTimeWindow (אופציונלי) – הגדרת חלון זמן להצגת תוכן בפלטפורמה | |||
| חותמת הזמן של ההתחלה | אופציונלי |
חותמת הזמן של התקופה שאחריה התוכן אמור להופיע בפלטפורמה. אם המדיניות לא מוגדרת, אפשר להציג תוכן בפלטפורמה. |
חותמת זמן של תקופת זמן המערכת באלפיות השנייה |
| חותמת זמן של סיום | אופציונלי |
חותמת הזמן של התקופה שאחריה התוכן לא מוצג יותר בפלטפורמה. אם המדיניות לא מוגדרת, אפשר להציג תוכן בפלטפורמה. |
חותמת זמן של תקופת זמן המערכת באלפיות השנייה |
SocialPostEntity
| מאפיין | דרישה | תיאור | פורמט |
|---|---|---|---|
| URI של פעולה | חובה |
קישור עומק לישות באפליקציה של הספק. הערה: אפשר להשתמש בקישורי עומק לצורך שיוך (Attribution). כדאי לעיין בשאלות הנפוצות האלה |
URI |
| מזהי URI של PlatformSpecificPlayback | חובה בפלטפורמת Google TV |
קישור עומק לישות באפליקציה של הספק לפלטפורמות כמו Google TV וניידים. |
רשימה של אובייקטים מסוג PlatformSpecificPlayback |
| הסיבה להמלצה | אופציונלי | הסיבה להמלצה על התוכן למשתמש. | אובייקט RecommendationReason |
| סיכום התגובות | אופציונלי | סיכום של התגובות לפוסט. | מחרוזת |
|
מטא-נתונים שקשורים לפוסט (חובה) צריך להוסיף לפחות אחד מהרכיבים הבאים: TextContent, Image או WebContent |
|||
| תמונות | אופציונלי |
התמונות צריכות להיות ביחס גובה-רוחב לאורך. יכול להיות שבממשק המשתמש תוצג רק תמונה אחת גם אם סיפקתם כמה תמונות. עם זאת, יכול להיות שבממשק המשתמש תהיה אינדיקציה ויזואלית לכך שיש עוד תמונות באפליקציה. אם הפוסט הוא סרטון, הספק צריך לספק תמונה ממוזערת של הסרטון שתוצג כתמונה. |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| תוכן הטקסט | אופציונלי | הטקסט הראשי של פוסט, עדכון וכו'. | מחרוזת (מומלץ עד 140 תווים) |
| קטע וידאו (אופציונלי) | |||
| משך | חובה | משך הסרטון באלפיות השנייה. | ארוך |
| תמונה | חובה | תצוגה מקדימה של התמונה של קטע הווידאו. | כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| תצוגה מקדימה של קישור (אופציונלי) | |||
| תצוגה מקדימה של הקישור – כותרת | חובה | טקסט שמציין את הכותרת של תוכן דף האינטרנט | מחרוזת |
| תצוגה מקדימה של הקישור – שם המארח | חובה | טקסט שמציין את הבעלים של דף האינטרנט, למשל "INSIDER" | מחרוזת |
| תצוגה מקדימה של הקישור – תמונה | אופציונלי | תמונה ראשית (Hero) לתוכן מהאינטרנט | כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| חותמת זמן | אופציונלי | השעה שבה הפוסט פורסם. | חותמת זמן של תקופת זמן המערכת באלפיות השנייה |
| מטא-נתונים שקשורים לפרופיל (אופציונלי) | |||
| שם | חובה | שם הפרופיל, המזהה או הכינוי, למשל "ישראל ישראלי", "@TeamPixel". | מחרוזת(מומלץ עד 25 תווים) |
| טקסט נוסף | אופציונלי |
אפשר להשתמש בו כמזהה פרופיל, כינוי או מטא-נתונים נוספים לדוגמה: "@John-Doe", "5M followers", "You might like", "Trending", "5 new posts" |
מחרוזת(מומלץ עד 40 תווים) |
| דמות | חובה |
תמונת הפרופיל או תמונת הדמות של המשתמש. תמונה ריבועית אחת ביחס 1:1 |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| תמונה נוספת | אופציונלי |
תג פרופיל, למשל – תג אימות תמונה ריבועית אחת ביחס 1:1 |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| מטא-נתונים שקשורים לאינטראקציות (אופציונלי) | |||
| מספר כולל | חובה |
מציין את מספר האינטראקציות, לדוגמה – "3.7 מיליון". הערה: שותפים צריכים להשתמש ב-Count או ב-CountWithOptionalLabel. |
מחרוזת |
| CountWithOptionalLabel | חובה |
מציינים את מספר האינטראקציות עם תווית אופציונלית, לדוגמה – "3.7 מיליון לייקים". הערה: שותפים צריכים להשתמש ב-Count או ב-CountWithOptionalLabel. |
מחרוזת |
| תווית |
אופציונלי אם לא מספקים את המאפיין הזה, צריך לספק את המאפיין חזותי. |
מציינים את מטרת האינטראקציה. לדוגמה: "לייקים". | מחרוזת (מומלץ עד 20 תווים לספירה + תווית ביחד) |
| ויזואלי |
אופציונלי אם לא מציינים את המאפיין הזה, צריך לציין את המאפיין Label. |
מציינים את מטרת האינטראקציה. לדוגמה – תמונה שמוצג בה סמל לייקים, אמוג'י. אפשר להוסיף יותר מתמונה אחת, אבל יכול להיות שלא כולן יוצגו בכל גורמי הצורה. תמונה ריבועית אחת ביחס 1:1 |
כדי לקבל הנחיות, כדאי לעיין במפרט לתמונות. |
| DisplayTimeWindow (אופציונלי) – הגדרת חלון זמן להצגת תוכן בפלטפורמה | |||
| חותמת הזמן של ההתחלה | אופציונלי |
חותמת הזמן של התקופה שאחריה התוכן אמור להופיע בפלטפורמה. אם המדיניות לא מוגדרת, אפשר להציג תוכן בפלטפורמה. |
חותמת זמן של תקופת זמן המערכת באלפיות השנייה |
| חותמת זמן של סיום | אופציונלי |
חותמת הזמן של התקופה שאחריה התוכן לא מוצג יותר בפלטפורמה. אם המדיניות לא מוגדרת, אפשר להציג תוכן בפלטפורמה. |
חותמת זמן של תקופת זמן המערכת באלפיות השנייה |
מפרט לתמונות
התמונות צריכות להתארח ברשתות CDN ציבוריות כדי ש-Google תוכל לגשת אליהן.
פורמט קובץ
PNG, JPG, GIF סטטי, WebP
גודל קובץ מקסימלי
5,120KB
המלצות נוספות
- האזור הבטוח בתמונה: צריך למקם את התוכן החשוב במרכז התמונה, והוא צריך להשתרע על פני 80% מהשטח שלה.
- כדאי להשתמש ברקע שקוף כדי שהתמונה תוצג כמו שצריך בהגדרות של עיצוב כהה ובהיר.
שלב 2: ציון נתונים של אוסף ההמשכים
מומלץ להפעיל את משימת פרסום התוכן ברקע (לדוגמה, באמצעות WorkManager) ולתזמן אותה באופן קבוע או על בסיס אירוע (לדוגמה, בכל פעם שהמשתמש פותח את האפליקציה או כשהמשתמש מתחיל לעקוב אחרי חשבון חדש).
AppEngageSocialClient אחראי לפרסום של אוספים חברתיים.
אלה ממשקי ה-API לפרסום אשכולות בלקוח:
isServiceAvailablepublishRecommendationClusterspublishUserAccountManagementRequestupdatePublishStatusdeleteRecommendationsClustersdeleteUserManagementClusterdeleteClusters
isServiceAvailable
ה-API הזה משמש כדי לבדוק אם השירות זמין לשילוב ואם אפשר להציג את התוכן במכשיר.
ל-Engage SDK מגרסה 1.6.0 ואילך (מומלץ)
מיומנויות ב-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 API מקבל אובייקט בקשה, ServiceAvailabilityRequest, שמכיל את סוגי האשכולות שצריך לבדוק את זמינות השירות שלהם. בטבלה הבאה מפורטים ערכי ה-enum של 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
ה-API הזה משמש לפרסום רשימה של אובייקטים מסוג RecommendationCluster.
לאובייקט RecommendationCluster יכולים להיות המאפיינים הבאים:
| מאפיין | דרישה | תיאור |
|---|---|---|
| רשימה של SocialPostEntity או PortraitMediaEntity | חובה | רשימת ישויות שמרכיבות את ההמלצות בקבוצת ההמלצות הזו. הישויות באשכול אחד חייבות להיות מאותו סוג. |
| כותרת | חובה | הכותרת של אשכול ההמלצות (לדוגמה, החדשות האחרונות מהחברים). גודל הטקסט המומלץ: פחות מ-25 תווים (טקסט ארוך מדי עלול להופיע עם שלוש נקודות) |
| כותרת משנה | אופציונלי | כותרת המשנה של קבוצת ההמלצות. |
| URI של פעולה | אופציונלי |
קישור העומק לדף באפליקציית השותף שבו המשתמשים יכולים לראות את הרשימה המלאה של ההמלצות. הערה: אפשר להשתמש בקישורי עומק לצורך שיוך (Attribution). כדאי לעיין בשאלות הנפוצות האלה |
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
ה-API הזה משמש לפרסום כרטיס כניסה . פעולת הכניסה מפנה את המשתמשים לדף הכניסה של האפליקציה כדי שהאפליקציה תוכל לפרסם תוכן (או לספק תוכן מותאם אישית יותר)
המטא-נתונים הבאים הם חלק מכרטיס הכניסה:
| מאפיין | דרישה | תיאור |
|---|---|---|
| URI של פעולה | חובה | קישור עומק לפעולה (למשל, מעבר לדף הכניסה לאפליקציה) |
| תמונה | אופציונלי – אם לא מציינים את המאפיין הזה, צריך לציין את מאפיין שם הפריט |
התמונה שמוצגת בכרטיס תמונות ביחס גובה-רוחב של 16:9 וברזולוציה של 1,264x712 |
| כותרת | אופציונלי – אם לא מספקים את המאפיין הזה, צריך לספק את מאפיין התמונה | השם שמופיע בכרטיס |
| טקסט פעולה | אופציונלי | הטקסט שמוצג ב-CTA (למשל, "כניסה") |
| כותרת משנה | אופציונלי | כותרת משנה אופציונלית בכרטיס |
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
אם מסיבה עסקית פנימית כלשהי אף אחד מהאשכולות לא פורסם, אנחנו ממליצים מאוד לעדכן את סטטוס הפרסום באמצעות ה-API 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 תמליץ לפרסם את כרטיס הכניסה. אם מסיבה כלשהי הספקים לא יכולים לפרסם את כרטיס הכניסה, מומלץ להפעיל את ה-API 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
ה-API הזה משמש למחיקת התוכן של אשכולות ההמלצות.
Kotlin
client.deleteRecommendationsClusters()
Java
client.deleteRecommendationsClusters();
כשהשירות מקבל את הבקשה, הוא מסיר את הנתונים הקיימים מאשכולות ההמלצות. אם יש שגיאה, כל הבקשה נדחית והמצב הקיים נשמר.
deleteUserManagementCluster
ה-API הזה משמש למחיקת התוכן של אשכול UserAccountManagement.
Kotlin
client.deleteUserManagementCluster()
Java
client.deleteUserManagementCluster();
כשהשירות מקבל את הבקשה, הוא מסיר את הנתונים הקיימים מהאשכול UserAccountManagement. אם יש שגיאה, כל הבקשה נדחית והמצב הקיים נשמר.
deleteClusters
ה-API הזה משמש למחיקת התוכן של סוג אשכול נתון.
Kotlin
client.deleteClusters(
DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build())
Java
client.deleteClusters(
new DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build());
כשהשירות מקבל את הבקשה, הוא מסיר את הנתונים הקיימים מכל האשכולות שתואמים לסוגי האשכולות שצוינו. הלקוחות יכולים לבחור להעביר סוג אחד או כמה סוגים של אשכולות. אם יש שגיאה, כל הבקשה נדחית והמצב הקיים נשמר.
טיפול בשגיאות
מומלץ מאוד להאזין לתוצאת המשימה מממשקי ה-API לפרסום, כדי שתוכלו לבצע פעולת המשך לשחזור ולשליחה מחדש של משימה שהושלמה.
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: טיפול בכוונות שידור
בנוסף לביצוע קריאות ל-API לפרסום תוכן באמצעות משימה, צריך גם להגדיר 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כשמקבלים את ה-intent הזה.
תהליך עבודה של שילוב
למדריך מפורט על אימות השילוב אחרי שהוא הושלם, ראו תהליך העבודה של מפתחים לשילוב עם Engage.
שאלות נפוצות
יצירת קשר
אם יש לכם שאלות במהלך תהליך השילוב, אתם יכולים לפנות אל engage-developers@google.com. הצוות שלנו ישיב בהקדם האפשרי.
השלבים הבאים
אחרי שתשלימו את השילוב, אלה השלבים הבאים:
- שולחים אימייל לכתובת
engage-developers@google.comומצרפים את קובץ ה-APK המשולב שמוכן לבדיקה על ידי Google. - Google מבצעת אימות ובדיקות פנימיות כדי לוודא שהשילוב פועל כצפוי. אם צריך לבצע שינויים, Google תפנה אליכם עם הפרטים הנדרשים.
- כשהבדיקה מסתיימת ולא נדרשים שינויים, Google יוצרת איתכם קשר כדי להודיע לכם שאתם יכולים להתחיל לפרסם את ה-APK המעודכן והמשולב בחנות Play.
- אחרי ש-Google תאשר שקובץ ה-APK המעודכן פורסם בחנות Play, אשכולות ההמלצות יפורסמו ויוצגו למשתמשים.