Propozycja projektu widoczności środowiska wykonawczego SDK

Pakiety SDK do wyświetlania reklam w środowisku wykonawczym SDK nie mają dostępu do hierarchii widoków wydawcy. Zamiast tego platformy SDK w czasie wykonywania mają własne widoki. Pakiet SDK nie może używać tych samych interfejsów View, których używa się poza środowiskiem uruchomieniowym pakietu SDK, aby określić, czy reklama jest widoczna dla użytkownika, ponieważ widok reklamy nie jest dołączony do okna aplikacji. Dotyczy to interfejsów View API na Androida, takich jak getLocationOnScreen, getLocationInWindowgetVisibility, które nie zwracają oczekiwanych wartości.

Obsługa pomiaru widoczności reklam jest podstawowym wymaganiem czasu działania pakietu SDK. Celem tego projektu jest zapewnienie obsługi Open Measurement i podobnych usług pomiarowych. Rozwiązania opisane w tym artykule mogą być też stosowane w przypadku interfejsów Attribution Reporting API.

Możliwości

Ta konstrukcja ma na celu umożliwienie pakietom SDK reklam lub partnerom ds. pomiarów obliczania tych danych widoczności (nazwy są wstępne i mogą ulec zmianie):

Ilustracja pokazująca, jak komponenty widoczności w czasie działania pakietu SDK współdziałają
Informacje na temat widoczności w środowisku wykonawczym pakietu SDK
  • viewport [Rect]: reprezentuje geometrię ekranu urządzenia lub okna aplikacji w zależności od możliwości platformy.
  • uiContainerGeometry [Rect]: geometria renderowanego obiektu SandboxedSdkView.
  • alpha [float]: krycie renderowanego SandboxedSdkView.
  • onScreenGeometry [Rect]: podzbiór widoków uiContainerGeometry, który nie jest ograniczony przez widoki nadrzędne (do poziomu viewport włącznie).
  • occludedGeometry [Rect]: części onScreenGeometry, które są zasłonięte przez widoki w hierarchii aplikacji. Zawiera Rect dla każdej kolizji, odpowiadającej 0, 1 lub większej liczbie wyświetleń aplikacji, które nakładają się na SandboxedSdkView onScreenGeometry.

Wymagania

  • Wartości uiContainerGeometry, onScreenGeometryoccludedGeometry są wyrażane w przestrzeni współrzędnych viewport.
  • Raportowanie zmian widoczności odbywa się z minimalnym opóźnieniem.
  • Widoczność można mierzyć przez cały czas wyświetlania reklamy, od jej pierwszego do ostatniego wyświetlenia.

Propozycja projektu

Ta propozycja opiera się na sposobie działania prezentacji interfejsu użytkownika przy użyciu bibliotek interfejsu użytkownika klienta i dostawcy. Rozszerzymy biblioteki interfejsu użytkownika, aby umożliwić pakietowi SDK rejestrowanie co najmniej 1 obserwatora sesji interfejsu użytkownika. Obserwator otrzyma informacje o widoczności, gdy zostaną wykryte odpowiednie zdarzenia, które modyfikują typy danych w sekcji capabilities. Pakiety SDK do pomiarów w czasie działania pakietu SDK (implementacje OMIDMRAID) mogą dołączać tego obserwatora do sesji interfejsu użytkownika, aby informacje te mogły być wysyłane bezpośrednio do tych pakietów. Partnerzy ds. pomiarów mogą łączyć informacje uzyskane z bibliotek interfejsu użytkownika z danymi o dostępnym już wcześniej treści (np. przy użyciu skryptów pomiarowych wstrzykniętych do kreacji reklamy), aby generować zdarzenia widoczności oparte na JavaScript.

kontrolować przepływ danych w celu zapewnienia widoczności;
Kontrola przepływu w celu zapewnienia widoczności.

Biblioteka klienta nasłuchuje zmian w interfejsie reklamy za pomocą detektorów zdarzeń, takich jak ViewTreeObserver. Gdy stwierdzi, że interfejs reklamy zmienił się w sposób, który może mieć wpływ na pomiar widoczności, sprawdza, kiedy zostało wysłane ostatnie powiadomienie do obserwatora. Jeśli czas ostatniej aktualizacji przekracza dozwoloną wartość opóźnienia (można ją skonfigurować w pakiecie SDK, maksymalnie do 200 ms na urządzeniach mobilnych), tworzony jest nowy obiekt AdContainerInfo, a obserwator otrzymuje powiadomienie. Ten model oparty na zdarzeniach jest lepszy dla stanu systemu niż metoda pollingu stosowana obecnie przez większość implementacji OMID na Androidzie.

Interfejs API

