Ce guide vous aidera à migrer de la version précédente du SDK CMP vers la version actuelle. Nous aborderons les changements apportés aux noms de méthodes, aux paramètres, ainsi que les fonctionnalités nouvelles ou obsolètes. Pour des exemples d'applications de démonstration, veuillez consulter ce lien.
Veuillez noter que cette version du SDK CMP a été entièrement refondue, ce qui représente un changement majeur, car toutes les méthodes ont été renommées, tout comme les signatures, et propose désormais des callbacks pour presque toutes les méthodes. Dans tous les cas, vous devrez modifier votre code et mettre à jour vos dépendances pour vous assurer que votre application mobile fonctionne comme prévu. De plus, il convient de mentionner que toutes les données conservées par la version précédente de notre SDK sur les appareils des utilisateurs seront effacées, ce qui obligera l'application à afficher à nouveau la couche de consentement.
Référentiels
Veuillez noter que tous nos référentiels ont changé pour le SDK iOS. Suivez les instructions ci-dessous pour savoir où pointer votre gestionnaire de dépendances.
Pour plus de détails, veuillez consulter notre documentation de référence API. Tous les extraits de code ci-dessous ont été extraits de notre application de démonstration.
Notez également que nous ne fournissons pas de version statique de notre framework personnalisé.
Cocoapod
Dans votre Podfile, remplacez la ligne précédente par celle ci-dessous :
pod 'cm-sdk-ios-v3, '3.8.0'
Après avoir effectué les modifications, exécutez cette commande en ligne de commande :
pod install --repo-update
Swift Package Manager
Notre package XCFramework est désormais hébergé sur https://github.com/iubenda/cm-sdk-xcframework-v3.
Dans XCode, allez dans le menu Fichier > Ajouter une dépendance de paquet et indiquez l'URL ci-dessus.
Points clés de la migration
-
Modèle de délégué : au lieu d'utilisateurs individuels, la nouvelle version utilise un protocole de délégué unique (
CMPManagerDelegate) pour la gestion des événements. Il contient 4 événements principaux :-
didReceiveConsent(consent: String, jsonObject: [String : Any])
Celui-ci est déclenché lorsque la couche de consentement a été fermée après que l'utilisateur a mis à jour ses consentements OU lors de l'appel de méthodes entraînant des modifications des consentements, telles que acceptAll, rejectAll, acceptVendors, rejectVendors, etc. Cela signifie que l'utilisateur a accepté ou rejeté tout ou partie des consentements, et que ceux-ci ont été correctement enregistrés sur l'appareil. -
didShowConsentLayer
Ceci est déclenché lorsque la couche de consentement a effectivement été affichée. Cela signifie qu'il n'y avait pas de consentement valide sur l'appareil, et qu'un nouveau doit donc être recueilli. -
didCloseConsentLayer
Ceci est déclenché lorsque le SDK a vérifié la nécessité d'un consentement, mais qu'il n'était pas nécessaire et que la couche n'a pas été affichée. Cela signifie qu'il existe déjà un consentement valide sur l'appareil, donc un nouveau n'est pas nécessaire et la couche de consentement ne s'affichera pas. -
didReceiveError
Ceci est déclenché lorsque l'opération du SDK a généré une erreur.
-
- Gestionnaires de fin d'opération : de nombreuses méthodes incluent désormais des gestionnaires de fin d'opération pour les opérations asynchrones. Mettez à jour votre code pour gérer ces rappels de manière appropriée.
-
Chaîne de consentement : utilisez
exportCMPInfo()au lieu degetConsentString()pour récupérer les informations de consentement. - Consentements relatifs aux fournisseurs et aux finalités : les méthodes permettant d'obtenir les consentements relatifs aux fournisseurs et aux finalités renvoient désormais des tableaux d'identifiants. Vous devrez peut-être adapter votre logique pour gérer ces tableaux.
-
Chaîne de confidentialité aux États-Unis : la
getUSPrivacyString()méthode est désormais obsolète. Si vous l'utilisiez pour la conformité au CCPA, veuillez noter que cette méthode n'est plus disponible. -
Vérification des exigences en matière de consentement : utilisez la nouvelle
checkAndOpen(completion:)méthode pour déterminer automatiquement si la fenêtre de consentement doit s'afficher.
Modifications des méthodes et des signatures
Initialisation
- Ancien :
CMPConsentTool(cmpConfig: CmpConfig).initialize() - Nouveau :
CMPManager.shared.setUrlConfig(UrlConfig)CMPManager.shared.setPresentingViewController- Définir le délégué
Définir la configuration de l'interface utilisateur
- Ancien :
.withCmpViewControllerConfigurationBlock { ... } - Nouveau :
CMPManager.shared.setWebViewConfig(ConsentLayerUIConfig())
Vérifier et ouvrir la couche de consentement
- Ancien :
check({ ... }, isCached: Bool) - Nouveau :
checkAndOpen(completion: (Error?) -> Void)
Couche de consentement ouverte
- Ancien :
openView() - Nouveau :
forceOpen(completion: (Error?) -> Void)
Accepter tous les consentements
- Ancien :
acceptAll(onFinish: () -> Void) - Nouveau :
acceptAll(completion: (Error?) -> Void)
Refuser tous les consentements
- Ancien :
rejectAll(onFinish: () -> Void) - Nouveau :
rejectAll(completion: (Error?) -> Void)
Activer les objectifs
- Ancien :
enablePurposeList([String], onFinish: () -> Void) - Nouveau :
acceptPurposes([String], updatePurpose: Bool, completion: (Error?) -> Void)
Désactiver les finalités
- Ancien :
disablePurposeList([String], onFinish: () -> Void) - Nouveau :
rejectPurposes([String], updateVendor: Bool, completion: (Error?) -> Void)
Activer les fournisseurs
- Ancien :
enableVendorList([String], onFinish: () -> Void) - Nouveau :
acceptVendors([String], completion: (Error?) -> Void)
Désactiver les fournisseurs
- Ancien :
disableVendorList([String], onFinish: () -> Void) - Nouveau :
rejectVendors([String], completion: (Error?) -> Void)
Obtenir tous les objectifs
- Ancien :
getAllPurposes() -> String - Nouveau :
getUserStatus() -> [CMPUserStatusResponse]
Obtenir les objectifs
- Ancien :
getEnabledPurposes() -> String - Nouveau :
getUserStatus() -> [CMPUserStatusResponse]
Obtenir tous les fournisseurs
- Ancien :
getAllVendors() -> String - Nouveau :
getUserStatus() -> [CMPUserStatusResponse]
Obtenir des fournisseurs agréés
- Ancien :
getEnabledVendors() -> String - Nouveau :
getUserStatus() -> [CMPUserStatusResponse]
Vérifiez le consentement à des fins spécifiques
- Ancien :
hasPurposeConsent(String) -> Bool - Nouveau :
getStatusForPurpose(id: String) -> [UniqueConsentStatus]
Vérifier le consentement du fournisseur
- Ancien :
hasVendorConsent(String) -> Bool - Nouveau :
getStatusForVendor(id: String) -> [UniqueConsentStatus]
Exporter la chaîne CMP
- Ancien :
exportCmpString() -> String - Nouveau :
exportCMPInfo() -> String
Importer une chaîne CMP
- Ancien :
importCmpString(String, completion: (Error?) -> Void) - Nouveau :
importCMPInfo(String, completion: (Error?) -> Void)
Réinitialiser les données de consentement
- Ancien :
reset() - Nouveau :
resetConsentManagementData(completion: (Error?) -> Void)
Gestion du statut du mode de consentement de Google
- Ancien :
withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface) - Nouveau :
getGoogleConsentModeStatus
Gestion du callback onLinkClick
- Ancien : la version 2 disposait d'une fonctionnalité de liste blanche. Dans la version actuelle, le processus a été simplifié et l'utilisateur a un contrôle total sur le comportement à adopter en fonction de l'URL renvoyée par la méthode.
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
})
- Nouveau : l'utilisateur a le contrôle total du comportement à adopter en fonction de l'URL. Ainsi, les URL précédemment mises sur liste blanche doivent être migrées vers la méthode de rappel,
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éthodes obsolètes :
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
Remarque : le nouveau SDK utilise une instance partagée (CMPManager.shared) et un modèle de délégué pour les rappels. Implémentez CMPManagerDelegate pour la gestion des événements.
Exemples de migration
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");
}
}];
}