[iOS] 0. Przewodnik po migracji

Ten przewodnik pomoże Ci przejść z poprzedniej wersji CMP SDK do aktualnej. Omówimy zmiany w nazwach metod, parametrach oraz nowych lub wycofanych funkcjach. Przykłady aplikacji demonstracyjnych znajdziesz pod tym linkiem

Należy pamiętać, że ta wersja CMP SDK została całkowicie przebudowana od podstaw, co stanowi znaczącą zmianę, ponieważ wszystkie metody zostały przemianowane, podobnie jak sygnatury, a obecnie oferują one również wywołania zwrotne dla prawie wszystkich metod. We wszystkich przypadkach konieczne będzie zmodyfikowanie kodu i aktualizacja zależności, aby zapewnić prawidłowe działanie aplikacji mobilnej. Ponadto warto wspomnieć, że wszystkie dane zapisane przez poprzednią wersję naszego SDK na urządzeniach użytkowników zostaną usunięte, co spowoduje, że aplikacja ponownie wyświetli warstwę zgody.

Repozytoria

Pamiętaj, że wszystkie nasze repozytoria uległy zmianie w przypadku SDK dla iOS. Postępuj zgodnie z poniższymi instrukcjami, aby dowiedzieć się, gdzie skierować menedżera zależności. 

 Aby uzyskać więcej informacji, zapoznaj się z naszą dokumentacją API. Wszystkie poniższe fragmenty kodu pochodzą z naszej aplikacji demonstracyjnej

Zauważ też, że nie udostępniamy statycznej wersji naszego niestandardowego frameworka.

Cocoapod

W pliku Podfile zastąp poprzednią linię poniższą:

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

Po wprowadzeniu zmian uruchom to w wierszu poleceń:

pod install --repo-update
Swift Package Manager

Nasz pakiet XCFramework jest teraz dostępny na stronie https://github.com/iubenda/cm-sdk-xcframework-v3.

W XCode przejdź do menu Plik > Dodaj zależności pakietu i wskaż powyższy adres URL.  

Kluczowe punkty migracji

  1. Wzorzec delegata: Zamiast indywidualnych słuchaczy, nowa wersja wykorzystuje pojedynczy protokół delegata (CMPManagerDelegate) do obsługi zdarzeń. Zawiera 4 główne zdarzenia:
    1. didReceiveConsent(consent: String, jsonObject: [String : Any])
      Jest to wyzwalane, gdy warstwa zgody została zamknięta po aktualizacji zgód przez użytkownika LUB podczas wywoływania metod powodujących zmiany w zgodach, takich jak acceptAll, rejectAll, acceptVendors, rejectVendors itp. Oznacza to, że użytkownik zaakceptował lub odrzucił część lub wszystkie zgody i że zostały one poprawnie zapisane w urządzeniu.
    2. didShowConsentLayer
      Zostaje to wywołane, gdy warstwa zgody została faktycznie wyświetlona. Oznacza to, że w urządzeniu nie było ważnej zgody, więc należy zebrać nową.
    3. didCloseConsentLayer
      Zostaje to wywołane, gdy SDK sprawdziło potrzebę uzyskania zgody, ale nie była ona wymagana i warstwa nie została wyświetlona. Oznacza to, że w urządzeniu istnieje już ważna zgoda, więc nowa nie jest konieczna, a warstwa zgody nie zostanie wyświetlona.
    4. didReceiveError
      Zostaje to wywołane, gdy operacja SDK wyrzuciła jakikolwiek błąd.
  2. Obsługa zakończenia: Wiele metod zawiera teraz procedury obsługi zakończenia dla operacji asynchronicznych. Zaktualizuj swój kod, aby odpowiednio obsługiwał te wywołania zwrotne.
  3. Tekst zgody: Użyj exportCMPInfo() zamiast getConsentString() , aby pobrać informacje dotyczące zgody.
  4. Zgody dostawców i zgody na cele: Metody uzyskiwania zgód dostawców i zgód na cele zwracają teraz tablice identyfikatorów. Być może konieczne będzie dostosowanie logiki w celu obsługi tych tablic.
  5. Ciąg znaków dotyczący prywatności w USA: getUSPrivacyString() metoda została wycofana. Jeśli korzystałeś z niej w celu zapewnienia zgodności z CCPA, pamiętaj, że ta metoda nie jest już dostępna.
  6. Sprawdzenie wymogu zgody: Użyj nowej checkAndOpen(completion:) metody, aby automatycznie ustalić, czy należy wyświetlić warstwę zgody.

