Leading Consent Management Platform

Compliant with GDPR, CCPA, COPPA, LGPD, PECR, PDPA, PIPEDA, and more.

Come integrare l'SDK CMP UniConsent per iOS nelle app mobili

UniConsent CMP è un pacchetto per la gestione del consenso GDPR IAB TCF 2.4 su iOS. Nella directory "UniConsentDemo" trovi un'app dimostrativa integrata con UniConsent CMP.

Prerequisiti

  • Piano UniConsent CMP con supporto per le app mobili
  • iOS >= 15.0
  • Pacchetto SDK UniConsent CMP (da richiedere al supporto)

Per iniziare

Aggiungi UniConsent.xcframework al tuo progetto. Nella sezione General > Frameworks, Libraries, and Embedded Content del tuo target, imposta UniConsent.xcframework su Embed & Sign.

Personalizzare l'interfaccia del consenso

Prima di integrare l'SDK, personalizza l'aspetto del banner del consenso nella Dashboard UniConsent per adattarlo al tuo brand e ottimizzare i tassi di consenso.

Passaggio 1: stile del brand nella Dashboard

Vai a Projects → Select your Project → Settings → Step 5: UI & Style Settings per configurare:

  • Main Button Colour: imposta il colore del pulsante di azione principale in linea con il tuo brand
  • Main Button Text Colour: regola il colore del testo del pulsante principale per garantirne la leggibilità
  • Background Colour: imposta il colore di sfondo del banner in armonia con la tua app
  • Text Colour: assicurati che il testo del corpo abbia un contrasto adeguato

Passaggio 2: stile avanzato con CSS personalizzato (facoltativo)

Per un controllo più preciso, aggiungi CSS personalizzato nel campo CSS Content del passaggio 5. È consigliato per far sembrare il banner parte integrante della tua app e ottenere il miglior tasso di consenso:

/* Example: Style the accept button to match your brand */
.unic-btn-accept {
  background-color: #4CAF50;
  border-radius: 8px;
  font-weight: 600;
}

/* Example: Adjust banner font */
.unic-banner {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}

/* Example: Make the reject button less prominent */
.unic-btn-reject {
  background-color: transparent;
  border: 1px solid #ccc;
  color: #666;
}

Suggerimento: un'interfaccia del consenso coerente con il brand e integrata nella tua app ottiene in genere tassi di consenso più elevati. Gli utenti tendono a interagire in modo più positivo con un banner che rispecchia l'aspetto e lo stile che si aspettano.

Utilizzo

Per usare UniConsent CMP nella tua app, segui questi passaggi:

Inizializza la CMP con un App ID fornito dal tuo account manager:

import UniConsent

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Init CMP with appId
    UniConsentCMP.shared.initialize(apiId: "YOUR_APP_ID_CHANGE_THIS")
    return true
}

Mostra l'interfaccia della CMP:

// Display CMP as full-screen modal (default)
UniConsentCMP.shared.setUIStage(.GDPRFirstScreen)
UniConsentCMP.shared.launchCMP(rootVC: self)

// Display CMP as a modal bottom sheet
UniConsentCMP.shared.launchCMP(rootVC: self, displayMode: .modalSheet)

// Display CMP as a modal bottom sheet at 60% of the available height
UniConsentCMP.shared.launchCMP(rootVC: self, displayMode: .modalSheet, heightRatio: 0.6)

// Display CMP as a center dialog
UniConsentCMP.shared.launchCMP(rootVC: self, displayMode: .dialog)

// Display CMP as a center dialog at 80% width and 60% height
UniConsentCMP.shared.launchCMP(rootVC: self, displayMode: .dialog, widthRatio: 0.8, heightRatio: 0.6)

Modalità di visualizzazione disponibili (CMPDisplayMode):

  • .fullScreen: presentazione modale a schermo intero (predefinita)
  • .modalSheet: bottom sheet con maniglia di trascinamento (iOS 15+)
  • .dialog: finestra di dialogo centrata con sfondo oscurato

Dimensioni personalizzate (facoltativo)

Disponibile dalla versione 26.8.0 dell'SDK.

