Środowisko wykonawcze SDK umożliwia uruchamianie pakietów SDK do wyświetlania reklam w sandboksie, co uniemożliwia im dostęp do hierarchii widoków wydawcy. Do wyświetlania reklam
platforma udostępnia interfejs API SandboxedSdkProvider.getView
pakietowi SDK, aby umożliwić uzyskanie reklamy
i pakuje go jako element SurfacePackage
, który zostanie przesłany w IPC
(komunikację między procesami) do aplikacji klienckiej. Ma to kilka wad, które opisujemy poniżej. Dokument ten przedstawia wówczas proponowaną
Biblioteka Jetpack, którą stworzyliśmy z myślą o tych wyzwaniach.
Uzasadnienie rozszerzania interfejsów API platformy
Interfejsy API platformy zostały zaprojektowane z myślą o elastyczności i nie muszą tworzyć między prezentacją UI a aplikacją i pakietem SDK. Ta strona kanały wykonuje te działania:
- Umożliwia pakietowi SDK zarządzanie wyświetleniami reklamy w trakcie jej trwania i określanie, co dzieje się z interfejsem reklamy po jej utworzeniu przez pakiet SDK.
- Odłącza tworzenie widoku od wiązania treści. Korzystanie z kanału dodatkowego pozwala pakietowi SDK zwrócić aplikacji obiekt odpowiadający żądaniu reklamy (treści), który może zostać powiązany z kontenerem reklamy, gdy aplikacja uzna to za stosowne.
- Abstrahuje podstawowe konstrukcje platformy używane do wyświetlania interfejsu w różnych procesach. (Platforma obecnie używa
SurfaceControlViewhost
i na jego podstawie generujeSurfacePackage
). - Umożliwia pakietom SDK do wyświetlania reklam w czasie działania pakietu SDK automatyczne otrzymywanie powiadomień o zmianach w interfejsie kontenera reklamy. Jeśli wydawca zmieni układ kontenera reklamy, pakiet SDK pozostaje nieświadomy tych zmian, chyba że tag wydawca jednoznacznie wywołuje interfejs API, aby go powiadomić.
- Synchronizuje zmiany rozmiaru interfejsu reklamy i pojemnika reklamy bez widocznych dla użytkownika zakłóceń.
- automatycznie zarządza zgodnością wsteczną. Interfejs
SurfacePackage
jest niedostępny w przypadku poziomu interfejsu API niższego niż 30. Ponadto na urządzeniach, na których nie ma środowiska wykonawczego pakietu SDK, a pakiet SDK jest lokalny dla procesu wydawcy, tworzenieSurfacePackage
dla reklamy jest nieefektywne, ponieważ wyświetlenie można uzyskać bezpośrednio z pakietu SDK. Kanał boczny pozwala oddzielić tę złożoność od pakietu SDK i aplikacji w kodzie programisty. - Umożliwia płynną integrację interfejsu reklamy z komponowanymi komponentami. Deweloperzy Jetpack Compose, którzy nie korzystają z widoków, mogą nadal hostować interfejs użytkownika wygenerowany przez dewelopera pakietu SDK, który nadal korzysta z widoków.
Biblioteki interfejsu
Biblioteki UI pozwalają odejść od złożoności opisanych powyżej i zapewniają kanału bocznego, za pomocą którego wydawca i pakiet SDK mogą pokazać interfejs użytkownika w różnych procesach. aktualizowany w miarę interakcji użytkownika z urządzeniem oraz z urządzeniem.
Dostępne są 3 biblioteki interfejsu: core, client i provider. Biblioteka podstawowa udostępnia interfejsy używane przez biblioteki klienta i dostawcy. Dostawca interfejsu użytkownika (zwykle pakiet SDK) zależy od biblioteki dostawcy, a użytkownik interfejsu użytkownika (zwykle wydawca) zależy od biblioteki klienta. Klient i biblioteki dostawców stanowią kanał boczny wymagany do tworzenia utrzymywania sesji interfejsu użytkownika.
Interfejsy API
Prezentacja interfejsów API środowiska wykonawczego SDK:
SandboxedUiAdapter
: utworzony przez pakiet SDK sposób uzyskiwania treści do wyświetlania w interfejsie wydawcy.
SandboxedSdkView
: utworzony przez wydawcę kontener zawierający treści uzyskane za pomocą SandboxedUiAdapter
.
Session
: utworzone przez pakiet SDK w odpowiedzi na
SandboxedUiAdapter.openSession()
Reprezentuje jedną sesję interfejsu użytkownika. . W ten sposób
koniec tunelu komunikacyjnego między pakietem SDK a wydawcą;
otrzymuje powiadomienia o zmianach w SandboxedSdkView
, takich jak okno
odłączenia, zmiany rozmiaru lub zmiany konfiguracji.
SessionClient
: utworzony przez bibliotekę klienta, stanowi koniec wydawcy tunelu komunikacyjnego między pakietem SDK a wydawcą.
SandboxedSdkUiSessionStateChangedListener
: utworzone przez wydawcę. Listener dla zmian stanu sesji interfejsu użytkownika powiązanej z SandboxedSdkView
.
Więcej informacji o tych interfejsach API znajdziesz w dokumentacji privacysandbox-ui.
Sterowanie przepływem
Poniższe diagramy przedstawiają interakcję między interfejsem klienta i dostawcy i biblioteki w różnych sytuacjach:
Poprzedni diagram pokazuje, jak wydawca może utworzyć SandboxedSdkView
automatycznie lub za pomocą kodu XML, i dołączaj go do pliku SdkSandboxUiAdapter
.
uzyskanych z pakietu SDK za pomocą interfejsu API zdefiniowanego przez SDK. Aby obserwować wszystkie zmiany stanu interfejsu użytkownika, wydawca powinien dodać SandboxedSdkUiSessionStateChangedListener
do SandboxedSdkView
przed dołączeniem SdkSandboxUiAdapter
.
Ten diagram pokazuje, jak aktywność wydawcy obsługuje zmiany konfiguracji
biblioteka klienta przekazuje zmianę konfiguracji do SDK,
aby mogli odpowiednio zaktualizować interfejs. Na przykład:
gdy użytkownik obraca urządzenie, a wydawca deklaruje obsługę.
przez zmiany konfiguracji –
przez ustawienie
android:configChanges=["orientation"]
Schemat pokazujący, jak pakiet SDK może zażądać zmiany w kontenerze reklamy za pomocą
SessionClient
. Ten interfejs API jest uruchamiany, gdy pakiet SDK chce zmienić rozmiar reklamy, a wydawca musi zmienić rozmiar kontenera reklamy, aby dopasować go do nowych wymiarów. Może się to zdarzyć w odpowiedzi na interakcje użytkownika, na przykład
mraid.resize()
Ten diagram pokazuje, jak sesja jest zamykana po odłączeniu interfejsu SandboxedSdkView
bezpośrednio w oknie. Sesję można też zamknąć w dowolnym momencie (np. gdy użytkownik utraci połączenie z internetem) za pomocą wywołania pakietu SDK:SessionClient.onSessionError()
.
Kolejność Z
Biblioteka UI klienta używa wewnętrznie interfejsu SurfaceView
do hostowania interfejsu użytkownika pakietu SDK.
SurfaceView
może użyć kolejności Z, by wyświetlić swój interfejs na górze strony wydawcy
lub poniżej niego. Jest to kontrolowane przez metodę SandboxedSdkView.orderProviderUiAboveClientUi()
, która przyjmuje wartość logiczną setOnTop
.
Gdy setOnTop
= true
, wszystkie android.view.MotionEvent
w grupie SandboxedSdkView
są wysyłane do pakietu SDK. Gdy false
, są one wysyłane do wydawcy. Domyślnie zdarzenia związane z ruchu są wysyłane do pakietu SDK.
Wydawcy zwykle nie muszą zmieniać domyślnej kolejności wyświetleń reklam w kolejności Z. Jeśli jednak wyświetlasz UI zasłaniający reklamę, np. menu, w tagu Kolejność nakładania elementów powinna być tymczasowo odwrócona od wartości domyślnej i przywrócona, gdy element interfejsu zostanie zamknięty. Sprawdzamy, jak zautomatyzować ten proces w bibliotece interfejsu klienta.
Przewijanie
Jeśli interfejs reklamy jest w porządku Z nad oknem wydawcy, MotionEvents
z poziomu
są wysyłane do pakietu SDK. Gesty przewijania i przesuwania inicjowane w interfejsie reklamy są traktowane w szczególny sposób:
- Gesty przewijania w pionie i przesuwania są wysyłane do kontenera. Zapewnia to dobre wrażenia użytkownika, gdy kontener wydawcy, w którym znajduje się interfejs reklamy, można przewijać w poziomie. Nie wymaga to żadnych dodatkowych czynności pakiet SDK lub wydawca.
- Gesty przewijania poziomego i przesuwania są wysyłane do pakietu SDK i obsługiwane przez niego. Ten zapewnia wygodę korzystania, gdy interfejs reklamy można przewijać w poziomie (np. karuzela reklam).
Przewodnik po implementacji
Pakiet SDK powinien zawierać:
SandboxedUiAdapter
: ta wartość jest zwracana wydawcy w odpowiedzi na żądanie Interfejs API zdefiniowany przez pakiet SDK, taki jakloadAd
. MetodaopenSession()
tej implementacji powinna służyć do wysyłania żądania reklamy do serwerów pakietu SDK i przygotowywania widoku reklamy dla tego żądania.Session**
: zwracany w odpowiedzi naSandboxedUiAdapter.openSession
. Umożliwia ona bibliotece klienta uzyskanie interfejsu reklamy i powiadamia pakiet SDK o zmianach w tym interfejsie API. Tutaj należy zastosować wszystkie metodySession
.
Wydawca powinien wykonać te czynności:
- Utwórz
SandboxedSdkView
za pomocą kodu XML lub automatycznie. - Podłącz
SandboxedSdkUiSessionStateChangedListener
doSandboxedSdkView
, aby obserwować zmiany w interfejsie. - Dołącz dostarczony
SandboxedUiAdapter
pakiet SDK do projektuSandboxedSdkView
. - Dodaj do okna plik
SandboxedSdkView
w zwykły sposób i pozwól bibliotece klienta zajmuje się tworzeniem i utrzymywaniem sesji interfejsu za pomocą pakietu SDK. - W odpowiednich momentach reaguj na zmiany stanu zgłaszane przez
SandboxedSdkUiSessionChangedListener
Jeśli na przykład pakiet SDK zamknie sesję nieoczekiwanie, wydawca może zastąpić elementSandboxedSdkView
obrazem statycznym lub usunąć go z hierarchii widoku. - Podczas wykonywania przejść, które mogą zasłaniać interfejs reklamy, takich jak menu, tymczasowo ustaw wartość
orderProviderUiAboveClientUi
na false, aby umieścić interfejs reklamy poniżej okna wydawcy. Gdy zamkniesz menu, wywołaj funkcjęorderProviderUiAboveClientUi
dotrue
.
Przyszłość interfejsów API platformy
Gdy biblioteki interfejsu przejdą do wersji beta, planujemy wycofać interfejsy API środowiska wykonawczego platformy SDK związane z prezentacją interfejsu użytkownika, a mianowicie SdkSandboxManager.requestSurfacePackage()
i SandbxedSdkProvider.getView()
.
Pytania otwarte
- Czy istnieje więcej typowych przypadków użycia interfejsu reklamy, które biblioteki UI powinny obsługiwać automatycznie?
- Których frameworków interfejsu użytkownika używasz do wyświetlania interfejsu reklamy? Czy przewidujesz problemy z integracją bibliotek interfejsu z tymi frameworkami?
- Czy przewijany interfejs reklam umieszczony w kontenerze wydawcy z możliwością przewijania jest powszechnym zastosowaniem dla Pana/Pani firmy? Jaki jest kierunek przewijania w interfejsie użytkownika reklamy i kontener w tym przypadku? Jakiego działania oczekujesz, gdy użytkownik przewija interfejs reklamy?