Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .github/workflows/sonar.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
pull_request:
branches:
- "**"
push:
branches:
- master

# Cancel in-progress runs when a new workflow with the same group is triggered
concurrency:
Expand All @@ -13,7 +16,7 @@ concurrency:
jobs:
build-and-collect-coverage:
name: Build & Collect Coverage
runs-on: macos-latest
runs-on: macos-15-xlarge
timeout-minutes: 15
steps:
- name: Checkout
Expand All @@ -28,7 +31,7 @@ jobs:
-project Split.xcodeproj \
-scheme Split \
-testPlan "SplitiOSFull" \
-destination 'platform=iOS Simulator,OS=18.4,name=iPhone 16 Pro Max' \
-destination 'platform=iOS Simulator,OS=18.5,name=iPhone 16' \
-enableCodeCoverage YES \
-resultBundlePath build/Logs/Test/TestResults.xcresult \
-derivedDataPath build
Expand Down
3 changes: 3 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
3.5.2: (Dec 18, 2025)
- Fixed issue where targeting rules cache integrity could be lost if a SQLite write failed.

3.5.1: (Dec 17, 2025)
- Fixed issue in encryption mode where SDK cache functionality could not be recovered if the encryption key was removed.

Expand Down
2 changes: 1 addition & 1 deletion Split.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = 'Split'
s.module_name = 'Split'
s.version = '3.5.1'
s.version = '3.5.2'
s.summary = 'iOS SDK for Split'
s.description = <<-DESC
This SDK is designed to work with Split, the platform for controlled rollouts, serving features to your users via the Split feature flag to manage your complete customer experience.
Expand Down
33 changes: 30 additions & 3 deletions Split.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -539,7 +539,6 @@
95649FBA2603F89E006D5E0C /* SplitsBgSyncWorkerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95649FB92603F89E006D5E0C /* SplitsBgSyncWorkerTest.swift */; };
95649FBE260405C7006D5E0C /* MySegmentsBgSyncWorkerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95649FBD260405C7006D5E0C /* MySegmentsBgSyncWorkerTest.swift */; };
9566744729F03662001B4FA5 /* DbCipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95715A8229D23F9600A1B2F9 /* DbCipher.swift */; };
CD311117BB394A70AD6057CD04272DF2 /* DbEncryptionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A0EA0213A424C098E507B2544F5CD6F /* DbEncryptionManager.swift */; };
9566744829F03675001B4FA5 /* SplitEncryptionLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95715A8029D22C1B00A1B2F9 /* SplitEncryptionLevel.swift */; };
956816BE2836C91B00206FC5 /* UniqueKeyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956816BD2836C91B00206FC5 /* UniqueKeyTracker.swift */; };
9569E1CB2784C00B006FC7E5 /* TelemetryConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9569E1CA2784C00B006FC7E5 /* TelemetryConfigHelper.swift */; };
Expand Down Expand Up @@ -1093,6 +1092,14 @@
C526DE4C2D9B09EB0051DAB8 /* ImpressionsPropertiesE2ETest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C526DE4B2D9B09EB0051DAB8 /* ImpressionsPropertiesE2ETest.swift */; };
C52C57292EEB41350064D049 /* EncryptionKeyValidationIntegrationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52C57282EEB41350064D049 /* EncryptionKeyValidationIntegrationTest.swift */; };
C52C572B2EEB41450064D049 /* EncryptionKeyValidationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52C572A2EEB41450064D049 /* EncryptionKeyValidationTest.swift */; };
C53207E72EF44A0700418BB1 /* DbEncryptionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A0EA0213A424C098E507B2544F5CD6F /* DbEncryptionManager.swift */; };
C53207E92EF44A2100418BB1 /* PersistenceBreakerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53207E82EF44A2100418BB1 /* PersistenceBreakerTests.swift */; };
C53207EB2EF44A2F00418BB1 /* PersistenceBreaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53207EA2EF44A2F00418BB1 /* PersistenceBreaker.swift */; };
C53207EC2EF44A2F00418BB1 /* PersistenceBreaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53207EA2EF44A2F00418BB1 /* PersistenceBreaker.swift */; };
C53207EE2EF452C000418BB1 /* CoreDataHelperStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53207ED2EF452C000418BB1 /* CoreDataHelperStub.swift */; };
C53207F12EF456AF00418BB1 /* CoreDataHelperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53207F02EF456AF00418BB1 /* CoreDataHelperTests.swift */; };
C53207F42EF45BC600418BB1 /* PersistentSplitsStorageTransactionalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53207F22EF45BC600418BB1 /* PersistentSplitsStorageTransactionalTests.swift */; };
C53207F52EF45BC600418BB1 /* SplitsPersistenceBreakerIntegrationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53207F32EF45BC600418BB1 /* SplitsPersistenceBreakerIntegrationTest.swift */; };
C539CAB62D88C1F10050C732 /* RuleBasedSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C539CAB52D88C1F10050C732 /* RuleBasedSegment.swift */; };
C539CABE2D88C7410050C732 /* PersistentRuleBasedSegmentsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C539CABC2D88C7410050C732 /* PersistentRuleBasedSegmentsStorage.swift */; };
C539CABF2D88C7410050C732 /* RuleBasedSegmentsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C539CABD2D88C7410050C732 /* RuleBasedSegmentsStorage.swift */; };
Expand Down Expand Up @@ -1196,6 +1203,7 @@
C5E9675F2D3849BE00112DAC /* RolloutDefinitionsCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5E9675E2D3849BE00112DAC /* RolloutDefinitionsCache.swift */; };
C5E967602D3849BE00112DAC /* RolloutDefinitionsCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5E9675E2D3849BE00112DAC /* RolloutDefinitionsCache.swift */; };
C5E967622D395DAA00112DAC /* RolloutCacheManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5E967612D395DAA00112DAC /* RolloutCacheManagerTest.swift */; };
CD311117BB394A70AD6057CD04272DF2 /* DbEncryptionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A0EA0213A424C098E507B2544F5CD6F /* DbEncryptionManager.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -1572,6 +1580,7 @@
59FB7C34220329B900ECC96A /* SplitFactoryBuilderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitFactoryBuilderTests.swift; sourceTree = "<group>"; };
59FB7C3B2203795F00ECC96A /* LocalhostSplitsParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalhostSplitsParser.swift; sourceTree = "<group>"; };
59FB7C3D22037B9400ECC96A /* SpaceDelimitedLocalhostSplitsParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceDelimitedLocalhostSplitsParser.swift; sourceTree = "<group>"; };
5A0EA0213A424C098E507B2544F5CD6F /* DbEncryptionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DbEncryptionManager.swift; sourceTree = "<group>"; };
5B279CF82E340FB900B73A36 /* splitschanges_no_segments.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = splitschanges_no_segments.json; sourceTree = "<group>"; };
5B343EAC2E26E937006BEBE7 /* StorageHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageHelper.swift; sourceTree = "<group>"; };
5B91B8382DDE4A30000510F0 /* SplitDTOTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitDTOTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1758,7 +1767,6 @@
956D17D0260D266E0037F575 /* SplitsChangesCheckerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitsChangesCheckerTest.swift; sourceTree = "<group>"; };
956D17D6260D28320037F575 /* MySegmentsChangeChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MySegmentsChangeChecker.swift; sourceTree = "<group>"; };
95715A8029D22C1B00A1B2F9 /* SplitEncryptionLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitEncryptionLevel.swift; sourceTree = "<group>"; };
5A0EA0213A424C098E507B2544F5CD6F /* DbEncryptionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DbEncryptionManager.swift; sourceTree = "<group>"; };
95715A8229D23F9600A1B2F9 /* DbCipher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DbCipher.swift; sourceTree = "<group>"; };
95715A8429D353C100A1B2F9 /* DbCipherTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DbCipherTest.swift; sourceTree = "<group>"; };
95715A9429DB0ED800A1B2F9 /* InitDbCipherTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InitDbCipherTest.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2000,6 +2008,12 @@
C526DE4B2D9B09EB0051DAB8 /* ImpressionsPropertiesE2ETest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImpressionsPropertiesE2ETest.swift; sourceTree = "<group>"; };
C52C57282EEB41350064D049 /* EncryptionKeyValidationIntegrationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionKeyValidationIntegrationTest.swift; sourceTree = "<group>"; };
C52C572A2EEB41450064D049 /* EncryptionKeyValidationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionKeyValidationTest.swift; sourceTree = "<group>"; };
C53207E82EF44A2100418BB1 /* PersistenceBreakerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceBreakerTests.swift; sourceTree = "<group>"; };
C53207EA2EF44A2F00418BB1 /* PersistenceBreaker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceBreaker.swift; sourceTree = "<group>"; };
C53207ED2EF452C000418BB1 /* CoreDataHelperStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataHelperStub.swift; sourceTree = "<group>"; };
C53207F02EF456AF00418BB1 /* CoreDataHelperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataHelperTests.swift; sourceTree = "<group>"; };
C53207F22EF45BC600418BB1 /* PersistentSplitsStorageTransactionalTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistentSplitsStorageTransactionalTests.swift; sourceTree = "<group>"; };
C53207F32EF45BC600418BB1 /* SplitsPersistenceBreakerIntegrationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitsPersistenceBreakerIntegrationTest.swift; sourceTree = "<group>"; };
C539CAB52D88C1F10050C732 /* RuleBasedSegment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleBasedSegment.swift; sourceTree = "<group>"; };
C539CABC2D88C7410050C732 /* PersistentRuleBasedSegmentsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistentRuleBasedSegmentsStorage.swift; sourceTree = "<group>"; };
C539CABD2D88C7410050C732 /* RuleBasedSegmentsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleBasedSegmentsStorage.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2637,6 +2651,7 @@
3B6DEF0720EA6AE40067435E /* Storage */ = {
isa = PBXGroup;
children = (
C53207EA2EF44A2F00418BB1 /* PersistenceBreaker.swift */,
C5A501C72D88A15600206F82 /* RuleBasedSegments */,
955E122F2BFBC90700AE6D10 /* HashedImpression */,
952E266E2833E4210015D633 /* UniqueKeys */,
Expand Down Expand Up @@ -2676,6 +2691,10 @@
5905D4E3255B2373006DA3B1 /* Storage */ = {
isa = PBXGroup;
children = (
C53207F22EF45BC600418BB1 /* PersistentSplitsStorageTransactionalTests.swift */,
C53207F32EF45BC600418BB1 /* SplitsPersistenceBreakerIntegrationTest.swift */,
C53207F02EF456AF00418BB1 /* CoreDataHelperTests.swift */,
C53207E82EF44A2100418BB1 /* PersistenceBreakerTests.swift */,
C52C572A2EEB41450064D049 /* EncryptionKeyValidationTest.swift */,
599407DF22403BE9003B85CC /* SplitsStorageTrafficTypesTests.swift */,
59F65F002562FF71005FE8C9 /* EventDaoTest.swift */,
Expand Down Expand Up @@ -2719,6 +2738,7 @@
5905D4E6255B23C8006DA3B1 /* Storage */ = {
isa = PBXGroup;
children = (
C53207ED2EF452C000418BB1 /* CoreDataHelperStub.swift */,
C539CAC22D88C7570050C732 /* PersistentRuleBasedSegmentsStorageStub.swift */,
C539CAC32D88C7570050C732 /* RuleBasedSegmentsStorageStub.swift */,
C5A501D82D88A7E900206F82 /* RuleBasedSegmentDaoStub.swift */,
Expand Down Expand Up @@ -4416,6 +4436,7 @@
5905D4D82555FE74006DA3B1 /* SplitDatabase.swift in Sources */,
952FA12B2A2E593900264AB5 /* SplitComponentCatalog.swift in Sources */,
5BD767402E64B6F800F9EFBD /* FallbackTreatmentsCalculator.swift in Sources */,
C53207EB2EF44A2F00418BB1 /* PersistenceBreaker.swift in Sources */,
59B2042724F4171E0092F2E9 /* SyncUpdateWorker.swift in Sources */,
955428D6256810D300331356 /* ImpressionDao.swift in Sources */,
950B7417268F4716005FD649 /* ImpressionsMode.swift in Sources */,
Expand Down Expand Up @@ -4622,6 +4643,7 @@
952E26752833FF3F0015D633 /* UniqueKeyDaoStub.swift in Sources */,
59ED408F24F06EC100EF7B09 /* TimersManagerTest.swift in Sources */,
59D84BE7221AE775003DA248 /* LocalhostManagerTests.swift in Sources */,
C53207F12EF456AF00418BB1 /* CoreDataHelperTests.swift in Sources */,
C539CAE22D9477770050C732 /* PropertyValidatorStub.swift in Sources */,
955B596C2816BC0C00D105CD /* MultiClientEvaluationTest.swift in Sources */,
59FB7C35220329B900ECC96A /* SplitFactoryBuilderTests.swift in Sources */,
Expand Down Expand Up @@ -4656,6 +4678,7 @@
9502B7B42837E70200B779C0 /* UniqueTrackerTest.swift in Sources */,
952BF5F8278DF57D00FF6181 /* TelemetryIntegrationTest.swift in Sources */,
59F4AAA124FFC94100A1C69A /* NotificationManagerKeeperTest.swift in Sources */,
C53207E92EF44A2100418BB1 /* PersistenceBreakerTests.swift in Sources */,
955E12372BFCDEAC00AE6D10 /* HashedImpressionDaoMock.swift in Sources */,
95ABF4FC29369B73006ED016 /* TelemetrySynchronizerStub.swift in Sources */,
5BF52DF92DE4B8D400FEDAFE /* PrerequisitesMatcherTest.swift in Sources */,
Expand Down Expand Up @@ -4759,6 +4782,8 @@
592C6AC4211B718E002D120C /* RegexTest.swift in Sources */,
9500D9922C56F9BA00383593 /* HostDomainFilterTests.swift in Sources */,
95F3F0282590D81B00084AF8 /* ImpressionsRecorderWorkerTests.swift in Sources */,
C53207F42EF45BC600418BB1 /* PersistentSplitsStorageTransactionalTests.swift in Sources */,
C53207F52EF45BC600418BB1 /* SplitsPersistenceBreakerIntegrationTest.swift in Sources */,
955E12312BFBEA8600AE6D10 /* HashedImpressionDaoTest.swift in Sources */,
95342E992A4C71300045B201 /* FeatureFlagsPayloadDecoderMock.swift in Sources */,
9577A8472683B8C800D92AE1 /* HttpImpressionsCountRecorderTests.swift in Sources */,
Expand Down Expand Up @@ -4809,6 +4834,7 @@
5982D938219F57BE00230F44 /* FileHelper.swift in Sources */,
95B180272763DA0E002DC9DF /* HttpTelemetryConfigRecorderTest.swift in Sources */,
C5977C202BF29F5B003E293A /* EqualToSemverMatcherTest.swift in Sources */,
C53207EE2EF452C000418BB1 /* CoreDataHelperStub.swift in Sources */,
C5A7D5532DD672CF0081D190 /* RuleBasedSegmentsIntegrationTest.swift in Sources */,
59ED408424EAB8C900EF7B09 /* PushNotificationManagerTest.swift in Sources */,
95F7BC292C46A4C800C5F2E4 /* SecurityHelper.swift in Sources */,
Expand Down Expand Up @@ -5181,7 +5207,8 @@
95B02D9B28D0BDC30030EC8B /* DataResult.swift in Sources */,
958AD2132CA457C100E3DD43 /* RetryableSegmentsSyncWorker.swift in Sources */,
9566744729F03662001B4FA5 /* DbCipher.swift in Sources */,
CD311117BB394A70AD6057CD04272DF2 /* DbEncryptionManager.swift in Sources */,
C53207E72EF44A0700418BB1 /* DbEncryptionManager.swift in Sources */,
C53207EC2EF44A2F00418BB1 /* PersistenceBreaker.swift in Sources */,
95B02D9C28D0BDC30030EC8B /* ServiceEndpoints.swift in Sources */,
95B02D9D28D0BDC30030EC8B /* Endpoint.swift in Sources */,
95B02D9E28D0BDC30030EC8B /* EndpointFactory.swift in Sources */,
Expand Down
17 changes: 13 additions & 4 deletions Split/Api/SplitDatabaseHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,13 @@ struct SplitDatabaseHelper {
DefaultFlagSetsCache(setsInFilter: splitClientConfig.bySetsFilter()?.values.asSet())
let persistentSplitsStorage = DefaultPersistentSplitsStorage(database: splitDatabase)
let generalInfoStorage = openGeneralInfoStorage(database: splitDatabase)
let splitsStorage = openSplitsStorage(database: splitDatabase, flagSetsCache: flagSetsCache, generalInfoStorage: generalInfoStorage)

// Create shared persistence breaker for targeting rules (splits + RBS)
let targetingRulesPersistenceBreaker = DefaultPersistenceBreaker()
let splitsStorage = openSplitsStorage(database: splitDatabase,
flagSetsCache: flagSetsCache,
generalInfoStorage: generalInfoStorage,
persistenceBreaker: targetingRulesPersistenceBreaker)

let persistentImpressionsStorage = openPersistentImpressionsStorage(database: splitDatabase)
let impressionsStorage = openImpressionsStorage(persistentStorage: persistentImpressionsStorage)
Expand Down Expand Up @@ -139,7 +145,8 @@ struct SplitDatabaseHelper {
hashedImpressionsStorage: hashedImpressionsStorage,
generalInfoStorage: generalInfoStorage,
ruleBasedSegmentsStorage: ruleBasedSegmentsStorage,
persistentRuleBasedSegmentsStorage: persistentRuleBasedSegmentsStorage)
persistentRuleBasedSegmentsStorage: persistentRuleBasedSegmentsStorage,
targetingRulesPersistenceBreaker: targetingRulesPersistenceBreaker)
}

static func openDatabase(dataFolderName: String,
Expand All @@ -158,9 +165,11 @@ struct SplitDatabaseHelper {
}

static func openSplitsStorage(database: SplitDatabase,
flagSetsCache: FlagSetsCache, generalInfoStorage: GeneralInfoStorage) -> SplitsStorage {
flagSetsCache: FlagSetsCache, generalInfoStorage: GeneralInfoStorage,
persistenceBreaker: PersistenceBreaker) -> SplitsStorage {
return DefaultSplitsStorage(persistentSplitsStorage: openPersistentSplitsStorage(database: database),
flagSetsCache: flagSetsCache, GeneralInfoStorage: generalInfoStorage)
flagSetsCache: flagSetsCache, generalInfoStorage: generalInfoStorage,
persistenceBreaker: persistenceBreaker)
}

static func openPersistentMySegmentsStorage(database: SplitDatabase) -> PersistentMySegmentsStorage {
Expand Down
2 changes: 1 addition & 1 deletion Split/Common/Utils/Version.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation
class Version {
private static let kSdkPlatform: String = "ios"

private static let kVersion = "3.5.1"
private static let kVersion = "3.5.2"

static var semantic: String {
return kVersion
Expand Down
1 change: 1 addition & 0 deletions Split/Network/Sync/SyncCommons.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ struct SplitStorageContainer {
let generalInfoStorage: GeneralInfoStorage
let ruleBasedSegmentsStorage: RuleBasedSegmentsStorage
let persistentRuleBasedSegmentsStorage: PersistentRuleBasedSegmentsStorage
let targetingRulesPersistenceBreaker: PersistenceBreaker
}

protocol ImpressionLogger {
Expand Down
Loading
Loading