[iOS] 0. Guida alla migrazione

Questa guida ti aiuterà a migrare dalla versione precedente dell'SDK CMP alla versione attuale. Tratteremo le modifiche ai nomi dei metodi, ai parametri e alle funzionalità nuove o deprecate. Per esempi di app demo, consulta questo link

Tieni presente che questa versione dell'SDK CMP è stata completamente ricostruita da zero e rappresenta quindi un cambiamento significativo, poiché tutti i metodi sono stati rinominati, così come le firme, e ora offre callback per quasi tutti i metodi. In ogni caso, dovrai modificare il tuo codice e aggiornare le dipendenze per assicurarti che la tua app mobile funzioni come previsto. Inoltre, vale la pena menzionare che tutti i dati memorizzati dalla versione precedente del nostro SDK sui dispositivi degli utenti verranno cancellati, il che costringerà l'app a visualizzare nuovamente il layer di consenso.

Archivi

Tieni presente che tutti i nostri repository sono cambiati per l'SDK iOS. Segui le istruzioni qui sotto per scoprire dove indirizzare il tuo gestore di dipendenze. 

 Per ulteriori dettagli, consulta la nostra documentazione di riferimento API. Tutti i frammenti di codice riportati di seguito sono stati estratti dalla nostra app demo

Inoltre, tieni presente che non forniamo una versione statica del nostro framework personalizzato.

Cocoapod

Nel tuo Podfile, sostituisci la riga precedente con quella qui sotto:

pod 'cm-sdk-ios-v3, '3.8.0'

Dopo aver apportato le modifiche, esegui questo comando dalla riga di comando:

pod install --repo-update
Swift Package Manager

Il nostro pacchetto XCFramework è ora ospitato su https://github.com/iubenda/cm-sdk-xcframework-v3.

Su XCode, vai al menu File > Aggiungi dipendenze pacchetto e inserisci l'URL sopra indicato.  

Punti chiave della migrazione

  1. Modello Delegate: invece di singoli listener, la nuova versione utilizza un unico protocollo delegate (CMPManagerDelegate) per la gestione degli eventi. Contiene 4 eventi principali:
    1. didReceiveConsent(consent: String, jsonObject: [String : Any])
      Questo viene attivato quando il layer dei consensi viene chiuso dopo che l'utente ha aggiornato i propri consensi OPPURE quando si invocano metodi che causano modifiche ai consensi, come acceptAll, rejectAll, acceptVendors, rejectVendors, ecc. Significa che l’utente ha accettato o rifiutato alcuni o tutti i consensi e che questi sono stati correttamente salvati sul dispositivo.
    2. didShowConsentLayer
      Viene attivato quando il layer di consenso è stato effettivamente visualizzato. Significa che non c'era un consenso valido nel dispositivo, quindi ne deve essere raccolto uno nuovo.
    3. didCloseConsentLayer
      Questo evento viene attivato quando l'SDK ha verificato la necessità di un consenso, ma non era necessario e il livello non è stato visualizzato. Significa che nel dispositivo è già presente un consenso valido, quindi non è necessario un nuovo consenso e il livello di consenso non verrà visualizzato.
    4. didReceiveError
      Questo viene attivato quando l'operazione dell'SDK ha generato un errore.
  2. Gestori di completamento: molti metodi ora includono gestori di completamento per operazioni asincrone. Aggiorna il tuo codice per gestire questi callback in modo appropriato.
  3. Stringa di consenso: usa exportCMPInfo() invece di getConsentString() per recuperare le informazioni sul consenso.
  4. Consensi del fornitore e dello scopo: i metodi per ottenere i consensi del fornitore e dello scopo ora restituiscono array di ID. Potrebbe essere necessario modificare la logica per gestire questi array.
  5. Stringa sulla privacy per gli Stati Uniti: il getUSPrivacyString() metodo è stato deprecato. Se lo stavi utilizzando per la conformità al CCPA, tieni presente che questo metodo non è più disponibile.
  6. Verifica dei requisiti di consenso: usa il nuovo checkAndOpen(completion:) metodo per determinare automaticamente se è necessario visualizzare il layer di consenso.

Modifiche ai metodi e alle firme

Inizializzazione
  • Vecchia versione: CMPConsentTool(cmpConfig: CmpConfig).initialize()
  • Novità:
    • CMPManager.shared.setUrlConfig(UrlConfig)
    • CMPManager.shared.setPresentingViewController
    • Imposta delegato
Imposta la configurazione dell'interfaccia utente
  • Vecchia versione: .withCmpViewControllerConfigurationBlock { ... }
  • Novità: CMPManager.shared.setWebViewConfig(ConsentLayerUIConfig())
Controlla e apri il layer di consenso
  • Vecchia versione: check({ ... }, isCached: Bool)
  • Novità: checkAndOpen(completion: (Error?) -> Void)
Layer di consenso aperto
  • Vecchia versione: openView()
  • Novità: forceOpen(completion: (Error?) -> Void)
