הצעה לעיצוב ניראות בזמן ריצה ל-SDK

לערכות SDK להצגת מודעות בזמן הריצה ל-SDK אין גישה להיררכיית התצוגה של בעל האפליקציה. במקום זאת, ל-SDK בסביבת זמן הריצה יש תצוגות משלו. ערכת ה-SDK לא יכולה להשתמש באותם ממשקי API של View שבהם היא משתמשת מחוץ לזמן הריצה של ה-SDK כדי לקבוע אם המודעה גלויה למשתמש, כי תצוגת המודעה לא מצורפת לחלון של האפליקציה. זה כולל ממשקי API של Android View כמו getLocationOnScreen,‏ getLocationInWindow או getVisibility, שלא מחזירים את הערכים הצפויים.

תמיכה במדידת הניראות של מודעות היא דרישה מרכזית של זמן הריצה ל-SDK. הצעת העיצוב הזו נועדה להשיג תמיכה ב-Open Measurement ובשירותי מדידה דומים. הפתרונות שמוצגים כאן עשויים להתאים גם ל-Attribution Reporting APIs.

יכולות

העיצוב הזה נועד לתמוך ב-SDK של מודעות או בשותפי מדידה כדי לחשב את נתוני הניראות הבאים (השמות הם זמניים ועשויים להשתנות):

איור שמראה איך הרכיבים של זמן הריצה ל-SDK פועלים יחד כדי למדוד את מידת החשיפה
סקירה כללית על זמן הריצה ל-SDK לצפייה.
  • viewport [Rect]: מייצג את הגיאומטריה של מסך המכשיר או של חלון האפליקציה, בהתאם ליכולות של הפלטפורמה.
  • uiContainerGeometry [Rect]: הגיאומטריה של SandboxedSdkView שמוצג.
  • alpha [float]: רמת השקיפות של SandboxedSdkView שמוצג.
  • onScreenGeometry [Rect]: קבוצת המשנה של uiContainerGeometry שלא נחתכה על ידי תצוגות האב, עד viewport כולל).
  • occludedGeometry [Rect]: החלקים ב-onScreenGeometry שמוסתרים על ידי תצוגות בהיררכיה של האפליקציה. כולל Rect לכל הסתרה, שמתאים לאפס, לאחת או לכמה תצוגות של האפליקציה שחופפות ל-SandboxedSdkView onScreenGeometry

דרישות

  • הערכים של uiContainerGeometry,‏ onScreenGeometry ו-occludedGeometry מוצגים במרחב הקואורדינטות של viewport.
  • הדיווח על שינויים בנראות מתבצע עם זמן אחזור מינימלי.
  • אפשר למדוד את הנראות לאורך כל מחזור החיים של צפייה במודעה, מההופעה הראשונה שלה ועד האחרונה.

הצעה לעיצוב

ההצעה הזו מבוססת על האופן שבו הצגת ממשק המשתמש פועלת באמצעות ספריות ממשק המשתמש של הלקוח והספק. נרחיב את ספריות ממשק המשתמש כדי לאפשר ל-SDK לרשום צופה אחד או יותר של סשן ממשק המשתמש. המשקיף יקבל מידע על מידת החשיפה בכל פעם שיתגלו אירועים רלוונטיים שמשנים את סוגי הנתונים בקטע יכולות. ערכות SDK למדידה בסביבת זמן הריצה של SDK (הטמעות של OMID ושל MRAID) יכולות לצרף את האובייקט הזה למעקב אחר הפעילות בממשק המשתמש, כדי שהמידע הזה יישלח אליהן ישירות. שותפי מדידה יכולים לשלב מידע שהתקבל מספריות של ממשקי משתמש עם נתונים על תוכן שכבר זמין (למשל, כשמשתמשים בסקריפטים למדידה שמוזרקים לנכס הקריאייטיב של המודעה) כדי ליצור אירועי JavaScript של נראות.

בקרת זרימה לניראות.
שליטה בזרימת הנתונים של הניראות.

ספריית הלקוח מאזינה לשינויים בממשק המשתמש של המודעות באמצעות מאזיני אירועים כמו ViewTreeObserver. בכל פעם שספריית הלקוח מזהה שינוי בממשק המשתמש של המודעה שעשוי להשפיע על מדידת הנראות, היא בודקת מתי נשלחה ההתראה האחרונה למאזין. אם העדכון האחרון גדול יותר מהשהייה המותרת (ניתן להגדרה על ידי ה-SDK, עד למינימום של 200 אלפיות השנייה בנייד), נוצר אובייקט AdContainerInfo חדש ונשלחת התראה לצופה. מודל מבוסס-אירועים הזה טוב יותר לבריאות המערכת מאשר הסקרים שרוב ההטמעות של OMID ב-Android מבצעות היום.

API

