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

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

תמיכה במדידת הניראות של מודעות היא דרישה חיונית לזמן ריצה ל-SDK. המטרה של הצעת העיצוב הזו היא להשיג תמיכה במדידה פתוחה ובשירותי מדידה דומים. הפתרונות שמתוארים כאן עשויים להתאים גם ל-Attribution Reporting API. נשמח לקבל משוב על ההצעה הזו.

יכולות

העיצוב הזה נועד לתמוך בערכות 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.
  • הדיווח על שינויים בחשיפה מתרחש לאחר זמן אחזור מינימלי.
  • החשיפה ניתנת למדידה למשך כל מחזור החיים של צפייה במודעה, החל מהחשיפה הראשונה ועד האחרונה.

עיצוב הצעה

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

תהליך בקרה על הניראות.
שליטה בתהליך הניראות.

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

API

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

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

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

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

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

שאלות פתוחות

ניתן לשלוח משוב על הנושאים הבאים:

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