[iOS] 0. Migreringsguide

Denna guide hjälper dig att migrera från den tidigare versionen av CMP SDK till den aktuella versionen. Vi går igenom ändringarna i metodnamn, parametrar samt nya eller utfasade funktioner. För exempel på demoappar, vänligen klicka på denna länk

Observera att denna version av CMP SDK har byggts om helt från grunden, vilket innebär en stor förändring, eftersom alla metoder har bytt namn, liksom signaturerna, och nu erbjuder återkopplingar till nästan alla metoder. I alla fall måste du ändra din kod och uppdatera dina beroenden för att säkerställa att din mobilapp fungerar som förväntat. Dessutom är det värt att nämna att alla data som lagrats av den tidigare versionen av vårt SDK på användarnas enheter kommer att raderas, vilket tvingar appen att visa samtyckeslagret på nytt.

Arkiv

Observera att alla våra arkiv har ändrats för iOS SDK. Följ instruktionerna nedan för att ta reda på vart du ska peka din beroendahanterare. 

 För mer information, se vår API-referensdokumentation. Alla kodutdrag nedan är hämtade från vår demoapp

Observera också att vi inte tillhandahåller en statisk version av vårt anpassade ramverk.

Cocoapod

I din Podfile ersätter du den tidigare raden med den nedan:

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

Efter ändringen kör du detta på kommandoraden:

pod install --repo-update
Swift Package Manager

Vårt XCFramework-paket finns nu på https://github.com/iubenda/cm-sdk-xcframework-v3.

I XCode går du till menyn Arkiv > Lägg till paketberoenden och pekar på URL:en ovan.  

Viktiga punkter vid migrering

  1. Delegatmönster: Istället för enskilda lyssnare använder den nya versionen ett enda delegatprotokoll (CMPManagerDelegate) för hantering av händelser. Den innehåller fyra huvudhändelser:
    1. didReceiveConsent(consent: String, jsonObject: [String : Any])
      Detta utlöses när samtyckeslagret stängdes efter att användaren uppdaterat sina samtycken ELLER när metoder anropas som orsakar ändringar i samtyckena, som acceptAll, rejectAll, acceptVendors, rejectVendors osv. Det innebär att användaren har godkänt eller avvisat vissa eller alla samtycken, och att dessa har sparats korrekt på enheten.
    2. didShowConsentLayer
      Detta utlöses när samtyckeslagret faktiskt visades. Det innebär att det inte fanns ett giltigt samtycke i enheten, så ett nytt bör samlas in.
    3. didCloseConsentLayer
      Detta utlöses när SDK kontrollerade behovet av ett samtycke, men det behövdes inte och lagret visades inte. Det betyder att det redan finns ett giltigt samtycke i enheten, så ett nytt är inte nödvändigt och samtyckeslagret kommer inte att visas.
    4. didReceiveError
      Detta utlöses när SDK-operationen har genererat ett fel.
  2. Kompletteringshanterare: Många metoder inkluderar nu kompletteringshanterare för asynkrona operationer. Uppdatera din kod för att hantera dessa återanrop på rätt sätt.
  3. Samtyckestexten: Använd exportCMPInfo() istället för getConsentString() för att hämta samtyckesinformationen.
  4. Samtycke från leverantör och ändamål: Metoderna för att få samtycke från leverantör och ändamål returnerar nu ID-matriser. Du kan behöva justera din logik för att hantera dessa matriser.
  5. US Privacy String: getUSPrivacyString() metoden har fasats ut. Om du använde den för att uppfylla CCPA-kraven, vänligen notera att den här metoden inte längre är tillgänglig.
  6. Kontroll av samtyckeskrav: Använd den nya checkAndOpen(completion:) metoden för att automatiskt avgöra om samtyckeslagret behöver visas.

Ändringar av metoder och signaturer

Initialisering
  • Gammal: CMPConsentTool(cmpConfig: CmpConfig).initialize()
  • Nytt:
    • CMPManager.shared.setUrlConfig(UrlConfig)
    • CMPManager.shared.setPresentingViewController
    • Ställ in delegat