הפריטים הבאים יתווספו לספרייה privacysandbox.ui.core:

  • SessionObserver: בדרך כלל מיושם על ידי ה-SDK למדידה, שמצורף להפעלה שמוחזרת על ידי ה-SDK דרך privacysandbox.ui. בנוסף, הממשק הזה יאפשר ל-SDK למדידה להצטרף לקטגוריות מסוימות של אותות ניראות. כתוצאה מכך, ספריית הלקוח של ממשק המשתמש יכולה לאסוף רק אותות שהמשתמש המתבונן מתעניין בהם, וזה טוב יותר לבריאות המערכת באופן כללי.
  • registerObserver(): הוספה לכיתה Session. ה-method הזה מאפשר לכל מי שיש לו גישה לסשן לרשום משתמש כמשקיף. אם הצופה נרשם אחרי פתיחת סשן בממשק המשתמש, הוא יקבל את AdContainerInfo ששמור במטמון באופן מיידי. אם הם נרשמו לפני פתיחת הסשן, הם יישלחו AdContainerInfo כשהסשן ייפתח.
  • AdContainerInfo: מחלקה עם פונקציות getter שמאפשרת לאובייקט הצופה לקבל מידע לקריאה בלבד על קונטיינר המודעות עבור סוגי הנתונים שמפורטים בקטע יכולות שלמעלה. הערכים שמוחזרים מהפונקציות האלה יהיו זהים, ככל האפשר, לערכים שמוחזרים מהפונקציות הקיימות ב-View ובמחלקות המשנה שלו. אם מאגר המודעות נוצר באמצעות Jetpack Compose, המאפיינים הסמנטיים של המאגר נחשפים. אפשר להשתמש במחלקה הזו כדי לחשב אירועי MRAID ו-OMID שקשורים ליכולת הצפייה.
  • SessionObserverotifyAdContainerChanged(): משמש להודעה לצופה בכל פעם שמשתנה מידת החשיפה. היא מעבירה אובייקט AdContainerInfo. הפונקציה הזו מופעלת בכל פעם שמזוהים אירועים שמשפיעים על סוגי הנתונים שמפורטים בקטע Capabilities. הערה: יכול להיות שהשיטה הזו תיקרא בנוסף לשיטות ב-Session. לדוגמה, הפונקציה Session.notifyResized() נקראת כדי לבקש מ-SDK לשנות את גודל המודעה, והפונקציה SessionObserver.notifyAdContainerChanged() נקראת גם היא כשזה קורה.
  • SessionObserverotifySessionClosed(): מודיע לאובזרבר שהסשן נסגר.

שיפורים עתידיים

אם האפליקציה נפגעה, אפשר לשנות כל קוד שפועל בתהליך של האפליקציה, כולל הקוד מהספרייה privacysandbox.ui.client. לכן, כל לוגיקה של איסוף אותות שפועלת בתהליך של האפליקציה חשופה לשינויים לא מורשים על ידי קוד האפליקציה. הדבר נכון גם לגבי קוד SDK שנפרס לפני ההשקה של ארגז החול לפרטיות, שפועל בתהליך של האפליקציה. לכן, איסוף האותות על ידי ספריית ממשק המשתמש לא מחמיר את מצב האבטחה.

בנוסף, קוד בזמן הריצה של ה-SDK יכול להשתמש בממשק API של הפלטפורמה שנקרא setTrustedPresentationCallback, שיכול לספק לו ערבויות חזקות יותר מהמסגרת לגבי הצגת ממשק המשתמש של המודעה. setTrustedPresentationCallback פועל ברמת ה-Surface, ויכול לעזור ליצור טענות לגבי ה-Surface שמכיל את ממשק המשתמש של המודעה על ידי ציון ספי מינימום להצגה, כמו אחוז הפיקסלים הגלויים, הזמן על המסך או קנה המידה. אפשר להשוות את הנתונים האלה לנתוני הנראות שמופיעים בספריית הלקוח של ממשק המשתמש, כפי שמוסבר למעלה. מכיוון שהנתונים שמסופקים על ידי מסגרת הם מהימנים יותר, אפשר לבטל אירועים מספריית ממשק המשתמש שהנתונים שלהם לא תואמים לנתונים מהמסגרת. לדוגמה, אם הפונקציה listener שסופקה ל-setTrustedPresentationCallback מופעלת עם התראה שלא מוצגים פיקסלים של ממשק המשתמש של המודעה במסך, וספריית ממשק המשתמש של הלקוח מציגה מספר פיקסלים שאינו אפס במסך, אפשר להתעלם מהנתונים של האחרונה.

שאלות פתוחות

  1. אילו אותות של נראות מעניינים אותך ולא מוזכרים בהסבר הזה?
  2. ההצעה הנוכחית היא לעדכן את נתוני הנראות בתדירות של לפחות כל 200 מילישניות, בתנאי שיש שינוי רלוונטי בממשק המשתמש. האם התדירות הזו מקובלת עליך? אם לא, באיזו תדירות תרצה לקבל את העדכונים?
  3. האם אתם מעדיפים לנתח את המידע מ-setTrustedPresentationCallback בעצמכם, או שהספרייה של ממשק המשתמש של הספק תסיר נתונים מהספרייה של ממשק המשתמש של הלקוח, אם הם לא תואמים לנתונים של setTrustedPresentationCallback?
  4. איך אתם משתמשים באותות ניראות? כדי לעזור לנו להבין את תרחישי השימוש שלך, אפשר לשלוח משוב עם תשובות לשאלות האלה.