Informacia
Treść

[Androida] 1. consentmanager Integracja SDK

Połączenia consentmanager SDK dla aplikacji na Androida implementuje i zapewnia funkcjonalność informowania użytkownika o ochronie danych oraz pytania i zbierania zgody od użytkownika. Umożliwia programistom aplikacji łatwą integrację consentmanager usługi do swojej aplikacji.

Jak to działa?

  1. Zintegruj SDK z aplikacją i skonfiguruj ustawienia SDK
  2. Gdy SDK zostanie zintegrowany z aplikacją, SDK udostępni funkcje dla programisty aplikacji w celu pobrania danych dotyczących zgody
  3. Gdy tylko aplikacja się uruchomi, SDK automatycznie pobierze informacje z consentmanager serwery w celu przygotowania SDK do jego użycia.
  4. Zaleca się, aby przy starcie aplikacji tworzyła instancję klasy CMPConsentTool. Po utworzeniu SDK automatycznie wyświetli ekran zgody, jeśli to konieczne.
  5. Gdy aplikacja chce przetwarzać dane osobowe, powinna „zapytać” SDK, czy została wyrażona zgoda na konkretny cel i dostawcę.

Instalacja

Od wersji 1.7.0 repozytorium SDK zostało przeniesione do oficjalnego repozytorium Maven. Można znaleźć Przewodnik migracji tutaj

Gradle

Dodaj zależność do pliku build.gradle aplikacji. (Aby zawsze uzyskać najnowszą wersję, użyj symbolu +, aby uzyskać najnowsze aktualizacje. Możesz na przykład zawsze uzyskać najnowsze wersje w przypadku mniejszych aktualizacji do 1.x.+)

dependencies {
  implementation 'net.consentmanager.sdk:android:1.7.32'
}

Maven

Dodaj zależność do pliku build.gradle aplikacji. (Aby zawsze uzyskać najnowszą wersję w maven, możesz użyć różnych metod, aby odrzucić zakres wersji. Możesz je sprawdzić tutaj )

    <dependency>
        <groupId>net.consentmanager.sdk</groupId>
        <artifactId>android</artifactId>
        <version>1.7.32</version>
    </dependency>

Korzystanie z biblioteki

Uprawnienia

Ten pakiet SDK wymaga następujących uprawnień, upewnij się, że dodałeś je do pliku AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

Zainicjuj narzędzie zgody

Za pomocą aplikacji startowej (zazwyczaj funkcji viewDidAppear) musisz utworzyć instancję klasy CMPConsentTool. Spowoduje to automatyczne pobranie niezbędnych danych z naszego serwera i określenie, czy ekran akceptacji ma być wyświetlany, czy nie. Jeśli tak, SDK automatycznie wyświetli w tym momencie ekran zgody, zbierze dane i przekaże je do aplikacji. Instancję można następnie wykorzystać w celu uzyskania szczegółów zgody z SDK w celu wykorzystania jej w aplikacji.

Aby zainicjować ConsentTool, przejdź do wybranej klasy i utwórz instancję CMPConsentTool, jak pokazano poniżej:

//...
import net.consentmanager.sdk.CMPConsentTool;
//...
public class MainActivity extends AppCompatActivity {
    private CMPConsentTool consentTool;
    //...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      //..
      consentTool = CMPConsentTool.createInstance(this, "D3M01D4A2B3C5", "delivery.consentmanager.net", "MyFavouriteApp", "");
    }
//...
}

 

Aby utworzyć instancję CMPConsentTool należy ją skonfigurować. Będziesz musiał podać CODE-ID, domenę serwera, nazwę aplikacji i język. CODE-ID i domenę serwera można znaleźć w pliku consentmanager konto pod Menu > Pobierz kod. Nazwy aplikacji można użyć do rozróżnienia różnych aplikacji w consentmanager raportowanie. Jako język możesz użyć pustego ciągu ("") do automatycznego wykrywania lub dwuliterowego kodu języka ("EN", "DE", "FR" itd.).