Accetta tutti i consensi
  • Vecchio: acceptAll(onFinish: () -> Void)
  • Novità: acceptAll(completion: (Error?) -> Void)
Rifiuta tutti i consensi
  • Vecchia versione: rejectAll(onFinish: () -> Void)
  • Novità: rejectAll(completion: (Error?) -> Void)
Abilita gli scopi
  • Vecchio: enablePurposeList([String], onFinish: () -> Void)
  • Novità: acceptPurposes([String], updatePurpose: Bool, completion: (Error?) -> Void)
Disabilita scopi
  • Vecchia versione: disablePurposeList([String], onFinish: () -> Void)
  • Novità: rejectPurposes([String], updateVendor: Bool, completion: (Error?) -> Void)
Abilita fornitori
  • Vecchia versione: enableVendorList([String], onFinish: () -> Void)
  • Novità: acceptVendors([String], completion: (Error?) -> Void)
Disabilita fornitori
  • Vecchio: disableVendorList([String], onFinish: () -> Void)
  • Novità: rejectVendors([String], completion: (Error?) -> Void)
Ottieni tutti gli scopi
  • Vecchia versione: getAllPurposes() -> String
  • Novità: getUserStatus() -> [CMPUserStatusResponse]
Obiettivi da raggiungere
  • Vecchio: getEnabledPurposes() -> String
  • Novità: getUserStatus() -> [CMPUserStatusResponse]
Ottieni tutti i fornitori
  • Vecchia versione: getAllVendors() -> String
  • Novità: getUserStatus() -> [CMPUserStatusResponse]
Ottieni fornitori abilitati
  • Vecchia versione: getEnabledVendors() -> String
  • Novità: getUserStatus() -> [CMPUserStatusResponse]
Verifica dello scopo del consenso
  • Vecchio: hasPurposeConsent(String) -> Bool
  • Novità: getStatusForPurpose(id: String) -> [UniqueConsentStatus]
Verifica il consenso del fornitore
  • Vecchio: hasVendorConsent(String) -> Bool
  • Novità: getStatusForVendor(id: String) -> [UniqueConsentStatus]
Esporta stringa CMP
  • Vecchia versione: exportCmpString() -> String
  • Novità: exportCMPInfo() -> String
Importa stringa CMP
  • Vecchio: importCmpString(String, completion: (Error?) -> Void)
  • Novità: importCMPInfo(String, completion: (Error?) -> Void)
Reimposta i dati relativi al consenso
  • Vecchia versione: reset()
  • Novità: resetConsentManagementData(completion: (Error?) -> Void)
Gestione dello stato della modalità di consenso di Google
  • Vecchia versione: withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
  • Novità: getGoogleConsentModeStatus
Gestione del callback onLinkClick
  • Vecchia versione: la v2 aveva una funzione di whitelist. Nella versione attuale, il processo è stato semplificato e l'utente ha il pieno controllo sul comportamento da seguire in base all'URL restituito dal metodo.
cmpConfig.domainWhitelist = ["add your domains to be whitelisted"]

cmpManager.withOnCmpLinkClickListener({ url, decisionHandler in
//check URL and add the nav action
decisionHandler!.pointee = WKNavigationActionPolicy.allow
decisionHandler!.pointee = WKNavigationActionPolicy.cancel
// return shouldCloseWebView (true) or stay open (false)
return true
})
  • Novità: l'utente ha il pieno controllo su quale comportamento seguire in base all'URL. Pertanto, gli URL precedentemente inseriti nella whitelist dovrebbero essere migrati all'interno del metodo callback,
cmpManager.setLinkClickHandler { url in
    // Handle links to specific domains externally. The user has full control over which behavior to follow
    // according to the URL. The previous whitelisted URL's should be migrated to inside the callback method, 
    // and the user has the choice to use a switch-case statement, pattern matching, etc.
    if url.host?.contains("google.com") == true || 
       url.host?.contains("facebook.com") == true {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
        return true // URL handled externally
    }
    
    // Let other URLs load in the WebView
    return false
}

