Informacia
Treść

[Androida] 1. consentmanager Integracja SDK

W tym dokumencie znajdziesz ogólne informacje na temat integracji naszego SDK z Twoim projektem. Więcej szczegółów znajdziesz w naszym Dokumentacja API dokumentacja. Wszystkie poniższe fragmenty kodu zostały wyodrębnione z naszego Aplikacja demonstracyjna

1. Instalacja

consentmanager SDK to kompleksowe rozwiązanie do zarządzania zgodą użytkownika w aplikacjach mobilnych. Zaprojektowany do obsługi zgodności z GDPR, preferencji prywatności użytkownika i przejrzystości śledzenia reklam, ten SDK zapewnia bezproblemową integrację z platformami iOS i Android. Ponadto oferuje wtyczki/mostki wrapper dla React Native, Flutter i Unity, co czyni go wszechstronnym w różnych środowiskach programistycznych.

Kroki — opis wysokiego poziomu

  1. Integracja i konfiguracja:

    • Zintegruj pakiet SDK ze swoją aplikacją.
    • Skonfiguruj ustawienia SDK zgodnie ze swoimi potrzebami.
  2. Tworzenie instancji i wyświetlanie warstwy zgody:

    • Podczas uruchamiania aplikacji utwórz instancję CMPManager klasa. Ta instancja będzie obsługiwać proces wyrażania zgody.
    • W razie potrzeby zestaw SDK automatycznie wyświetli ekran zgody.
  3. Przetwarzanie danych zgody użytkownika:

    • Po zebraniu zgód informacje są przechowywane i dostępne do zapytania za pośrednictwem różnych właściwości i metod udostępnianych przez nasz zestaw SDK. Będziesz mieć informacje o odrzuconych lub zaakceptowanych zgodach, dostawcach i celach.

1.1 Integracja i konfiguracja

Dodawanie zależności poprzez Gradle

Dodaj następujący wiersz do pliku build.gradle:

dependencies {
    implementation "net.consentmanager.sdkv3:cmsdkv3:3.2.0"
}

Następnie zsynchronizuj swój projekt. 

1.2 Tworzenie instancji i wyświetlanie warstwy zgody

W ramach startu aplikacji (twój onCreate funkcja), musisz utworzyć instancję klasy CMPManager. Musisz skonfigurować dwa obiekty, które zostaną przekazane do metody getInstance: UrlConfig, który obsługuje konfigurację CMP, taką jak Code-ID i domyślny język, i ConsentLayerUIConfig. który skonfiguruje wygląd WebView, który wyświetli warstwę zgody. Następnie przekażesz bieżący Activity używając metody setActivityi przypisz delegata, jak pokazano poniżej. W poniższym przykładzie możesz znaleźć oba przekazywane obiekty. checkWithServerAndOpenIfNecessary() funkcja automatycznie pobierze niezbędne dane z naszego serwera i określi, czy ekran zgody musi zostać wyświetlony, czy nie. Jeśli tak, SDK automatycznie wyświetli ekran zgody w tym momencie, za pośrednictwem WebView utworzony przez nasz zestaw SDK, który wyświetli warstwę zgody z tekstem i przyciskami zgodnie z konfiguracją CMP (wybraną za pomocą identyfikatora kodu CMP), zbierze dane i zapisze informacje o zgodzie w obszarze NSUserDefaults urządzenia, dzięki czemu aplikacja będzie mogła wyświetlać odpowiednie reklamy. 

Należy pamiętać, że istotne jest zadeklarowanie i zainicjowanie CMPManager SDK w onCreate metoda, w przeciwnym razie widok może nie być gotowy do użycia i SDK może się nie powieść. Upewnij się również, że używasz prawidłowych danych konfiguracyjnych. Dane konfiguracyjne można znaleźć w consentmanager konto na Menu > CMP > Pobierz kod dla aplikacji > Code-ID

Należy również pamiętać, że funkcjonalności związane z określeniem, czy zgoda jest potrzebna, czy nie, a także wyświetlanie warstwy zgody zależą od niezawodnego połączenia sieciowego. Jeśli nie ma dostępnego połączenia lub jeśli mechanizm ponownej próby nie dotrze do naszego serwera, zdarzenie didReceiveError zwróci błąd limitu czasu, a zatem SDK nie będzie w stanie określić potrzeby zgody, ponieważ nie będzie w stanie wyświetlić warstwy zgody. Upewnij się, że Twoja logika to uwzględnia.

Przykład:

import net.consentmanager.cm_sdk_android_v3.CMPManager
import net.consentmanager.cm_sdk_android_v3.CMPManagerDelegate
import net.consentmanager.cm_sdk_android_v3.ConsentLayerUIConfig
import net.consentmanager.cm_sdk_android_v3.UrlConfig

class MainActivity : ComponentActivity(), CMPManagerDelegate {
    private lateinit var cmpManager: CMPManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        val urlConfig = UrlConfig(
            id = "YOUR_CODE_ID_HERE",
            domain = "delivery.consentmanager.net",
            language = "EN",
            appName = "CMDemoAppKotlin"
        )

        val webViewConfig = ConsentLayerUIConfig(
            position = ConsentLayerUIConfig.Position.FULL_SCREEN,
            backgroundStyle = ConsentLayerUIConfig.BackgroundStyle.dimmed(Color.BLACK, 0.5f),
            cornerRadius = 10f,
            respectsSafeArea = true,
            isCancelable = false
        )

