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
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,25 @@
[Release Notes](https://docs.usercentrics.com/cmp_in_app_sdk/latest/about/history/)
### 2.27.0 – Jun 1, 2026
## Features
* **[PUR Compliance]** Implemented Mandatory Label and Hide Vendor Toggles on the second layer — purposes and special features absent from `publisherRestrictions`/`specialFeatures` maps are rendered as mandatory (pre-consented, non-interactive with a "Mandatory" label), and `showTogglesForVendors: false` hides toggles on the Vendors/DPS tab while keeping them on the Purposes tab. All logic is gated behind `enableConsentOrPay`; existing configurations are fully unaffected
* **[PUR Compliance]** Extended mandatory label and hide vendor toggles behaviour to Flutter, React Native, and Unity bridges
* **[Unity]** Exposed GDPR legal texts in `getCmpData`, enabling fully custom TCF UI builds

## Fixes
* **[Android — Accessibility]** Fixed TalkBack reading consent layer content with wrong language pronunciation (WCAG 3.1.2 Language of Parts)
* **[Android — Accessibility]** Added visible focus indicators to interactive elements in the consent layer (WCAG 2.4.7 Focus Visible)
* **[Android — Accessibility]** Action buttons now correctly announced as buttons by TalkBack (WCAG 4.1.2 Name, Role, Value)
* **[Android — Accessibility]** Accordion controls now announced as interactive buttons by TalkBack (WCAG 4.1.2 Name, Role, Value)
* **[Android — Accessibility]** External links in the consent layer now announced as links by TalkBack (WCAG 4.1.2 Name, Role, Value)
* **[Android — Accessibility]** Fixed TalkBack focus jumping unexpectedly after accordion expand/collapse (WCAG 3.2.1 On Focus)
* **[Android — Accessibility]** Consent history table now semantically exposed to screen readers (WCAG 1.3.1 Info and Relationships)
* **[Android — Accessibility]** History section heading now programmatically marked as a heading for TalkBack navigation (WCAG 1.3.1 Info and Relationships)
* **[Android]** Fixed button text losing center alignment when label wraps to multiple lines
* **[Android]** Fixed first layer being blocked on the preview page when consent was already stored
* **[iOS]** Fixed SPM UI package incompatibility with Xcode 26
* **[TV]** Fixed CMP initialization failing on Samsung TV 2018 with `AbortController is not defined`
* **[Unity]** Added `changeLanguage()` API to the Unity bridge

### 2.26.3 – May 14, 2026
## Fixes
* **[Mediation]** Fixed `FirebaseAnalyticsMediationSDK` failing for apps using Firebase 32+ due to the Firebase KTX migration
Expand Down
2 changes: 1 addition & 1 deletion android/build-legacy.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
def usercentrics_version = "2.26.3"
def usercentrics_version = "2.27.0"
version usercentrics_version

buildscript {
Expand Down
2 changes: 1 addition & 1 deletion android/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
val usercentricsVersion = "2.26.3"
val usercentricsVersion = "2.27.0"
val reactNativeVersion = "+"

fun BooleanProperty(name: String): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,8 @@ internal object GetCMPDataMock {
"legIntPurposes" to listOf(1, 2, 3),
),
"acmV2Enabled" to true,
"selectedATPIds" to listOf(43, 46, 55)
"selectedATPIds" to listOf(43, 46, 55),
"mandatoryLabel" to "Mandatory",
)
private val expectedCCPASettings = hashMapOf(
"optOutNoticeLabel" to "Do not sell my personal information",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ private fun TCF2Settings.serialize(): WritableMap {
"acmV2Enabled" to acmV2Enabled,
"selectedATPIds" to selectedATPIds,
"consentOrPay" to consentOrPay?.serialize(),
"mandatoryLabel" to mandatoryLabel,
).toWritableMap()
}

Expand Down
1 change: 1 addition & 0 deletions ios/Extensions/UsercentricsCMPData+Dict.swift
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ extension TCF2Settings {
"selectedATPIds": self.selectedATPIds,
"resurfacePeriod": self.resurfacePeriod,
"consentOrPay": self.consentOrPay?.toDictionary() as Any,
"mandatoryLabel": self.mandatoryLabel,
]
}
}
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"name": "@usercentrics/react-native-sdk",
"version": "2.26.3",
"version": "2.27.0",
"description": "Usercentrics SDK",
"homepage": "https://usercentrics.com",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"author": "Usercentrics <developer@usercentrics.com>",
"iosPackageName": "react-native-usercentrics",
"iosPackageVersion": "2.26.3",
"iosPackageVersion": "2.27.0",
"license": "SEE LICENSE IN LICENSE",
"files": [
"android",
Expand Down
18 changes: 9 additions & 9 deletions sample/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1924,7 +1924,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- react-native-usercentrics (2.26.3):
- react-native-usercentrics (2.27.0):
- boost
- DoubleConversion
- fast_float
Expand All @@ -1951,7 +1951,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- SocketRocket
- UsercentricsUI (= 2.26.3)
- UsercentricsUI (= 2.27.0)
- Yoga
- react-native-webview (13.16.1):
- boost
Expand Down Expand Up @@ -2546,9 +2546,9 @@ PODS:
- SocketRocket
- Yoga
- SocketRocket (0.7.1)
- Usercentrics (2.26.3)
- UsercentricsUI (2.26.3):
- Usercentrics (= 2.26.3)
- Usercentrics (2.27.0)
- UsercentricsUI (2.27.0):
- Usercentrics (= 2.27.0)
- Yoga (0.0.0)

DEPENDENCIES:
Expand Down Expand Up @@ -2816,7 +2816,7 @@ SPEC CHECKSUMS:
hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669
RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f
RCTDeprecation: c0ed3249a97243002615517dff789bf4666cf585
RCTRequired: 58719f5124f9267b5f9649c08bf23d9aea845b23
RCTTypeSafety: 4aefa8328ab1f86da273f08517f1f6b343f6c2cc
Expand Down Expand Up @@ -2850,7 +2850,7 @@ SPEC CHECKSUMS:
React-Mapbuffer: e4a65db5f4df53369f39558c0cf2f480f6d3d6c7
React-microtasksnativemodule: 86334c5c06315e0bccb7b6e6f2c905e92f98b615
react-native-safe-area-context: eda63a662750758c1fdd7e719c9f1026c8d161cb
react-native-usercentrics: 8cbc2cbd939ac1bd39a85d439a26a5d7fb773639
react-native-usercentrics: 8f2a8976b7c3e887d8de1fd8309c84693ba005bf
react-native-webview: 83c663c5bdf1357d3e7c00986260cb888ea0e328
React-NativeModulesApple: 8c7eb6057b00c191a11ad5ced41826ec5a0e4d78
React-oscompat: 93b5535ea7f7dff46aaee4f78309a70979bdde9d
Expand Down Expand Up @@ -2884,8 +2884,8 @@ SPEC CHECKSUMS:
ReactCommon: e9ab32f1d1482d207867b4fdd139361302b9dcc6
RNScreens: e902eba58a27d3ad399a495d578e8aba3ea0f490
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
Usercentrics: 82516ec0af3d552dced169285731571b71d74fc2
UsercentricsUI: 085bb51480cdd35d1b8c0f4661c72fa728a163ba
Usercentrics: e980f9ab4cf1d1c6de5825d7c23ca8ada2d6f0a5
UsercentricsUI: 3297ec6fb0e2cbb781abf4e61377979099007982
Yoga: 9b30b783a17681321b52ac507a37219d7d795ace

PODFILE CHECKSUM: 8d257452e9e69d13384a99ee3cd38b42636521da
Expand Down
4 changes: 3 additions & 1 deletion sample/ios/sampleTests/Mock/CMPData+Mock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,9 @@ extension TCF2Settings {
selectedATPIds: [43,46,55],
resurfaceATPListChanged: false,
atpListTitle: "Google Providers",
maintainLegitimateInterest: false)
maintainLegitimateInterest: false,
consentOrPay: nil,
mandatoryLabel: "Mandatory")
}
}

Expand Down
Loading
Loading