Metodi deprecati:

  • checkIfConsentIsRequired(completion: @escaping (Bool) -> Void)
  • hasUserChoice() -> Bool

  • hasPurposeConsent(id: String) -> Bool

  • hasVendorConsent(id: String) -> Bool

  • openConsentLayer(completion: @escaping (NSError?) -> Void)

  • getAllPurposesIDs() -> [String]

  • getEnabledPurposesIDs() -> [String]

  • getDisabledPurposesIDs() -> [String]

  • getAllVendorsIDs() -> [String]

  • getEnabledVendorsIDs() -> [String]

  • getDisabledVendorsIDs() -> [String]

  • consentRequestedToday() -> Bool
  • isConsentRequired() -> Bool
  • getUSPrivacyString() -> String
  • withCloseListener(() -> Void)
  • withOpenListener(() -> Void)
  • withErrorListener((CmpErrorType, String?) -> Void)
  • withOnCMPNotOpenedListener(() -> Void)
  • withOnCmpButtonClickedCallback((CmpButtonEvent) -> Void)
  • withCmpViewControllerConfigurationBlock((UIViewController?) -> Void)
  • withCmpViewConfigurationBlock((UIView) -> Void)
  • withUpdateGoogleConsent(([String: String]?) -> Void

Nota: il nuovo SDK utilizza un'istanza condivisa (CMPManager.shared) e un modello di delegazione per i callback. Implementa CMPManagerDelegate per la gestione degli eventi.

Esempi di migrazione

Swift

// ============================================
// Previous versions
// ============================================

override func viewDidLoad({
  super.viewDidLoad()
    let vendoradded = NSNotification.Name.CmpConsentVendorAdded;
  NotificationCenter.default.addObserver(self, selector: #selector(handleVendorAdded(notification:)), name: vendoradded, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(handleConsentUpdated(notification:)), name: Notification.Name.CmpConsentConsentChanged, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(handleVendorRemoved(notification:)), name: Notification.Name.CmpConsentVendorRemoved, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(handleConsentUpdated(notification:)), name: Notification.Name.CmpConsentChanged, object: nil)
    setupCmpConfig();

private func setupCmpConfig() {
  let cmpConfig : CmpConfig = CmpConfig.shared.setup(withId: "YOUR_CODE_ID_HERE, domain: myCmpConfig.domain, appName: myCmpConfig.appName, language: myCmpConfig.language);
  cmpConfig.logLevel = CmpLogLevel.verbose;
  cmpManager = CMPConsentTool(cmpConfig: cmpConfig)
    .withErrorListener(onCMPError)
    .withCloseListener(onClose)
    .withOpenListener(onOpen)
    .withOnCMPNotOpenedListener(onCMPNotOpened)
    .withOnCmpButtonClickedCallback(onButtonClickedEvent)
    .withCmpViewControllerConfigurationBlock { viewController in
      viewController?.modalPresentationStyle = .popover
      viewController?.modalTransitionStyle = .crossDissolve
                                              }
  .initialize()
  }

// ============================================
// SDK v3 implementation
// ============================================
                                           
class DemoAppViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        let cmpManager = CMPManager.shared
        cmpManager.setUrlConfig(UrlConfig(id: "YOUR_CODE_ID_HERE", domain: "delivery.consentmanager.net", language: "IT", appName: "CMDemoAppSwift"))
        cmpManager.setWebViewConfig(ConsentLayerUIConfig(
            position: .fullScreen,
            backgroundStyle: .dimmed(.black, 0.5),
            cornerRadius: 5,
            respectsSafeArea: true,
            allowsOrientationChanges: true
        ))

        cmpManager.setPresentingViewController(self)
        cmpManager.delegate = self
        cmpManager.checkAndOpen() { result in
            print("CMPManager initialized and open consent layer opened if necessary")
        }
    }
}

// MARK: - SDK delegates - callbacks
extension DemoAppViewController: CMPManagerDelegate {
    func didChangeATTStatus(oldStatus: Int, newStatus: Int, lastUpdated: Date?) {
        print("DemoApp received a change in the ATTStatus")

    }
    
    func didReceiveError(error: String) {
        print("DemoApp received consent layer error: (error)")
    }
    
    func didReceiveConsent(consent: String, jsonObject: [String : Any]) {
        print("DemoApp received consent.")
    }
    
    func didShowConsentLayer() {
        print("DemoApp displayed Consent Layer.")

    }
  
    func didCloseConsentLayer()
        print("DemoApp received close consent message.")
        
        let homeView = HomeView()
        let hostingController = UIHostingController(rootView: homeView)
        self.view.window?.rootViewController = hostingController
    }
}

Objective-C 

// ==========================================
// Objective-C v3 implementation
// ==========================================

- (void)initializeConsentManager {
    CMPManager *cmpManager = [CMPManager shared];
    [cmpManager setDelegate:self];
    
    UrlConfig *urlConfig = [[UrlConfig alloc] initWithId:@"YOUR_CODE_ID_HERE"
                                                 domain:@"delivery.consentmanager.net"
                                               language:@"EN"
                                                appName:@"CMDemoAppObjC"];
    [cmpManager setUrlConfig:urlConfig];
    
    ConsentLayerUIConfig *uiConfig = [[ConsentLayerUIConfig alloc] initWithPosition:PositionFullScreen
                                                                    backgroundStyle:BackgroundStyleDimmed
                                                                       cornerRadius:5
                                                                   respectsSafeArea:YES
                                                          allowsOrientationChanges:YES];
    [cmpManager setWebViewConfig:uiConfig];
    
    [cmpManager setPresentingViewController:self];
    
    [cmpManager checkAndOpen:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"Error initializing CMPManager: %@", error.localizedDescription);
        } else {
            NSLog(@"CMPManager initialized and open consent layer opened if necessary");
        }
    }];
}

We do our best to keep this purely informative documentation up to date. However, if you notice that any of these guides need a little touch-up, let us know!