Wartości konfiguracyjne można wstawiać na różne sposoby:

a) Konfiguracja SDK przez CMPConfig

Dodaj następujące wiersze do swojego kodu:

val config = CMPConfig.apply { 
            serverDomain = CMP_DOMAIN
            appName = CMP_APP_NAME
            language = LANG
            id = CODE_ID
        }
val consentTool = CMPConsentTool.createInstance(this, config);
b) Konfiguracja zestawu SDK za pomocą metody createInstance()

Dodaj następujący wiersz do swojego kodu:

consentTool = CMPConsentTool.createInstance(this, "D3M01D4A2B3C5", "delivery.consentmanager.net", "MyFavouriteApp", "EN");

Korzystanie z SDK

Aby sprawdzić, czy sprzedawca lub cel mają zgodę, możesz skorzystać z dwóch metod:

if(consentTool.hasPurposeConsent(this,"52",false))
{
    if(consentTool.hasVendorConsent(this,"s26", false))
    {
        //do something with data
    }
}

Obie metody hasPurposeConsent i hasVendorConsent wymagają dwóch parametrów:

  • id — ciąg identyfikatora dostawcy lub celu. Należy pamiętać, że identyfikatory dostawców mogą mieć różne formaty („123”, „s123” i „c123”), sprawdź dokładnie za pomocą Menu > Sprzedawcy i Menu > Cele w telefonie consentmanager konta.
  • isIABVendor / isIABPurpose — jeśli dostawca lub cel jest dostawcą/celem zgodnym ze standardem IAB TCF, należy ustawić wartość prawda, w przeciwnym razie fałsz.

Pamiętaj: wszyscy dostawcy, którzy nie należą do IAB, mają identyfikatory zaczynające się od „s” lub „c” (np. „s123”); dostawcy należący do IAB mają identyfikatory, które nie zaczynają się od „s” lub „c”.

Ponowne otwieranie ekranu zgody

Aby umożliwić użytkownikowi zmianę wyborów, wystarczy zadzwonić openCmpConsentToolView():

consentTool.openCmpConsentToolView(this);

W niektórych przypadkach natywna aplikacja może zawierać widoki internetowe w celu wyświetlania pewnych rzeczy, takich jak reklamy lub treści. W celu przekazania informacji o zgodzie z SDK do webview prosimy o skorzystanie z funkcji:

String consentData = CMPConsentTool.exportCMPData(this);

Spowoduje to wyeksportowanie informacji o zgodzie i wszystkich dalszych danych wymaganych przez CMP. Następnie możesz przekazać te informacje do CMP w widoku sieciowym, dodając je do adresu URL wywoływanego w widoku sieciowym:

myWebView.loadURL("https://mywebsite.com/....#cmpimport=" + consentData);

Niestandardowe odbiorniki zdarzeń

Aby dodać dodatkową logikę procesu, możesz skorzystać z detektorów zdarzeń. Dostępne są następujące detektory zdarzeń:

Nazwa

Występuje

 

OnOpenCallback

Odbiornik zdarzenia po otwarciu CMP

OnCMPZamknijOddzwoń

Odbiornik zdarzenia, gdy CMP jest zamknięty

OnCMPNotOpenedOddzwonienie

Odbiornik zdarzenia, gdy nie trzeba otwierać CMP

Przy oddzwonieniu po błędzie

Listener for Event, gdy wystąpi błąd w procesie zarządzania zgodą.

Zgoda na import/eksport

Aby zaimportować lub wyeksportować zgodę możesz skorzystać z funkcji exportCMPData (kontekst kontekstu) i importCMPData (kontekst kontekstu, ciąg cmpData). Sprawdź poniższy przykład: 

ZgodaString, którą musisz przekazać, powinna być zakodowana w base64.

 

Diagram sekwencji CMP SDK

Cmp-Schemat-Sekwencji-(1).png