Ställ in UI-konfiguration
  • Gammalt: .withCmpViewControllerConfigurationBlock { ... }
  • Nytt: CMPManager.shared.setWebViewConfig(ConsentLayerUIConfig())
Kontrollera och öppna samtyckeslagret
  • Gammalt: check({ ... }, isCached: Bool)
  • Nytt: checkAndOpen(completion: (Error?) -> Void)
Öppet samtyckeslager
  • Gammalt: openView()
  • Nytt: forceOpen(completion: (Error?) -> Void)
Acceptera alla samtycken
  • Gammalt: acceptAll(onFinish: () -> Void)
  • Nytt: acceptAll(completion: (Error?) -> Void)
Avvisa alla samtycken
  • Gammalt: rejectAll(onFinish: () -> Void)
  • Nytt: rejectAll(completion: (Error?) -> Void)
Aktivera syften
  • Gammalt: enablePurposeList([String], onFinish: () -> Void)
  • Nytt: acceptPurposes([String], updatePurpose: Bool, completion: (Error?) -> Void)
Inaktivera syften
  • Gammalt: disablePurposeList([String], onFinish: () -> Void)
  • Nytt: rejectPurposes([String], updateVendor: Bool, completion: (Error?) -> Void)
Aktivera leverantörer
  • Gammalt: enableVendorList([String], onFinish: () -> Void)
  • Nytt: acceptVendors([String], completion: (Error?) -> Void)
Inaktivera leverantörer
  • Gammalt: disableVendorList([String], onFinish: () -> Void)
  • Nytt: rejectVendors([String], completion: (Error?) -> Void)
Få alla syften
  • Gammalt: getAllPurposes() -> String
  • Nytt: getUserStatus() -> [CMPUserStatusResponse]
Aktivera syften
  • Gammalt: getEnabledPurposes() -> String
  • Nytt: getUserStatus() -> [CMPUserStatusResponse]
Hämta alla leverantörer
  • Gammalt: getAllVendors() -> String
  • Nytt: getUserStatus() -> [CMPUserStatusResponse]
Bli godkänd leverantör
  • Gammalt: getEnabledVendors() -> String
  • Nytt: getUserStatus() -> [CMPUserStatusResponse]
Kontrollera syfte och samtycke
  • Gammalt: hasPurposeConsent(String) -> Bool
  • Nytt: getStatusForPurpose(id: String) -> [UniqueConsentStatus]
Kontrollera leverantörens samtycke
  • Gammalt: hasVendorConsent(String) -> Bool
  • Nytt: getStatusForVendor(id: String) -> [UniqueConsentStatus]
Exportera CMP-sträng
  • Gammalt: exportCmpString() -> String
  • Nytt: exportCMPInfo() -> String
Importera CMP-sträng
  • Gammalt: importCmpString(String, completion: (Error?) -> Void)
  • Nytt: importCMPInfo(String, completion: (Error?) -> Void)
Återställ samtyckesdata
  • Gammalt: reset()
  • Nytt: resetConsentManagementData(completion: (Error?) -> Void)
Hantera status för Googles samtyckesläge
  • Gammal: withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
  • New: getGoogleConsentModeStatus
Hantera onLinkClick-callback
  • Gammalt: v2 hade tidigare en vitlista-funktion. I den aktuella versionen har processen förenklats och användaren har full kontroll över beteendet som ska följas enligt den URL som returneras från metoden.
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
})
  • Nytt: Användaren har full kontroll över vilket beteende som ska följas beroende på URL:en. Därför bör de tidigare vitlistade URL:erna flyttas in i callback-metoden,
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
}

Föråldrade metoder:

  • 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

Obs: Det nya SDK:t använder en delad instans (CMPManager.shared) och ett delegatmönster för återanrop. Implementera CMPManagerDelegate för hantering av händelser.

Exempel på migrering

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!