Do biblioteki privacysandbox.ui.core zostanie dodane:

  • SessionObserver: zazwyczaj implementowany przez pakiet SDK do pomiarów, dołączany do sesji zwracanej przez pakiet SDK za pomocą interfejsu privacysandbox.ui. Ten interfejs umożliwi też pomiarowi SDK subskrybowanie określonych kategorii sygnałów widoczności. Dzięki temu biblioteka klienta UI może zbierać tylko sygnały, które są interesujące dla obserwatora, co jest korzystne dla ogólnego stanu systemu.
  • registerObserver(): ta metoda została dodana do klasy Session i umożliwia zarejestrowanie obserwatora każdej osobie mającej dostęp do sesji. Jeśli obserwator zostanie zarejestrowany po otwarciu sesji interfejsu użytkownika, natychmiast zostanie do niego wysłana pamięć podręczna AdContainerInfo. Jeśli zostały zarejestrowane przed rozpoczęciem sesji, zostaną wysłane AdContainerInfo po rozpoczęciu sesji.
  • AdContainerInfo: klasa z metodami gettera, która umożliwia obserwatorowi uzyskiwanie informacji o kontenerze reklamy tylko do odczytu w przypadku typów danych wymienionych w sekcji możliwości powyżej. Wartości zwracane przez te metody dostępu będą, w miarę możliwości, odpowiadać wartościom zwracanym przez metody zwracające obiekty Parcelable w klasie View i jej podklasach. Jeśli kontener reklamy został utworzony za pomocą Jetpack Compose, udostępnia on właściwości semantyczne kontenera. Tej klasy można używać do obliczania zdarzeń MRAID i OMID związanych z widocznością.
  • SessionObserverotifyAdContainerChanged(): służy do powiadamiania obserwatora za każdym razem, gdy widoczność się zmienia. Przekazuje obiekt AdContainerInfo. Jest on wywoływany, gdy wykryto zdarzenia, które wpływają na typy danych wymienione w sekcji „Możliwości”. Uwaga: ta metoda może być wywoływana oprócz metod onSession. Na przykład funkcja Session.notifyResized() jest wywoływana, aby poprosić pakiet SDK o zmiana rozmiaru reklamy, a w tym celu jest też wywoływana funkcja SessionObserver.notifyAdContainerChanged().
  • SessionObserverotifySessionClosed(): informuje obserwatora o zamknięciu sesji.

Ulepszenia w przyszłości

W przypadku aplikacji z naruszeniem bezpieczeństwa można zmodyfikować dowolny kod działający w procesie aplikacji, w tym kod z biblioteki privacysandbox.ui.client. Dlatego każda logika zbierania sygnałów, która działa w procesie aplikacji, jest podatna na manipulację przez kod aplikacji. Dotyczy to również kodu pakietu SDK wdrożonego przed udostępnieniem Piaskownicy prywatności, który działa w ramach procesu aplikacji. W konsekwencji zbieranie sygnałów przez bibliotekę UI nie pogarsza sytuacji pod względem bezpieczeństwa.

Dodatkowo kod w środowisku wykonawczym pakietu SDK może korzystać z interfejsu API platformy o nazwie setTrustedPresentationCallback, który może zapewnić większą gwarancję zgodności z ramami dotyczącą wyświetlania interfejsu użytkownika reklamy. setTrustedPresentationCallback działa na poziomie powierzchni i może pomóc w formułowaniu twierdzeń dotyczących powierzchni zawierającej interfejs reklamy przez określenie minimalnych progów wyświetlania, takich jak odsetek widocznych pikseli, czas na ekranie lub skala. Dane te można porównać z danymi o widoczności udostępnianymi przez bibliotekę klienta w interfejsie użytkownika, o której mowa powyżej. Dane udostępniane przez framework są bardziej wiarygodne, dlatego wszystkie zdarzenia z biblioteki interfejsu użytkownika, których dane nie są zgodne z danymi z frameworku, mogą zostać odrzucone. Jeśli na przykład wywołany przez setTrustedPresentationCallback listener zostanie wywołany z powiadomieniem, że na ekranie nie wyświetlają się żadne piksele interfejsu reklamy, a biblioteka interfejsu klienta pokazuje niezerową liczbę pikseli na ekranie, dane z tej drugiej mogą zostać odrzucone.

Pytania otwarte

  1. Jakie sygnały widoczności Cię interesują, a nie zostały omówione w tym artykule?
  2. Obecna propozycja zakłada aktualizowanie widoczności nie rzadziej niż co 200 ms, pod warunkiem że nastąpiła odpowiednia zmiana w interfejsie. Czy ta częstotliwość jest dla Ciebie akceptowalna? Jeśli nie, jak często chcesz otrzymywać te informacje?
  3. Czy wolisz analizować informacje z setTrustedPresentationCallback samodzielnie, czy chcesz, aby biblioteka interfejsu użytkownika dostawcy usuwała dane z biblioteki interfejsu użytkownika klienta, gdy nie pasują one do danych setTrustedPresentationCallback?
  4. Jak używasz sygnałów o widoczności? Pomóż nam zrozumieć przypadki użycia, przesyłając opinię z odpowiedziami na te pytania.