Wspólne preferencje

SDK ustawi wartości wspólnych preferencji dla IAB TCF v1, IAB TCF v2, IAB USPrivacy i Google AC String. Te wartości można odczytać za pomocą następującego kodu:

Context mContext = getApplicationContext();

SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);

SharedPreferences.OnSharedPreferenceChangeListener mListener;

mListener = new SharedPreferences.OnSharedPreferenceChangeListener() {

            public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
                        if (key.equals([Specific Consent Key])) {
                                   // Update Consent settings
                                   }
                        }
            };
mPreferences.registerOnSharedPreferenceChangeListener(mListener);

 

Zdefiniowano następujące klucze:

Dokument dotyczący przejrzystości i przejrzystości dokumentów IAB w wersji 1  
IABConsent_CMPPresent Boolean: Ustaw na true, jeśli CMP implementujący tę specyfikację jest obecny w aplikacji. Idealnie ustawione przez Wydawcę tak szybko, jak to możliwe, ale można je również ustawić alternatywnie przez CMP.
IABConsent_SubjectToGDPR String 1 – (podlega RODO), 0 – (nie podlega RODO), zero – nieoznaczony (domyślnie przed inicjalizacją). Zgodność z doradztwem IAB OpenRTB RODO. Zdecydowaliśmy się być String, aby mieć status niezainicjowany.
IABConsent_ConsentString String: Ciąg zgody
IABConsent_ParsedPurposeConsents String (od „0” i „1”), gdzie znak na pozycji N wskazuje status zgody na cel o identyfikatorze N zgodnie z definicją na globalnej liście dostawców. Wyrażono ciąg zgody, aby umożliwić proste sprawdzenie. Pierwszy znak od lewej to Cel 1, ...
IABConsent_ParsedVendorConsents String (od „0” i „1”), gdzie znak na pozycji N wskazuje stan zgody na identyfikator dostawcy N zgodnie z definicją na globalnej liście dostawców. Wyrażono ciąg zgody, aby umożliwić proste sprawdzenie. Pierwsza postać od lewej to Dostawca 1, ... 
Dokument dotyczący przejrzystości i przejrzystości dokumentów IAB w wersji 2  
IABTCF_CmpSdkID Number: identyfikator liczby całkowitej bez znaku pakietu CMP SDK
IABTCF_CmpSdkVersion Number: liczba całkowita bez znaku numeru wersji pakietu CMP SDK
IABTCF_PolicyVersion Number: Liczba całkowita bez znaku reprezentująca wersję TCF, której dotyczą te zgody.
IABTCF_gdprApplies Number:

1 RODO obowiązuje w obecnym kontekście

0 - RODO nie nie zastosować w obecnym kontekście

Nieoprawny - nieokreślony (domyślnie przed inicjalizacją)

IABTCF_PublisherCC String: Dwuliterowy kod ISO 3166-1 alfa-2 - Domyślna: AA (nieznany)
IABTCF_PurposeOneTreatment Number:

0 - brak specjalnego traktowania celu pierwszego

1 - cel jeden nie został ujawniony

Usuń ustawienie domyślne - 0

Sprzedawcy mogą używać tej wartości do określenia, czy wymagana jest zgoda na cel jeden.

IABTCF_UseNonStandardStacks Number:

1 - CMP użył niestandardowego stosu

0 - CMP nie używał niestandardowego stosu