        cmpManager = CMPManager.getInstance(
            context = this,
            urlConfig = urlConfig,
            webViewConfig = webViewConfig,
            delegate = this
        )

        cmpManager.setActivity(this)

        checkAndOpen()
    }

    private fun checkAndOpenConsentLayer() {
        cmpManager.checkAndOpen { result ->
            result.onSuccess {
                showCMPDemoScreen()
            }.onFailure { error ->
                Log.e("DemoApp", "Check and open consent layer failed with error: $error")
            }
        }
    }

    private fun showCMPDemoScreen() {
        setContent {
            MaterialTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    CMPDemoScreen(cmpManager)
                }
            }
        }
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        Log.d("CMP DemoApp", "Configuration changed")
        super.onConfigurationChanged(newConfig)
        cmpManager.onApplicationResume()
    }

	override fun onPause() {
        Log.d("CMP DemoApp", "Activity paused")
        super.onPause()
        cmpManager.onApplicationPause()
    }

    override fun onDestroy() {
        Log.d("CMP DemoApp", "Activity destroyed")
        super.onDestroy()
        cmpManager.onActivityDestroyed()
    }

    override fun didReceiveConsent(consent: String, jsonObject: Map<String, Any>) {
        Log.d("CMP DemoApp", "Consent Layer successfully received consent message.")
        runOnUiThread {
            showCMPDemoScreen()
        }
    }

    override fun didShowConsentLayer() {
        Log.d("CMP DemoApp", "Consent Layer open message received.")
    }

    override fun didCloseConsentLayer() {
        Log.d("CMP DemoApp", "Consent Layer close message received.")
        runOnUiThread {
            showCMPDemoScreen()
        }
    }

    override fun didReceiveError(error: String) {
        Log.e("CMP DemoApp", "SDK error: $error")
    }
}

1.3 Przetwarzanie danych zgody użytkowników

Sprawdzanie zgód użytkowników

Nasz zestaw SDK oferuje ujednoliconą metodę sprawdzania i pobierania informacji o zgodzie, getUserStatus():
val status = cmpManager.getUserStatus()
Log.d("CMPDemo", "User Status: ${status.hasUserChoice}")
Log.d("CMPDemo", "TCF: ${status.tcf}")
Log.d("CMPDemo", "Additional Consent: ${status.addtlConsent}")
Log.d("CMPDemo", "Regulation: ${status.regulation}")

Log.d("CMPDemo", "---- Vendors Status ----")
status.vendors.forEach { (vendorId, choice) ->
    Log.d("CMPDemo", "Vendor $vendorId: $choice")
}

Log.d("CMPDemo", "---- Purposes Status ----")
status.purposes.forEach { (purposeId, choice) ->
    Log.d("CMPDemo", "Purpose $purposeId: $choice")
}

Aby uzyskać więcej informacji na temat innych metod, zapoznaj się z naszą pełną wersją Dokumentacja API

Ponowne otwarcie warstwy zgody w celu sprawdzenia wyborów użytkowników

Aby umożliwić użytkownikowi sprawdzenie lub zmianę swoich wyborów, wystarczy zadzwonić pod numer openConsentLayer()

cmpManager.forceOpen()

Ta metoda wyświetli warstwę zgody za pośrednictwem tej samej instancji WebView, która została utworzona w poprzednich krokach. 

W niektórych przypadkach aplikacja natywna może zawierać webviews w celu wyświetlania informacji, takich jak reklamy lub treści. Aby przesłać informacje o zgodzie z SDK do webview, możesz pobrać ciąg zgody za pomocą:

consentData = cmpManager.exportCMPInfo()

Spowoduje to wyeksportowanie informacji o zgodzie i wszystkich dalszych danych, które są potrzebne CMP. Następnie możesz przekazać te informacje do CMP, który znajduje się w Twoim widoku internetowym, dodając je do adresu URL, który jest wywoływany w widoku internetowym.

Jeśli w przeciwnym razie musisz zaimportować ciąg zgody za pomocą zestawu SDK, możesz skorzystać z poniższego przykładu:

val consentStringToImport = "Q1FERkg3QVFERkg3QUFmR01CSVRCQkVnQUFBQUFBQUFBQWlnQUFBQUFBQUEjXzUxXzUyXzUzXzU0XzU1XzU2XyNfczI3ODlfczI3OTBfczI3OTFfczI2OTdfczk3MV9VXyMxLS0tIw"
cmpManager.importCMPInfo(consentStringToImport)

Tworzenie niestandardowego układu

Aby utworzyć dostosowany widok WKWebView, możesz utworzyć opakowanie dla ComponentActivity, które musi zostać przekazane do CMP SDK, dzięki czemu będziesz mieć pełną kontrolę nad wyglądem i cyklem życia. Aby uzyskać więcej informacji, zapoznaj się z oficjalna dokumentacja.

Logowanie

Podczas korzystania z naszego zestawu SDK dla systemu iOS może zaistnieć potrzeba debugowania lub analizowania informacji z dziennika w różnych celach. Dzienniki generowane przez nasz zestaw SDK są oznaczone jako „CMP”, co pozwala na łatwe filtrowanie i przeglądanie tylko odpowiednich dzienników. Aby uzyskać więcej informacji, zapoznaj się z w tej sekcji naszej dokumentacji.

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