Entrambi i rapporti sono facoltativi: ogni modalità di visualizzazione funziona anche senza. Passa un rapporto (una frazione dello schermo, limitata all'intervallo 0.1...1.0) solo per sovrascrivere le dimensioni predefinite:

ParametroSi applica aValore predefinito se omesso
heightRatio.modalSheet, .dialogSheet: 90% dell'altezza disponibile. Dialog: 70% dello schermo
widthRatioSolo .dialog90% della larghezza dello schermo, fino a 500pt

I rapporti che non si applicano alla modalità di visualizzazione scelta vengono ignorati (.fullScreen li ignora entrambi). Su iOS 16+ il foglio usa esattamente il valore di heightRatio; su iOS 15 si ricorre al detent di sistema medium (rapporto ≤ 0.5) o large (rapporto > 0.5).

Gestore degli eventi

Ascolta gli eventi del ciclo di vita dell'SDK con CMPEventHandler. È il modo consigliato per sapere quando l'SDK ha completato l'inizializzazione, quando l'interfaccia viene mostrata e quando viene chiusa.

Eventi disponibili (CMPEventType):

  • .sdkInit: inizializzazione dell'SDK avviata
  • .ready: inizializzazione dell'SDK completata (GEO, configurazione e fornitori caricati)
  • .uiDisplay: l'interfaccia del consenso viene mostrata
  • .uiClose: l'interfaccia del consenso viene chiusa

Sottoscrivi gli eventi prima di chiamare initialize() per riceverli tutti:

import UniConsent

@main
class AppDelegate: UIResponder, UIApplicationDelegate, CMPEventHandler {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        UniConsentCMP.shared.subscribe(self)
        UniConsentCMP.shared.initialize(apiId: "YOUR_APP_ID")
        return true
    }

    func handle(event: CMPEvent) {
        switch event.type {
        case .ready:
            // SDK is ready — check consent and launch CMP if needed
            if UniConsentCMP.shared.shouldRequestConsent() {
                // launch CMP from your root view controller
            }
        case .uiClose:
            // User finished interacting with consent UI
            print("TC String:", UniConsentCMP.shared.getTCString())
        default:
            break
        }
    }
}

Puoi anche effettuare la sottoscrizione da un view controller:

class ViewController: UIViewController, CMPEventHandler {

    override func viewDidLoad() {
        super.viewDidLoad()
        UniConsentCMP.shared.subscribe(self)
    }

    func handle(event: CMPEvent) {
        switch event.type {
        case .uiDisplay:
            print("CMP UI is now visible")
        case .uiClose:
            print("Consent given, vendor 1 allowed:", UniConsentCMP.shared.isAllowVendorById(vendorId: 1))
        default:
            break
        }
    }
}

Per annullare la sottoscrizione:

UniConsentCMP.shared.unsubscribe(self)

CMPUIDelegate (legacy)

Puoi anche rilevare la chiusura del consenso con CMPUIDelegate:

class ViewController: UIViewController, CMPUIDelegate {

    func showCMP() {
        UniConsentCMP.shared.view.delegate = self
        UniConsentCMP.shared.setUIStage(.GDPRFirstScreen)
        UniConsentCMP.shared.launchCMP(rootVC: self, displayMode: .modalSheet)
    }

    func onDismiss() {
        // Called when the user closes the consent UI
        print("TC String:", UniConsentCMP.shared.getTCString())
    }
}

Verifica automaticamente se il consenso è scaduto quando la vendorList viene aggiornata:

// Automatic check if consent is expired when vendorList updates
if UniConsentCMP.shared.shouldRequestConsent() {
    UniConsentCMP.shared.launchCMP(rootVC: self)
}

Ottieni la tcString, se necessario:

// Get tcString if required
UniConsentCMP.shared.getTCString()

Leggi lo stato del consenso:

// Check consent for a specific IAB purpose
UniConsentCMP.shared.isAllowPurposeById(purposeId: 1)

// Check consent for a specific IAB vendor
UniConsentCMP.shared.isAllowVendorById(vendorId: 1)

// Get all allowed purpose/vendor IDs
UniConsentCMP.shared.getAllowedPurposeIds()
UniConsentCMP.shared.getAllowedVendorIds()

// Check if GDPR applies
UniConsentCMP.shared.gdprApplies

// Check if any consent has been given
UniConsentCMP.shared.isConsentGiven()

Reimposta lo stato del consenso, se necessario:

// Reset consent status if required
UniConsentCMP.shared.clearConsentData()

Primo livello personalizzato (Accetta tutto / Rifiuta tutto)

Disponibile dalla versione 26.7.0 dell'SDK. Se crei una tua interfaccia di primo livello per il consenso invece di mostrare la webview della CMP, puoi salvare il consenso direttamente:

