Informacia
Treść

[iOS] 0. Przewodnik migracji

Ten przewodnik pomoże Ci przeprowadzić migrację z poprzedniej wersji CMP SDK do obecnej wersji. Omówimy zmiany w nazwach metod, parametrach i nowych lub wycofanych funkcjach. Przykłady aplikacji demonstracyjnych znajdziesz tutaj pod tym linkiem

Należy pamiętać, że ta wersja pakietu CMP SDK została całkowicie przebudowana od podstaw, dlatego stanowi ona istotna zmiana, ponieważ zmieniono nazwy wszystkich metod, zmieniono nazwy sygnatur, a teraz można też skorzystać z wywołań zwrotnych do niemal wszystkich metod. We wszystkich przypadkach, musisz zmodyfikować swój kod i zaktualizować zależności, aby upewnić się, że Twoja aplikacja mobilna działa zgodnie z oczekiwaniami. Warto również wspomnieć, że wszystkie dane zapisane przez poprzednią wersję naszego SDK na urządzeniach użytkowników zostaną usunięte, co zmusi aplikację do ponownie wyświetl warstwę zgody.

Repozytoria

Należy pamiętać, że wszystkie nasze repozytoria zostały zmienione dla iOS SDK. Postępuj zgodnie z poniższymi instrukcjami, aby dowiedzieć się, gdzie skierować swojego menedżera zależności. 

Zauważ również, że nie udostępniaj wersji statycznej naszego niestandardowego frameworka.

kakopod

W pliku Podfile zamień poprzedni wiersz na poniższy:

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

Po dokonaniu zmiany uruchom to w wierszu poleceń:

pod install --repo-update
Menedżer pakietów Swift

Nasz pakiet XCFramework jest teraz hostowany na https://github.com/iubenda/cm-sdk-xcframework-v3.

W XCode przejdź do menu Plik > Dodaj pakiet zależny i wskaż powyższy adres URL.  

Kluczowe punkty migracji

  1. Wzór delegata: Zamiast pojedynczych 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])
      Wyzwala się, gdy warstwa zgody została zamknięta po zaktualizowaniu przez użytkownika swoich zgód LUB podczas wywołania metod powodujących zmiany w zgodach, takich jak acceptAll, rejectAll, acceptVendors, rejectVendors itd. Oznacza to, że użytkownik zaakceptował lub odrzucił część lub wszystkie zgody, a także że zostały one prawidłowo zapisane na urządzeniu.
    2. didShowConsentLayer
      Wyzwala się, 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
      Wyzwalane jest, gdy SDK sprawdza potrzebę zgody, ale nie była ona potrzebna i warstwa nie była wyświetlana. Oznacza to, że w urządzeniu jest już prawidłowa, więc nowa nie jest konieczna i warstwa zgody nie zostanie wyświetlona.
    4. didReceiveError
      Wyzwalane jest to w przypadku, gdy operacja SDK zgłosi błąd.
  2. Osoby odpowiedzialne za realizację: Wiele metod obejmuje teraz obsługę ukończenia dla operacji asynchronicznych. Zaktualizuj swój kod, aby odpowiednio obsługiwać te wywołania zwrotne.
  3. Ciąg zgody: Zastosowanie exportCMPInfo() zamiast getConsentString() aby pobrać informacje o zgodzie.
  4. Zgody na dostawcę i cel: Metody uzyskiwania zgód dostawcy i celu zwracają teraz tablice identyfikatorów. Może być konieczne dostosowanie logiki do obsługi tych tablic.
  5. Łańcuch prywatności w USA: Kurs getUSPrivacyString() metoda została wycofana. Jeśli używałeś jej w celu zachowania zgodności z CCPA, pamiętaj, że ta metoda nie jest już dostępna.
  6. Weryfikacja wymogu zgody: Użyj nowego checkIfConsentIsRequired(completion:) metoda automatycznego określania, czy zgoda jest wymagana przed wyświetleniem warstwy zgody.