IABTCF_TCString String: W pełni zakodowany ciąg TC
IABTCF_VendorConsents Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status zgody na identyfikator dostawcy n + 1; false i true odpowiednio. np. '1' w indeksie 0 jest zgoda true dla identyfikatora dostawcy 1
IABTCF_VendorLegitimateInterests Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status prawnie uzasadnionego interesu dla identyfikatora dostawcy n + 1; false i true odpowiednio. np. '1' w indeksie 0 czy istnieje uzasadniony interes? true dla identyfikatora dostawcy 1
IABTCF_PurposeConsents Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status zgody na identyfikator celu n + 1; false i true odpowiednio. np. '1' w indeksie 0 jest zgoda true dla identyfikatora celu 1
IABTCF_PurposeLegitimateInterests Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status prawnie uzasadnionego interesu dla celu identyfikacji n + 1; false i true odpowiednio. np. '1' w indeksie 0 czy istnieje uzasadniony interes? true dla identyfikatora celu 1
IABTCF_SpecialFeaturesOptIns Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status zgody na specjalny identyfikator funkcji n + 1; false i true odpowiednio. np. '1' w indeksie 0 jest zaakceptowany true dla specjalnego identyfikatora funkcji 1
IABTCF_PublisherRestrictions{ID} String ['0','1', or '2']: Wartość na pozycji n - gdzie nindeksowanie zaczyna się o 0 – wskazuje typ ograniczenia wydawcy (0-2) dla dostawcy n + 1; (zobacz Typy ograniczeń wydawców). np. '2' w indeksie 0 to typ ograniczenia 2 dla identyfikatora dostawcy 1. {ID} odnosi się do identyfikatora celu.
IABTCF_PublisherConsent Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status zgody na cel dla identyfikatora celu n + 1 dla wydawcy, ponieważ odpowiadają one celom globalnej listy dostawców; false i true odpowiednio. np. '1' w indeksie 0 jest zgoda true dla identyfikatora celu 1
IABTCF_PublisherLegitimateInterests Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status uzasadnionego interesu celu dla identyfikatora celu n + 1 dla wydawcy, ponieważ odpowiadają one celom globalnej listy dostawców; false i true odpowiednio. np. '1' w indeksie 0 czy istnieje uzasadniony interes? true dla identyfikatora celu 1
IABTCF_PublisherCustomPurposesConsents Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status zgody na cel dla niestandardowego identyfikatora celu wydawcy n + 1 dla wydawcy; false i true odpowiednio. np. '1' w indeksie 0 jest zgoda true dla niestandardowego identyfikatora celu 1
IABTCF_PublisherCustomPurposesLegitimateInterests Binary String: the '0' or '1' na stanowisku n - gdzie nindeksowanie zaczyna się o 0 – wskazuje status uzasadnionego interesu celu dla niestandardowego identyfikatora celu wydawcy n + 1 dla wydawcy; false i true odpowiednio. np. '1' w indeksie 0 czy istnieje uzasadniony interes? true dla niestandardowego identyfikatora celu 1
IAB USPrywatność  
IABUSPrivacy_String String: jest zgodny z zaleceniem IAB OpenRTB CCPA. String koduje wszystkie wybory i informacje.
Ciąg Google AC  
IABTCF_AddtlConsent

String: jest zgodny ze specyfikacją techniczną trybu dodatkowej zgody Google. 

(Wycofane) Dynamiczne blokowanie treści za pomocą elementu zastępczego webView

Ta funkcja jest przestarzała i zostanie usunięta w przyszłości. Powodem wycofania jest to, że dzięki włączaniu i wyłączaniu interfejsów API dostawcy i celu nie ma już potrzeby tworzenia symbolu zastępczego. Możesz dodać własny interfejs użytkownika i własną logikę biznesową oraz dynamicznie aktywować i dezaktywować dostawców. Zamiast korzystać z tej funkcji, należy użyć metody włączListaDostawców() i wyłączListDostawców() funkcje do zarządzania, którzy dostawcy są włączani lub wyłączani, i tworzyć własny interfejs użytkownika, aby wyświetlać te informacje użytkownikowi.

Symbol zastępczy viewObject można zaimplementować, aby uzyskać funkcjonalność dynamicznego blokowania treści tutaj.Możesz utworzyć widok za pomocą następującej metody: 

