Native Collector API v3
In Summer 2023, we introduced a new major version of our iOS and Android collectors (v3). This doc describes the changes in this release.
Specific migration guides for each platform can be found here: iOS, Android
Why did we introduce a new major version?
We wanted to improve our API in the following ways:
- Provide a clear separation of config and metadata
- Streamline collector behaviour in iOS and Android
- Use more intuitive field and method names
- Remove unnecessary configs and metadata fields
Each of these is described in more detail below.
Clear separation of config and metadata
Our v2 API lacked a clear separation of config and metadata. This made it cumbersome to use since the config doesn't change much over the lifetime of a collector but the metadata does. With v3 we've introduced a clear separation between metadata and config.
Config
The config object AnalyticsConfig contains the analytics license key and config fields that determine the collector behaviour. It doesn't contain any metadata to enrich analytics data itself.
Metadata
Metadata is split into the objects DefaultMetadata and SourceMetadata
DefaultMetadata holds metadata that is source independent and doesn't change after creation of the collector (e.g.: customUserId, app version)
SourceMetadata holds source related metadata that is only relevant for a specific source (e.g.: title, videoId, genre)
Both have a customData object which allows for arbitrary data to be collected together with each sample.
If the same field (e.g. customData1) is specified in SourceMetadata and DefaultMetadata, SourceMetadata takes precedence. All customData fields are merged on a field basis, with SourceMetadata taking higher priority.
Streamline collector behaviour in iOS and Android
Our v2 API had some inconsistencies in field names and default behaviour when comparing iOS and Android.
For example, on iOS, ad tracking is disabled by default, while it's enabled by default on Android.
This behaviour was unified with v3.
More intuitive field and method names
API v2 has some confusing method names (e.g.: setCustomDataOnce) which we tried to make easier to understand (e.g.:sendCustomDataEvent). The same applies for some field names ( e.g.: tryResendDataOnFailedConnection is now RetryPolicy.SHORT_TERM).
Remove unnecessary configs and metadata fields
API v2 has deprecated configs like playerKey, heartbeatInterval which are not part of the new AnalyticsConfig to simplify setup.
With v3 we also removed some Metadata fields like playerType, m3u8Url or mpdUrl since they can be autodetected in most cases.
Behavioural changes compared to v2
CustomData is merged on a field level
If customData is specified in DefaultMetadata and SourceMetadata, SourceMetadata takes precedence. With the v3 API, this is done at the field level and not on the whole CustomData object anymore.
The example below illustrates how this works:
val customData1 = CustomData(customData1 = "appVersion1", customData2 = "exampleData")
val defaultMetadata = DefaultMetadata(customData = customData1)
val customData2 = CustomData(customData2 = "sourceData1", customData3 = "exampleGenre")
val sourceMetadata = SourceMetadata(title = "exampleTitle", customData = customData2)
// when the defaultMetadata is set and the sourceMetadata is active for the current source
// the resulting CustomData that is sent to the back end will look like this
CustomData(customData1 = "appVersion1", customData2 = "sourceData1", customData3 = "exampleGenre")
sendCustomDataEvent is merged with CustomData
With API v2 only the CustomData that was given as a parameter to the sendCustomDataEvent (or setCustomDataOnce) method was sent to the backend.
Using the v3 API, the CustomData that is specified as parameter is merged with the CustomData that is sent with the current source. The specified CustomData takes precedence and it's merged on a field-level.
Player-specific changes
ExoPlayer error tracking changed
The errorCodes reported are using the actual errorCodes as reported by ExoPlayer, instead of the error types. This allows for more specific error tracking and helps with debugging.
Updated almost 2 years ago