From 9dbdda20202d7af5291c539a1870b1b3bdbd2b72 Mon Sep 17 00:00:00 2001 From: William Van Haevre Date: Thu, 8 Jan 2026 17:28:40 +0100 Subject: [PATCH 1/4] Pass convivaMetadata to the connector constructor. This metadata will be persistent across sessions, to align with the other platforms. --- Code/Conviva/Source/Base/ConvivaConnector.swift | 7 ++++--- Code/Conviva/Source/Base/ConvivaStorage.swift | 8 +++++++- .../Base/Events/ConvivaHandlers/PlayerHandler.swift | 11 +++++++---- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Code/Conviva/Source/Base/ConvivaConnector.swift b/Code/Conviva/Source/Base/ConvivaConnector.swift index 3947bb8f..5b5b8d83 100644 --- a/Code/Conviva/Source/Base/ConvivaConnector.swift +++ b/Code/Conviva/Source/Base/ConvivaConnector.swift @@ -24,13 +24,14 @@ public class ConvivaConnector { public convenience init?( configuration: ConvivaConfiguration, player: THEOplayer, + convivaMetadata: [String: Any] = [:], externalEventDispatcher: THEOplayerSDK.EventDispatcherProtocol? = nil ) { guard let endPoints = ConvivaEndpoints(configuration: configuration) else { return nil } - self.init(conviva: endPoints, player: player, externalEventDispatcher: externalEventDispatcher) + self.init(conviva: endPoints, player: player, convivaMetadata: convivaMetadata, externalEventDispatcher: externalEventDispatcher) } - init(conviva: ConvivaEndpoints, player: THEOplayer, externalEventDispatcher: THEOplayerSDK.EventDispatcherProtocol? = nil) { + init(conviva: ConvivaEndpoints, player: THEOplayer, convivaMetadata: [String: Any], externalEventDispatcher: THEOplayerSDK.EventDispatcherProtocol? = nil) { self.endPoints = conviva // App level handling @@ -38,7 +39,7 @@ public class ConvivaConnector { self.appEventForwarder = AppEventForwarder(handler: self.appHandler) // Player level handling - self.playerHandler = PlayerHandler(endpoints: self.endPoints, storage: self.storage) + self.playerHandler = PlayerHandler(endpoints: self.endPoints, storage: self.storage, convivaMetadata: convivaMetadata) self.playerEventForwarder = PlayerEventForwarder(player: player, handler: self.playerHandler) // Ad level handling diff --git a/Code/Conviva/Source/Base/ConvivaStorage.swift b/Code/Conviva/Source/Base/ConvivaStorage.swift index d20afce9..fd5c35b9 100644 --- a/Code/Conviva/Source/Base/ConvivaStorage.swift +++ b/Code/Conviva/Source/Base/ConvivaStorage.swift @@ -5,6 +5,12 @@ class ConvivaStorage { private(set) var metrics: [String:Any] = [:] private(set) var metadata: [String:Any] = [:] + private(set) var persistentMetadata: [String:Any] = [:] + + // MARK: PERSISTENT METADATA + func storePersistentMetadata(_ map: [String:Any]) { + persistentMetadata = map + } // MARK: METADATA func storeMetadataEntry(key: String, value: Any) { @@ -18,7 +24,7 @@ class ConvivaStorage { } func metadataEntryForKey(_ key: String) -> Any? { - return self.metadata[key] + return self.metadata[key] ?? self.persistentMetadata[key] } func hasMetadataEntryForKey(_ key: String) -> Bool { diff --git a/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift b/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift index 182c0cd1..30b8e343 100644 --- a/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift +++ b/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift @@ -36,9 +36,12 @@ class PlayerHandler { private weak var storage: ConvivaStorage? private var playerState: PlayerState = .CONVIVA_UNKNOWN - init(endpoints: ConvivaEndpoints, storage: ConvivaStorage) { + init(endpoints: ConvivaEndpoints, storage: ConvivaStorage, convivaMetadata: [String:Any]) { self.endpoints = endpoints self.storage = storage + + // store initial metadata as persistent metadata + self.storage?.storePersistentMetadata(convivaMetadata) } func setContentInfo(_ contentInfo: [String: Any]) { @@ -71,12 +74,12 @@ class PlayerHandler { log("handling maybeReportPlaybackRequested") guard !self.currentConvivaSession.started else { return } - // collect standard metadata like playerName, assetName, stramUrl, isLive, ... + // collect and send standard metadata like playerName, assetName, streamUrl, isLive, ... self.updateMetadata() - // start session on conviva + // start session on conviva and send persistent metadata if let storage = self.storage { - self.endpoints?.videoAnalytics.reportPlaybackRequested(storage.metadata) + self.endpoints?.videoAnalytics.reportPlaybackRequested(storage.persistentMetadata) } // mark conviva session as started From 0b0996d0d409e3f1ed94d2b6084c83290c0c0cc5 Mon Sep 17 00:00:00 2001 From: William Van Haevre Date: Thu, 8 Jan 2026 17:29:31 +0100 Subject: [PATCH 2/4] Also check passed metadata for assetName --- .../Source/Base/Events/ConvivaHandlers/PlayerHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift b/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift index 30b8e343..8b4b7b03 100644 --- a/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift +++ b/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift @@ -246,7 +246,7 @@ class PlayerHandler { var metadata: [String: Any] = [ CIS_SSDK_METADATA_PLAYER_NAME: self.storage?.metadataEntryForKey(CIS_SSDK_METADATA_PLAYER_NAME) ?? Utilities.playerName, CIS_SSDK_METADATA_STREAM_URL: url, - CIS_SSDK_METADATA_ASSET_NAME: convivaSessionSource.description.metadata?.title ?? Utilities.defaultStringValue, + CIS_SSDK_METADATA_ASSET_NAME: self.storage?.metadataEntryForKey(CIS_SSDK_METADATA_ASSET_NAME) ?? convivaSessionSource.description.metadata?.title ?? Utilities.defaultStringValue, ] let adDescriptionMetadata: [String: Any] = collectAdDescriptionMetadata(from: convivaSessionSource.description) From 823435cfc81fa98dc4c5c55eccf83fb993961b58 Mon Sep 17 00:00:00 2001 From: William Van Haevre Date: Thu, 8 Jan 2026 17:56:20 +0100 Subject: [PATCH 3/4] Add changelog entry --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e9083e9..7edcc761 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Fixed + +- Conviva + - Fixed an issue where the initial metadata passed to the convivaConnector was not persistent across Conviva sessions. + ## [10.7.0] - 2025-12-18 ### Changed From bf8a5c1c648176e2ccb006d1cac4aefd66518c7d Mon Sep 17 00:00:00 2001 From: William Van Haevre Date: Fri, 9 Jan 2026 12:24:49 +0100 Subject: [PATCH 4/4] Add changelog entry for coincidental fix on AssetName --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7edcc761..67eb1a9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Conviva - Fixed an issue where the initial metadata passed to the convivaConnector was not persistent across Conviva sessions. + - Fixed an issue where the session's assetName was not configurable by setContentInfo, which has higher precedence than source.metadata.title. ## [10.7.0] - 2025-12-18