Zmiany metod i podpisów

1. Inicjalizacja
  • Stary: CMPConsentTool(cmpConfig: CmpConfig).initialize()
  • Nowość: CMPManager.shared.setUrlConfig(UrlConfig)
2. Ustaw konfigurację interfejsu użytkownika
  • Stary: .withCmpViewControllerConfigurationBlock { ... }
  • Nowość: CMPManager.shared.setWebViewConfig(ConsentLayerUIConfig())
3. Sprawdź i otwórz warstwę zgody
  • Stary: check({ ... }, isCached: Bool)
  • Nowość: checkWithServerAndOpenIfNecessary(completion: (Error?) -> Void)
  • Stary: openView()
  • Nowość: openConsentLayer(completion: (Error?) -> Void)
5. Zaakceptuj wszystkie zgody
  • Stary: acceptAll(onFinish: () -> Void)
  • Nowość: acceptAll(completion: (Error?) -> Void)
6. Odrzuć wszystkie zgody
  • Stary: rejectAll(onFinish: () -> Void)
  • Nowość: rejectAll(completion: (Error?) -> Void)
7. Włącz cele
  • Stary: enablePurposeList([String], onFinish: () -> Void)
  • Nowość: acceptPurposes([String], updatePurpose: Bool, completion: (Error?) -> Void)
8. Wyłącz cele
  • Stary: disablePurposeList([String], onFinish: () -> Void)
  • Nowość: rejectPurposes([String], updateVendor: Bool, completion: (Error?) -> Void)
9. Włącz dostawców
  • Stary: enableVendorList([String], onFinish: () -> Void)
  • Nowość: acceptVendors([String], completion: (Error?) -> Void)
10. Wyłącz dostawców
  • Stary: disableVendorList([String], onFinish: () -> Void)
  • Nowość: rejectVendors([String], completion: (Error?) -> Void)
11. Zdobądź wszystko
  • Stary: getAllPurposes() -> String
  • Nowość: getAllPurposesIDs() -> [String]
12. Uzyskaj włączone cele
  • Stary: getEnabledPurposes() -> String
  • Nowość: getEnabledPurposesIDs() -> [String]
13. Pobierz wszystkich dostawców
  • Stary: getAllVendors() -> String
  • Nowość: getAllVendorsIDs() -> [String]
14. Uzyskaj włączonych dostawców
  • Stary: getEnabledVendors() -> String
  • Nowość: getEnabledVendorsIDs() -> [String]
15. Sprawdź cel zgody
  • Stary: hasPurposeConsent(String) -> Bool
  • Nowość: hasPurposeConsent(id: String) -> Bool
16. Sprawdź zgodę dostawcy
  • Stary: hasVendorConsent(String) -> Bool
  • Nowość: hasVendorConsent(id: String) -> Bool
17. Eksportuj ciąg CMP
  • Stary: exportCmpString() -> String
  • Nowość: exportCMPInfo() -> String
18. Importuj ciąg CMP
  • Stary: importCmpString(String, completion: (Error?) -> Void)
  • Nowość: importCMPInfo(String, completion: (Error?) -> Void)
  • Stary: reset()
  • Nowość: resetConsentManagementData(completion: (Error?) -> Void)

Metody przestarzałe:

  • consentRequestedToday() -> Bool
  • isConsentRequired() -> Bool
  • 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 zestaw SDK korzysta ze współdzielonej instancji (CMPManager.shared) i wzorzec delegata dla wywołań zwrotnych. Implementacja CMPManagerDelegate do obsługi zdarzeń.

Przykłady migracji

Szybki

// ============================================
// 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.checkWithServerAndOpenIfNecessary() { 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 checkWithServerAndOpenIfNecessary:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"Error initializing CMPManager: %@", error.localizedDescription);
        } else {
            NSLog(@"CMPManager initialized and open consent layer opened if necessary");
        }
    }];
}
Powrót do góry