// Grant consent for all purposes, special features and vendors
let saved = UniConsentCMP.shared.agreeAll()

// Reject all purposes, special features and vendors
let saved = UniConsentCMP.shared.rejectAll()

Entrambe le API salvano gli stessi valori di consenso del flusso dell'interfaccia della CMP (chiavi IAB TCF, additional consent e segnali di Consent Mode) e inviano lo stesso evento .uiClose ai sottoscrittori.

Nota: queste API recuperano la vendor list e la configurazione del progetto tramite rete in modo sincrono e restituiscono false se non è stato possibile salvare il consenso (ad esempio offline). Chiamale dopo initialize() e al di fuori del main thread.

Importante: il tuo primo livello personalizzato deve comunque rispettare i requisiti IAB TCF (indicare le finalità e i fornitori e offrire le opzioni di accettazione e rifiuto con uguale evidenza). Gli utenti devono comunque poter aprire l'interfaccia completa della CMP (launchCMP()) per effettuare scelte granulari.

Sincronizzare il consenso con la WebView

Se la tua app apre una WKWebView che carica una pagina web con il tag CMP di UniConsent, puoi passare lo stato del consenso nativo in modo che il tag CMP riconosca il consenso esistente e non mostri di nuovo il banner.

Chiama syncConsent(to:) prima di caricare la pagina web:

import WebKit
import UniConsent

let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())

// Inject native consent before page load
UniConsentCMP.shared.syncConsent(to: webView)

// Then load your web page
webView.load(URLRequest(url: URL(string: "https://example.com")!))

Objective-C

// Initialize with event handler
@interface AppDelegate () <CMPEventHandler>
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UniConsentCMP shared] subscribe:self];
    [[UniConsentCMP shared] initializeWithApiId:@"YOUR_APP_ID"];
    return YES;
}

- (void)handleWithEvent:(CMPEvent *)event {
    switch (event.type) {
        case CMPEventTypeReady:
            NSLog(@"CMP ready");
            break;
        case CMPEventTypeUiClose:
            NSLog(@"TC String: %@", [[UniConsentCMP shared] getTCString]);
            break;
        default:
            break;
    }
}

@end

// Display CMP (full screen by default)
[UniConsentCMP.shared launchCMPWithRootVC:self];

// Display CMP with a specific display mode
// Use CMPDisplayModeFullScreen, CMPDisplayModeModalSheet, or CMPDisplayModeDialog
[UniConsentCMP.shared launchCMPWithRootVC:self displayMode:CMPDisplayModeModalSheet];

Configura i valori chiave (KV) predefiniti dello stato del consenso:

<key>FIREBASE_ANALYTICS_COLLECTION_ENABLED</key> <false/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE</key> <false/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE</key> <false/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA</key> <false/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS</key> <false/>

Controlla gli analytics in base ai flag del consenso:

// SDK Version <= 25.6.1
public func onDismiss() {

    if(UniConsentCMP.shared.isAllowPurposeById(purposeId: 1)) {
        Analytics.setConsent([
          .analyticsStorage: .granted,
          .adStorage: .granted,
          .adUserData: .granted,
          .adPersonalization: .granted,
        ])
        Analytics.setAnalyticsCollectionEnabled(true);
    } else {
        Analytics.setConsent([
          .analyticsStorage: .denied,
          .adStorage: .denied,
          .adUserData: .denied,
          .adPersonalization: .denied,
        ])
        Analytics.setAnalyticsCollectionEnabled(false);
    }

    // other logic such as send analytics events
}

Trova maggiori informazioni in Set up consent mode for apps

Note

  1. Gli utenti devono poter accedere a un pulsante o link "Impostazioni privacy" nella sezione delle impostazioni della tua applicazione per aprire l'interfaccia della CMP.
  2. Puoi usare la funzione shouldRequestConsent() per verificare, in base allo stato, se occorre richiedere un nuovo consenso. Mostra l'interfaccia della CMP quando necessario all'apertura dell'applicazione da parte dell'utente.
  3. A partire dalla versione 25.6.1 dell'SDK non è più necessario inviare manualmente le opzioni di consenso per FirebaseAnalytics o per alcuni SDK AAP supportati: vengono gestite automaticamente dall'SDK. Per maggiori informazioni, consulta Che cosa sono Google AAP e Google MMP per le app mobili?.

Changelog

26.9.0

  • Supporto per IAB TCF 2.4