Zmiany metod i podpisów

Inicjalizacja
  • Poprzednio: CMPConsentTool(cmpConfig: CmpConfig).initialize()
  • Nowość:
    • CMPManager.shared.setUrlConfig(UrlConfig)
    • CMPManager.shared.setPresentingViewController
    • Ustaw delegata
Ustaw konfigurację interfejsu użytkownika
  • Stare: .withCmpViewControllerConfigurationBlock { ... }
  • Nowość: CMPManager.shared.setWebViewConfig(ConsentLayerUIConfig())
Sprawdź i otwórz warstwę zgody
  • Stare: check({ ... }, isCached: Bool)
  • Nowość: checkAndOpen(completion: (Error?) -> Void)
Otwarta warstwa zgody
  • Stare: openView()
  • Nowość: forceOpen(completion: (Error?) -> Void)
Zaakceptuj wszystkie zgody
  • Stare: acceptAll(onFinish: () -> Void)
  • Nowość: acceptAll(completion: (Error?) -> Void)
Odrzuć wszystkie zgody
  • Stare: rejectAll(onFinish: () -> Void)
  • Nowość: rejectAll(completion: (Error?) -> Void)
Włącz cele
  • Stare: enablePurposeList([String], onFinish: () -> Void)
  • Nowość: acceptPurposes([String], updatePurpose: Bool, completion: (Error?) -> Void)
Wyłącz cele
  • Stare: disablePurposeList([String], onFinish: () -> Void)
  • Nowość: rejectPurposes([String], updateVendor: Bool, completion: (Error?) -> Void)
Włącz dostawców
  • Stare: enableVendorList([String], onFinish: () -> Void)
  • Nowość: acceptVendors([String], completion: (Error?) -> Void)
Wyłącz dostawców
  • Stare: disableVendorList([String], onFinish: () -> Void)
  • Nowość: rejectVendors([String], completion: (Error?) -> Void)
Uzyskaj wszystkie cele
  • Stare: getAllPurposes() -> String
  • Nowość: getUserStatus() -> [CMPUserStatusResponse]
Cele wdrożenia
  • Stare: getEnabledPurposes() -> String
  • Nowość: getUserStatus() -> [CMPUserStatusResponse]
Pobierz wszystkich dostawców
  • Stare: getAllVendors() -> String
  • Nowość: getUserStatus() -> [CMPUserStatusResponse]
Znajdź zatwierdzonych dostawców
  • Stare: getEnabledVendors() -> String
  • Nowość: getUserStatus() -> [CMPUserStatusResponse]
Sprawdź cel zgody
  • Stare: hasPurposeConsent(String) -> Bool
  • Nowość: getStatusForPurpose(id: String) -> [UniqueConsentStatus]
Sprawdź zgodę dostawcy
  • Stare: hasVendorConsent(String) -> Bool
  • Nowość: getStatusForVendor(id: String) -> [UniqueConsentStatus]
Eksportuj ciąg CMP
  • Stare: exportCmpString() -> String
  • Nowość: exportCMPInfo() -> String
Importuj ciąg CMP
  • Stare: importCmpString(String, completion: (Error?) -> Void)
  • Nowość: importCMPInfo(String, completion: (Error?) -> Void)
Zresetuj dane dotyczące zgody
  • Stare: reset()
  • Nowość: resetConsentManagementData(completion: (Error?) -> Void)
Postępowanie w trybie zgody Google
  • Poprzednio: withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
  • Nowość: getGoogleConsentModeStatus
Obsługa wywołania zwrotnego onLinkClick
  • Stara wersja: w wersji 2 dostępna była funkcja białej listy. W obecnej wersji proces został uproszczony, a użytkownik ma pełną kontrolę nad zachowaniem, które ma zostać zastosowane w zależności od adresu URL zwracanego przez metodę.
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
})
  • Nowość: Użytkownik ma pełną kontrolę nad tym, jakie zachowanie zastosować w zależności od adresu URL. W związku z tym poprzednie adresy URL z białej listy powinny zostać przeniesione do metody wywołania zwrotnego,
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
}

Metody przestarzałe:

  • 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

Uwaga: Nowy SDK wykorzystuje instancję współdzieloną (CMPManager.shared) oraz wzorzec delegata dla wywołań zwrotnych. Zaimplementuj CMPManagerDelegate do obsługi zdarzeń.

Przykłady migracji

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!