CMPPlaceholder placeholderView = CMPConsentTool.createPlaceholder(getApplicationContext(),CMPPlaceholderParams
                        .ofVendor("${vendorId}"), new CMPPlaceholderEventListener() {
                        
                    @Override
                    public void vendorAccepted(WebView view) {
                    	//... Actions to trigger if Consent is accepted
                        // Like showing Youtube Video View
                    	}
                    });

Z obiektem opakowującym CMPPlaceholderParams możesz również przekazać parametry opcjonalne, takie jak teksty niestandardowe lub opcjonalny obraz podglądu. Funkcje konstruktora nazywają się setCustomplaceholder(String headline, String mainText, String checkboxText, String buttonText)setOptionalImageUrl(String imageUrl).

Wymagana logika biznesowa, gdy chcesz pokazać widok i nie musi być stosowana przez dewelopera. Możesz przekazać wymagane warunki i akcje, używając wywołań zwrotnych EvenListener z CMPPlaceholderEventlistener. Należy wdrożyć następujące wymagane wydarzenie:

Wymagany: vendorAccepted(CMPPlaceholderView view) { // Your logic }

Opcjonalny: errorOccurred(String message) { // Error handling }

Logowanie

Podczas korzystania z naszego pakietu SDK dla systemu Android może zaistnieć potrzeba debugowania lub analizowania informacji z dziennika do różnych celów. Logi generowane przez nasz SDK są oznaczone tagiem „CMP”, co pozwala na łatwe filtrowanie i przeglądanie tylko odpowiednich logów. Ten przewodnik zawiera instrukcje krok po kroku dotyczące uzyskiwania dostępu do tych dzienników za pomocą Logcat w Android Studio.

Wyszukaj tag: w pasku wyszukiwania nad wyciągami dziennika wpisz CMP aby odfiltrować logi oznaczone "CMP".

Opcjonalnie: Włącz tryb debugowania

In CMPConfig, ustaw isDebugMode = true.

val config = CMPConfig.apply {
    // ... other settings
    isDebugMode = true
}
  • Umożliwia bardziej szczegółowe dzienniki oznaczone tagiem „CMP”.
  • Przydatne do debugowania i analizy.

Rozwiązywanie problemów

Nie znaleziono klasy lub wyjątek NoSuchMethodException:

ProGuard może czasami zaciemniać nazwy klas lub usuwać metody, do których odwołują się dynamicznie poprzez odbicie. Aby to naprawić, musisz określić klasy i metody, które powinny pozostać nienaruszone w pliku konfiguracyjnym ProGuard za pomocą -keep Dyrektywa.

Przykładowa konfiguracja ProGuarda w celu zachowania określonej klasy i jej metod:

# Kotlin serialization looks up the generated serializer classes through a function on companion
# objects. The companions are looked up reflectively so we need to explicitly keep these functions.
-keepclasseswithmembers class **.*$Companion {
    kotlinx.serialization.KSerializer serializer(...);
}
# If a companion has the serializer function, keep the companion field on the original type so that
# the reflective lookup succeeds.
-if class **.*$Companion {
  kotlinx.serialization.KSerializer serializer(...);
}
-keepclassmembers class <1>.<2> {
  <1>.<2>$Companion Companion;
}

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepattributes JavascriptInterface

-keepclassmembers class net.consentmanager.sdk.common.callbacks.* {
   public *;
}

-keepclassmembers class net.consentmanager.sdk.consentlayer.ui.consentLayer.CmpWebView {
   public *;
}

-keepclassmembers class net.consentmanager.sdk.consentlayer.ui.CmpLayerAppInterface {
   public *;
}
-keep class net.consentmanager.sdk.CMPConsentTool {
                                                      *;
                                                  }

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepattributes JavascriptInterface

# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
# If you have any, uncomment and replace classes with those containing named companion objects.
#-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
#-if @kotlinx.serialization.Serializable class
#com.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
#com.example.myapplication.HasNamedCompanion2
#{
#    static **$* *;
#}
#-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
#    static <1>$$serializer INSTANCE;
#}

 

Powrót do góry