Esta guía te ayudará a migrar de la versión anterior del SDK de CMP a la versión actual. Abordaremos los cambios en los nombres de los métodos, los parámetros y las funcionalidades nuevas o obsoletas. Para ver ejemplos de aplicaciones de demostración, consulta este enlace.
Ten en cuenta que esta versión del SDK de CMP se ha rediseñado completamente desde cero, por lo que supone un cambio importante, ya que se han renombrado todos los métodos, al igual que las firmas, y ahora también ofrece callbacks para casi todos los métodos. En todos los casos, tendrás que modificar tu código y actualizar tus dependencias para garantizar que tu aplicación móvil funcione según lo esperado. Además, cabe mencionar que todos los datos almacenados por la versión anterior de nuestro SDK en los dispositivos de los usuarios se borrarán, lo que obligará a la aplicación a volver a mostrar la capa de consentimiento.
Repositorios
Ten en cuenta que todos nuestros repositorios han cambiado para el SDK de iOS. Sigue las instrucciones que aparecen a continuación para saber dónde debe apuntar tu gestor de dependencias.
Para más detalles, consulta nuestra documentación de referencia de la API. Todos los fragmentos de código que aparecen a continuación se han extraído de nuestra aplicación de demostración.
Además, ten en cuenta que no ofrecemos una versión estática de nuestro marco personalizado.
Cocoapod
En tu Podfile, sustituye la línea anterior por la siguiente:
pod 'cm-sdk-ios-v3, '3.8.0'
Después de realizar los cambios, ejecuta esto en la línea de comandos:
pod install --repo-update
Swift Package Manager
Nuestro paquete XCFramework ya está alojado en https://github.com/iubenda/cm-sdk-xcframework-v3.
En XCode, ve al menú Archivo > Añadir dependencia de paquete y dirígete a la URL anterior.
Puntos clave de la migración
-
Patrón de delegado: en lugar de oyentes individuales, la nueva versión utiliza un único protocolo de delegado (
CMPManagerDelegate) para gestionar eventos. Contiene 4 eventos principales:-
didReceiveConsent(consent: String, jsonObject: [String : Any])
Esto se activa cuando se cierra la capa de consentimiento después de que el usuario haya actualizado sus consentimientos O al invocar métodos que provocan cambios en los consentimientos, como acceptAll, rejectAll, acceptVendors, rejectVendors, etc. Significa que el usuario ha aceptado o rechazado algunos o todos los consentimientos, y que estos se han guardado correctamente en el dispositivo. -
didShowConsentLayer
Esto se activa cuando la capa de consentimiento se ha mostrado realmente. Significa que no había un consentimiento válido en el dispositivo, por lo que se debe recabar uno nuevo. -
didCloseConsentLayer
Esto se activa cuando el SDK comprobó la necesidad de un consentimiento, pero no era necesario y la capa no se mostró. Significa que ya hay uno válido en el dispositivo, por lo que no es necesario uno nuevo y la capa de consentimiento no se mostrará. -
didReceiveError
Esto se activa cuando la operación del SDK ha generado algún error.
-
- Manipuladores de finalización: muchos métodos incluyen ahora manipuladores de finalización para operaciones asíncronas. Actualiza tu código para gestionar estas devoluciones de llamada de forma adecuada.
-
Cadena de consentimiento: Utiliza
exportCMPInfo()en lugar degetConsentString()para recuperar la información de consentimiento. - Consentimientos de proveedor y finalidad: Los métodos para obtener los consentimientos de proveedor y finalidad ahora devuelven matrices de ID. Es posible que tengas que ajustar tu lógica para gestionar estas matrices.
-
Cadena de privacidad de EE. UU.: El
getUSPrivacyString()método ha quedado obsoleto. Si lo utilizabas para el cumplimiento de la CCPA, ten en cuenta que este método ya no está disponible. -
Comprobación de requisitos de consentimiento: utiliza el nuevo
checkAndOpen(completion:)método para determinar automáticamente si es necesario mostrar la capa de consentimiento.
Cambios en los métodos y las firmas
Inicialización
- Antiguo:
CMPConsentTool(cmpConfig: CmpConfig).initialize() - Nuevo:
CMPManager.shared.setUrlConfig(UrlConfig)CMPManager.shared.setPresentingViewController- Establecer delegado
Establecer la configuración de la interfaz de usuario
- Antiguo:
.withCmpViewControllerConfigurationBlock { ... } - Nuevo:
CMPManager.shared.setWebViewConfig(ConsentLayerUIConfig())
Comprobar y abrir la capa de consentimiento
- Antiguo:
check({ ... }, isCached: Bool) - Nuevo:
checkAndOpen(completion: (Error?) -> Void)
Capa de consentimiento abierta
- Antiguo:
openView() - Nuevo:
forceOpen(completion: (Error?) -> Void)
Aceptar todos los consentimientos
- Antiguo:
acceptAll(onFinish: () -> Void) - Nuevo:
acceptAll(completion: (Error?) -> Void)
Rechazar todos los consentimientos
- Antiguo:
rejectAll(onFinish: () -> Void) - Nuevo:
rejectAll(completion: (Error?) -> Void)
Habilitar fines
- Antiguo:
enablePurposeList([String], onFinish: () -> Void) - Nuevo:
acceptPurposes([String], updatePurpose: Bool, completion: (Error?) -> Void)
Desactivar fines
- Antiguo:
disablePurposeList([String], onFinish: () -> Void) - Nuevo:
rejectPurposes([String], updateVendor: Bool, completion: (Error?) -> Void)
Habilitar proveedores
- Antiguo:
enableVendorList([String], onFinish: () -> Void) - Nuevo:
acceptVendors([String], completion: (Error?) -> Void)
Desactivar proveedores
- Antiguo:
disableVendorList([String], onFinish: () -> Void) - Novedades:
rejectVendors([String], completion: (Error?) -> Void)
Obtener todos los fines
- Antiguo:
getAllPurposes() -> String - Novedades:
getUserStatus() -> [CMPUserStatusResponse]
Obtener fines habilitados
- Antiguo:
getEnabledPurposes() -> String - Novedades:
getUserStatus() -> [CMPUserStatusResponse]
Obtener todos los proveedores
- Antiguo:
getAllVendors() -> String - Novedades:
getUserStatus() -> [CMPUserStatusResponse]
Consigue proveedores autorizados
- Antiguo:
getEnabledVendors() -> String - Novedades:
getUserStatus() -> [CMPUserStatusResponse]
Comprueba el consentimiento de finalidad
- Antiguo:
hasPurposeConsent(String) -> Bool - Nuevo:
getStatusForPurpose(id: String) -> [UniqueConsentStatus]
Comprueba el consentimiento del proveedor
- Antiguo:
hasVendorConsent(String) -> Bool - Nuevo:
getStatusForVendor(id: String) -> [UniqueConsentStatus]
Exportar cadena CMP
- Antiguo:
exportCmpString() -> String - Novedades:
exportCMPInfo() -> String
Importar cadena CMP
- Antiguo:
importCmpString(String, completion: (Error?) -> Void) - Nuevo:
importCMPInfo(String, completion: (Error?) -> Void)
Restablecer datos de consentimiento
- Antiguo:
reset() - Novedades:
resetConsentManagementData(completion: (Error?) -> Void)
Gestión del estado del modo de consentimiento de Google
- Antiguo:
withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface) - Novedades:
getGoogleConsentModeStatus
Gestión de la llamada de retorno onLinkClick
- Antiguo: la v2 solía tener una función de lista blanca. En la versión actual, el proceso se ha simplificado y el usuario tiene control total sobre el comportamiento a seguir según la URL que devuelve el método.
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
})
- Novedad: El usuario tiene control total sobre qué comportamiento seguir según la URL. Por lo tanto, las URL de la lista blanca anterior deben migrarse al interior del método de 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
}
Métodos obsoletos:
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() -> BoolisConsentRequired() -> BoolgetUSPrivacyString() -> StringwithCloseListener(() -> Void)withOpenListener(() -> Void)withErrorListener((CmpErrorType, String?) -> Void)withOnCMPNotOpenedListener(() -> Void)withOnCmpButtonClickedCallback((CmpButtonEvent) -> Void)withCmpViewControllerConfigurationBlock((UIViewController?) -> Void)withCmpViewConfigurationBlock((UIView) -> Void)withUpdateGoogleConsent(([String: String]?) -> Void
Nota: El nuevo SDK utiliza una instancia compartida (CMPManager.shared) y un patrón de delegado para las devoluciones de llamada. Implementa CMPManagerDelegate para gestionar eventos.
Ejemplos de migración
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");
}
}];
}