From a052b137edc386df1f6e0cfef60ba7a96119512d Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Wed, 29 Jul 2026 11:01:10 -0400 Subject: [PATCH 1/4] chore(ios): require mParticle-Rokt 9.3+ for Rokt Widget 5.3 floor Pin the Expo plugin and sample to mParticle-Rokt ~> 9.3 (kit declares Rokt-Widget ~> 5.3) plus an explicit Rokt-Widget ~> 5.3 companion so consumers cannot resolve Rokt iOS 5.2.x. --- CHANGELOG.md | 6 +++++- ExpoTestApp/README.md | 3 ++- MIGRATING.md | 21 ++++++++++++--------- README.md | 5 +++-- plugin/src/withMParticleIOS.ts | 28 ++++++++++++++++++++++++++-- sample/README.md | 2 +- sample/ios/Podfile | 11 ++++++----- 7 files changed, 55 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 000974f2..ded1d0d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,11 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Expo config plugin: optional `pinningDisabled` for `MPNetworkOptions` / `NetworkOptions` at SDK startup +### Changed + +- iOS: require `mParticle-Rokt ~> 9.3` (kit declares `Rokt-Widget ~> 5.3`) and pin companion `Rokt-Widget ~> 5.3` in the sample Podfile and Expo config plugin, so consumers cannot resolve Rokt iOS `5.2.x` + ### Fixed - Preserve explicitly null custom event and product attributes as empty strings on iOS and Android, including product attributes with iOS New Architecture - iOS: raise the `mParticle-Apple-SDK-ObjC` floor to `>= 9.2.2` (was `~> 9.2`); the device-consent bridge uses `MParticle.deviceConsentState`, added in SDK `9.2.2`, so the previous floor permitted `9.2.0`/`9.2.1` which fail to compile -- iOS sample CI: pin `Rokt-Widget` to `5.2.0` and `DcuiSchema` to `2.7.0` (avoids `2.8.x` schema floating under Rokt’s `~> 2.6` and breaking `RoktUXHelper` Swift compile); GitHub Actions stays on Xcode 16.x +- iOS sample CI: pin `DcuiSchema` to `2.7.0` (avoids `2.8.x` schema floating under Rokt’s `~> 2.6` and breaking `RoktUXHelper` Swift compile); GitHub Actions stays on Xcode 16.x - Android: raise the `com.mparticle:android-core` / `android-rokt-kit` dependency floor to `[5.79.2, 6.0)` (Expo plugin kit injection and bridge `android/build.gradle`), and bump the sample app to `5.79.2`. This guarantees consumers resolve a Rokt kit built against `com.rokt:roktsdk` `4.14.5`, which observes the Activity lifecycle from process start so overlay/bottom-sheet placements display even when `Rokt.init()` runs after the host Activity has resumed (deferred / late RN initialisation) ## [3.3.1] - 2026-07-24 diff --git a/ExpoTestApp/README.md b/ExpoTestApp/README.md index 0dd08634..38f14766 100644 --- a/ExpoTestApp/README.md +++ b/ExpoTestApp/README.md @@ -204,7 +204,8 @@ Check `ios/Podfile` for: - Kit pods (if specified): ```ruby - pod 'mParticle-Rokt', '~> 9.2' + pod 'mParticle-Rokt', '~> 9.3' + pod 'Rokt-Widget', '~> 5.3' ``` ### Verify Android Integration diff --git a/MIGRATING.md b/MIGRATING.md index eddff73e..3bdb22b7 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -28,22 +28,24 @@ dependencies with the `[6.0.0, 7.0)` range. `selectShoppableAds` remains a no-op on Android in this release. -## Migrating to the mParticle Apple SDK 9.2.0 Rokt update +## Migrating to mParticle-Rokt 9.3+ (Rokt iOS 5.3 floor) -This update aligns the React Native wrapper with `mParticle-Apple-SDK` and -`mParticle-Rokt` `9.2.0`. The Apple Rokt kit now resolves `Rokt-Widget` `~> 5.2` -and `RoktContracts` `~> 2.0`. +This update aligns the React Native wrapper with `mParticle-Rokt` **9.3+**, +which requires `Rokt-Widget` `~> 5.3` (and `RoktContracts` `~> 2.0`). Use kit +`9.3.2` or newer so CocoaPods cannot resolve Rokt iOS `5.2.x`. ### Dependency Changes For standard Rokt placements on iOS, use: ```ruby -pod 'mParticle-Rokt', '~> 9.2' +pod 'mParticle-Rokt', '~> 9.3' +pod 'Rokt-Widget', '~> 5.3' ``` -Do not add `Rokt-Widget` directly to this React Native wrapper's podspec. Apps -receive it transitively through `mParticle-Rokt`. +Do not add `Rokt-Widget` to this React Native wrapper's podspec. Apps receive +it through `mParticle-Rokt` `9.3+`; the companion `Rokt-Widget` pin makes the +5.3 floor explicit in app Podfiles / Expo-generated Podfiles. ### React Native Rokt API @@ -74,8 +76,9 @@ Use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements: ] ``` -The plugin pins generated `mParticle-Rokt` pods to `~> 9.2`. It does not add -payment-extension pods or URL callback forwarding in this release. +The plugin pins generated `mParticle-Rokt` pods to `~> 9.3` and companion +`Rokt-Widget` to `~> 5.3`. It does not add payment-extension pods or URL +callback forwarding in this release. For global CNAME setup, configure the shared `customBaseUrl` setting: diff --git a/README.md b/README.md index 5c800261..70015859 100644 --- a/README.md +++ b/README.md @@ -294,10 +294,11 @@ Next, you'll need to start the SDK: For standard Rokt placements, add the mParticle Rokt kit: ```ruby -pod 'mParticle-Rokt', '~> 9.2' +pod 'mParticle-Rokt', '~> 9.3' +pod 'Rokt-Widget', '~> 5.3' ``` -In Expo apps, use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements. The Expo plugin does not add payment-extension pods or URL callback forwarding in this release. +In Expo apps, use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements. The Expo plugin pins `mParticle-Rokt` to `~> 9.3` and `Rokt-Widget` to `~> 5.3`. It does not add payment-extension pods or URL callback forwarding in this release. See [MIGRATING.md](./MIGRATING.md) for release-specific migration guidance. diff --git a/plugin/src/withMParticleIOS.ts b/plugin/src/withMParticleIOS.ts index 38918dcc..27f2fef0 100644 --- a/plugin/src/withMParticleIOS.ts +++ b/plugin/src/withMParticleIOS.ts @@ -387,9 +387,19 @@ const KIT_TRANSITIVE_DEPENDENCIES: Record = { }; const KIT_VERSION_REQUIREMENTS: Record = { - 'mParticle-Rokt': "'~> 9.2'", + // 9.3+ declares Rokt-Widget ~> 5.3 (mParticle Apple SDK #796 / kit 9.3.2). + 'mParticle-Rokt': "'~> 9.3'", }; +/** + * Extra pods declared alongside a kit to keep an explicit Rokt iOS floor even when + * CocoaPods would otherwise satisfy the kit with an older locked Widget build. + */ +const KIT_COMPANION_PODS: Record> = + { + 'mParticle-Rokt': [{ name: 'Rokt-Widget', version: "'~> 5.3'" }], + }; + /** * Get all pods that need dynamic framework linking */ @@ -421,6 +431,20 @@ function getKitPodDeclaration(kit: string): string { : ` pod '${kit}'`; } +function getKitPodDeclarations(kits: string[]): string[] { + const lines: string[] = []; + for (const kit of kits) { + lines.push(getKitPodDeclaration(kit)); + const companions = KIT_COMPANION_PODS[kit]; + if (companions) { + for (const companion of companions) { + lines.push(` pod '${companion.name}', ${companion.version}`); + } + } + } + return lines; +} + /** * Add kit pods and pre_install hook to Podfile */ @@ -475,7 +499,7 @@ end // Add kit pods if specified if (props.iosKits && props.iosKits.length > 0) { - const kitPods = props.iosKits.map(getKitPodDeclaration).join('\n'); + const kitPods = getKitPodDeclarations(props.iosKits).join('\n'); // Check if kits are already added const kitsAlreadyAdded = props.iosKits.every(kit => diff --git a/sample/README.md b/sample/README.md index 7890f181..7b2a07ae 100644 --- a/sample/README.md +++ b/sample/README.md @@ -64,7 +64,7 @@ cd sample/ios pod install ``` -The sample Podfile pins `mParticle-Rokt` `~> 9.2`, **`Rokt-Widget` `5.2.0`**, and **`DcuiSchema` `2.7.0`**. Rokt’s pods allow `DcuiSchema` to float within `~> 2.6`; when CocoaPods resolves **2.8.0+**, the schema adds `image` styling that can desync from the `RoktUXHelper` sources in that widget line and break Swift compile (`StyleTransformer` / `BaseStyles`). Bump these pins together when you adopt a newer Rokt iOS stack. +The sample Podfile pins `mParticle-Rokt` `~> 9.3`, **`Rokt-Widget` `~> 5.3`**, and **`DcuiSchema` `2.7.0`**. Kit `9.3+` requires Rokt iOS `5.3+`, so CocoaPods does not resolve older `5.2.x`. Rokt’s pods allow `DcuiSchema` to float within `~> 2.6`; when CocoaPods resolves **2.8.0+**, the schema can add APIs that desync from the shipped `RoktUXHelper` and break Swift compile (`StyleTransformer` / `BaseStyles`). Retune the schema pin when validating a new Rokt iOS line. The sample Android app pins both `com.mparticle:android-core` and `com.mparticle:android-rokt-kit` to `[6.0.0, 7.0)` so the Rokt session APIs are diff --git a/sample/ios/Podfile b/sample/ios/Podfile index 5063ebf7..307c6049 100644 --- a/sample/ios/Podfile +++ b/sample/ios/Podfile @@ -33,12 +33,13 @@ target 'MParticleSample' do # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) - pod 'mParticle-Rokt', '~> 9.2' - # Exact Rokt-Widget keeps RoktUXHelper on the same version (Rokt pins them together). - pod 'Rokt-Widget', '5.2.0' + # 9.3+ requires Rokt-Widget ~> 5.3 (mParticle-Rokt 9.3.2+). + pod 'mParticle-Rokt', '~> 9.3' + pod 'Rokt-Widget', '~> 5.3' # RoktUXHelper declares `DcuiSchema` `~> 2.6`, which otherwise floats to 2.8.x; that - # schema release adds `image` styling APIs that the shipped RoktUXHelper 5.2.x Swift - # does not pass through yet (CI: StyleTransformer.swift / BaseStyles "missing image"). + # schema release adds `image` styling APIs that older RoktUXHelper Swift does not + # pass through yet (CI: StyleTransformer.swift / BaseStyles "missing image"). + # Retune this pin when validating a new Rokt-Widget line if schema APIs drift again. pod 'DcuiSchema', '2.7.0' target 'MParticleSampleTests' do From 82b0106357f741c912d848ec25e46b048e92083a Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Wed, 29 Jul 2026 11:32:29 -0400 Subject: [PATCH 2/4] fix(expo): inject missing kit companion pods and drop DcuiSchema pin Address review feedback and unblock iOS CI: - Podfile kit injection now matches individual pods instead of the whole kit selection, so a Podfile that already declares mParticle-Rokt still picks up the Rokt-Widget companion floor on upgrade. - Extract addKitPodsToPodfile and cover the upgrade path with unit tests. - Remove the sample DcuiSchema 2.7.0 pin. Rokt-Widget 5.3 resolves RoktUXHelper 1.0.0, which requires DcuiSchema exactly, so the pin conflicts during resolution and the float it guarded is no longer possible. - Clarify in MIGRATING that kit 9.3.2+ enforces the 5.3 floor transitively and the explicit pin only makes it visible / defeats a stale lockfile. --- CHANGELOG.md | 3 +- MIGRATING.md | 20 +++- jest.config.js | 5 +- plugin/src/__tests__/withMParticleIOS.test.ts | 47 ++++++++++ plugin/src/withMParticleIOS.ts | 94 +++++++++++-------- plugin/tsconfig.json | 3 +- sample/README.md | 4 +- sample/ios/Podfile | 8 +- 8 files changed, 130 insertions(+), 54 deletions(-) create mode 100644 plugin/src/__tests__/withMParticleIOS.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ded1d0d7..50d16a54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- iOS: require `mParticle-Rokt ~> 9.3` (kit declares `Rokt-Widget ~> 5.3`) and pin companion `Rokt-Widget ~> 5.3` in the sample Podfile and Expo config plugin, so consumers cannot resolve Rokt iOS `5.2.x` +- iOS: require `mParticle-Rokt ~> 9.3` (kit declares `Rokt-Widget ~> 5.3`) and declare companion `Rokt-Widget ~> 5.3` in the sample Podfile and Expo config plugin, so consumers cannot resolve Rokt iOS `5.2.x` +- iOS: drop the sample `DcuiSchema` `2.7.0` pin. `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version, so the schema can no longer float out of sync and the old pin now conflicts during resolution ### Fixed diff --git a/MIGRATING.md b/MIGRATING.md index 3bdb22b7..93b693ff 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -31,8 +31,9 @@ dependencies with the `[6.0.0, 7.0)` range. ## Migrating to mParticle-Rokt 9.3+ (Rokt iOS 5.3 floor) This update aligns the React Native wrapper with `mParticle-Rokt` **9.3+**, -which requires `Rokt-Widget` `~> 5.3` (and `RoktContracts` `~> 2.0`). Use kit -`9.3.2` or newer so CocoaPods cannot resolve Rokt iOS `5.2.x`. +which requires `Rokt-Widget` `~> 5.3` (and `RoktContracts` `~> 2.0`), so the +Rokt iOS floor is enforced by the kit's own dependency graph rather than only by +an app-level pin. ### Dependency Changes @@ -43,9 +44,18 @@ pod 'mParticle-Rokt', '~> 9.3' pod 'Rokt-Widget', '~> 5.3' ``` -Do not add `Rokt-Widget` to this React Native wrapper's podspec. Apps receive -it through `mParticle-Rokt` `9.3+`; the companion `Rokt-Widget` pin makes the -5.3 floor explicit in app Podfiles / Expo-generated Podfiles. +Kit `9.3.2+` already enforces the `5.3` floor transitively, so the explicit +`Rokt-Widget` line is not required to prevent `5.2.x`. Declaring it keeps the +floor visible in the Podfile and forces a resolve even when an existing +`Podfile.lock` still holds a `5.2.x` build. + +Do not add `Rokt-Widget` to this React Native wrapper's podspec — apps receive +it through `mParticle-Rokt`. + +`Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact +`DcuiSchema` version. Remove any `DcuiSchema` pin (for example the previously +recommended `2.7.0`), otherwise CocoaPods reports conflicting `DcuiSchema` +requirements. ### React Native Rokt API diff --git a/jest.config.js b/jest.config.js index 666f90a7..2ea6aa12 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,8 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', - testMatch: ['/js/**/*.test.ts?(x)'], + testMatch: [ + '/js/**/*.test.ts?(x)', + '/plugin/**/*.test.ts?(x)', + ], }; diff --git a/plugin/src/__tests__/withMParticleIOS.test.ts b/plugin/src/__tests__/withMParticleIOS.test.ts new file mode 100644 index 00000000..dc34a2bf --- /dev/null +++ b/plugin/src/__tests__/withMParticleIOS.test.ts @@ -0,0 +1,47 @@ +import { addKitPodsToPodfile } from '../withMParticleIOS'; + +const basePodfile = `platform :ios, '15.6' + +target 'MParticleExpoTest' do + config = use_native_modules! + + use_react_native!( + :path => config[:reactNativePath], + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) +end +`; + +describe('addKitPodsToPodfile', () => { + it('declares the kit and its companion Rokt-Widget floor', () => { + const result = addKitPodsToPodfile(basePodfile, ['mParticle-Rokt']); + + expect(result).toContain("pod 'mParticle-Rokt', '~> 9.3'"); + expect(result).toContain("pod 'Rokt-Widget', '~> 5.3'"); + }); + + it('adds a missing companion pod to a Podfile that already declares the kit', () => { + const upgraded = basePodfile.replace( + /(\)\n)/, + "$1\n pod 'mParticle-Rokt', '~> 9.2'\n" + ); + + const result = addKitPodsToPodfile(upgraded, ['mParticle-Rokt']); + + expect(result).toContain("pod 'Rokt-Widget', '~> 5.3'"); + expect(result.match(/pod 'mParticle-Rokt'/g)).toHaveLength(1); + }); + + it('leaves a Podfile untouched when every required pod is present', () => { + const complete = addKitPodsToPodfile(basePodfile, ['mParticle-Rokt']); + + expect(addKitPodsToPodfile(complete, ['mParticle-Rokt'])).toBe(complete); + }); + + it('declares kits without a pinned version or companions', () => { + const result = addKitPodsToPodfile(basePodfile, ['mParticle-Amplitude']); + + expect(result).toContain("pod 'mParticle-Amplitude'"); + expect(result).not.toContain('Rokt-Widget'); + }); +}); diff --git a/plugin/src/withMParticleIOS.ts b/plugin/src/withMParticleIOS.ts index 27f2fef0..7dc04564 100644 --- a/plugin/src/withMParticleIOS.ts +++ b/plugin/src/withMParticleIOS.ts @@ -386,19 +386,24 @@ const KIT_TRANSITIVE_DEPENDENCIES: Record = { // "mParticle-Braze": [], }; +type PodDeclaration = { + name: string; + version?: string; +}; + const KIT_VERSION_REQUIREMENTS: Record = { // 9.3+ declares Rokt-Widget ~> 5.3 (mParticle Apple SDK #796 / kit 9.3.2). 'mParticle-Rokt': "'~> 9.3'", }; /** - * Extra pods declared alongside a kit to keep an explicit Rokt iOS floor even when - * CocoaPods would otherwise satisfy the kit with an older locked Widget build. + * Extra pods declared alongside a kit. mParticle-Rokt 9.3+ already requires + * Rokt-Widget ~> 5.3 transitively; declaring it directly keeps the Rokt iOS floor + * visible in the Podfile and survives a lockfile that still holds a 5.2.x build. */ -const KIT_COMPANION_PODS: Record> = - { - 'mParticle-Rokt': [{ name: 'Rokt-Widget', version: "'~> 5.3'" }], - }; +const KIT_COMPANION_PODS: Record = { + 'mParticle-Rokt': [{ name: 'Rokt-Widget', version: "'~> 5.3'" }], +}; /** * Get all pods that need dynamic framework linking @@ -424,25 +429,52 @@ function getDynamicFrameworkPods(iosKits?: string[]): string[] { return [...new Set(pods)]; // Remove duplicates } -function getKitPodDeclaration(kit: string): string { - const versionRequirement = KIT_VERSION_REQUIREMENTS[kit]; - return versionRequirement - ? ` pod '${kit}', ${versionRequirement}` - : ` pod '${kit}'`; +function getPodDeclaration({ name, version }: PodDeclaration): string { + return version ? ` pod '${name}', ${version}` : ` pod '${name}'`; } -function getKitPodDeclarations(kits: string[]): string[] { - const lines: string[] = []; +/** + * Every pod a kit selection needs in the Podfile: the kit itself plus its companions. + */ +function getKitPods(kits: string[]): PodDeclaration[] { + const pods: PodDeclaration[] = []; for (const kit of kits) { - lines.push(getKitPodDeclaration(kit)); - const companions = KIT_COMPANION_PODS[kit]; - if (companions) { - for (const companion of companions) { - lines.push(` pod '${companion.name}', ${companion.version}`); - } - } + pods.push({ name: kit, version: KIT_VERSION_REQUIREMENTS[kit] }); + pods.push(...(KIT_COMPANION_PODS[kit] ?? [])); + } + return pods; +} + +/** + * Declare each kit and its companion pods inside the main target block. + * + * Pods are matched individually rather than per kit selection: a Podfile generated by an + * earlier plugin version already declares the kit, and must still pick up companion pods + * added since (for example the `Rokt-Widget` floor). + */ +export function addKitPodsToPodfile( + podfileContent: string, + iosKits: string[] +): string { + const missingPods = getKitPods(iosKits).filter( + pod => !podfileContent.includes(`pod '${pod.name}'`) + ); + + if (missingPods.length === 0) { + return podfileContent; } - return lines; + + // Look for use_react_native! and add after it + const useReactNativeRegex = /(use_react_native!\([^)]*\))/s; + if (!useReactNativeRegex.test(podfileContent)) { + return podfileContent; + } + + const kitPods = missingPods.map(getPodDeclaration).join('\n'); + return podfileContent.replace( + useReactNativeRegex, + `$1\n\n # mParticle kits (added by react-native-mparticle expo plugin)\n${kitPods}` + ); } /** @@ -497,26 +529,8 @@ end } } - // Add kit pods if specified if (props.iosKits && props.iosKits.length > 0) { - const kitPods = getKitPodDeclarations(props.iosKits).join('\n'); - - // Check if kits are already added - const kitsAlreadyAdded = props.iosKits.every(kit => - podfileContent.includes(`pod '${kit}'`) - ); - - if (!kitsAlreadyAdded) { - // Add kit pods inside the main target block - // Look for use_react_native! and add after it - const useReactNativeRegex = /(use_react_native!\([^)]*\))/s; - if (useReactNativeRegex.test(podfileContent)) { - podfileContent = podfileContent.replace( - useReactNativeRegex, - `$1\n\n # mParticle kits (added by react-native-mparticle expo plugin)\n${kitPods}` - ); - } - } + podfileContent = addKitPodsToPodfile(podfileContent, props.iosKits); } fs.writeFileSync(podfilePath, podfileContent); diff --git a/plugin/tsconfig.json b/plugin/tsconfig.json index 6375b286..12450ebe 100644 --- a/plugin/tsconfig.json +++ b/plugin/tsconfig.json @@ -4,5 +4,6 @@ "outDir": "build", "rootDir": "src" }, - "include": ["./src"] + "include": ["./src"], + "exclude": ["./src/**/__tests__/**"] } diff --git a/sample/README.md b/sample/README.md index 7b2a07ae..ba0b2187 100644 --- a/sample/README.md +++ b/sample/README.md @@ -64,7 +64,9 @@ cd sample/ios pod install ``` -The sample Podfile pins `mParticle-Rokt` `~> 9.3`, **`Rokt-Widget` `~> 5.3`**, and **`DcuiSchema` `2.7.0`**. Kit `9.3+` requires Rokt iOS `5.3+`, so CocoaPods does not resolve older `5.2.x`. Rokt’s pods allow `DcuiSchema` to float within `~> 2.6`; when CocoaPods resolves **2.8.0+**, the schema can add APIs that desync from the shipped `RoktUXHelper` and break Swift compile (`StyleTransformer` / `BaseStyles`). Retune the schema pin when validating a new Rokt iOS line. +The sample Podfile pins `mParticle-Rokt` `~> 9.3` and **`Rokt-Widget` `~> 5.3`**. Kit `9.3+` requires Rokt iOS `5.3+`, so CocoaPods does not resolve older `5.2.x`. + +There is no longer a `DcuiSchema` pin. `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version, so the schema cannot float out of sync with the `RoktUXHelper` sources. The previous `2.7.0` pin guarded against that float (schema `2.8.x` added `image` styling APIs that older `RoktUXHelper` Swift did not pass through, breaking `StyleTransformer` / `BaseStyles`) and now conflicts with the exact version `RoktUXHelper` requires. The sample Android app pins both `com.mparticle:android-core` and `com.mparticle:android-rokt-kit` to `[6.0.0, 7.0)` so the Rokt session APIs are diff --git a/sample/ios/Podfile b/sample/ios/Podfile index 307c6049..44357548 100644 --- a/sample/ios/Podfile +++ b/sample/ios/Podfile @@ -36,11 +36,9 @@ target 'MParticleSample' do # 9.3+ requires Rokt-Widget ~> 5.3 (mParticle-Rokt 9.3.2+). pod 'mParticle-Rokt', '~> 9.3' pod 'Rokt-Widget', '~> 5.3' - # RoktUXHelper declares `DcuiSchema` `~> 2.6`, which otherwise floats to 2.8.x; that - # schema release adds `image` styling APIs that older RoktUXHelper Swift does not - # pass through yet (CI: StyleTransformer.swift / BaseStyles "missing image"). - # Retune this pin when validating a new Rokt-Widget line if schema APIs drift again. - pod 'DcuiSchema', '2.7.0' + # No DcuiSchema pin: Rokt-Widget 5.3 resolves RoktUXHelper 1.0.0, which requires an + # exact `DcuiSchema` version, so the schema can no longer float out of sync with the + # RoktUXHelper sources (the desync that the previous 2.7.0 pin guarded against). target 'MParticleSampleTests' do inherit! :complete From 6b7effd10633602701837e45bcb71524f990d8f5 Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Wed, 29 Jul 2026 11:54:27 -0400 Subject: [PATCH 3/4] chore(ios): resolve Rokt iOS through the kit instead of a direct pin mParticle-Rokt 9.3 already requires Rokt-Widget ~> 5.3, so declaring Rokt-Widget directly was redundant and contradicted existing guidance that apps receive it transitively through the kit. - Drop the companion Rokt-Widget pin from the Expo config plugin, the sample Podfile, and the README / MIGRATING / ExpoTestApp examples. - Remove the plugin companion-pod mechanism and its tests, restoring the original jest and plugin tsconfig configuration. - Keep the per-kit injection filter so a Podfile that already declares one kit is not re-injected alongside a missing one. - Keep Rokt-Widget, RoktUXHelper, and DcuiSchema in the dynamic-framework pre_install lists, which is unrelated to declaring pods. --- CHANGELOG.md | 6 +- ExpoTestApp/README.md | 1 - MIGRATING.md | 16 ++-- README.md | 5 +- jest.config.js | 5 +- plugin/src/__tests__/withMParticleIOS.test.ts | 47 ---------- plugin/src/withMParticleIOS.ts | 85 ++++++------------- plugin/tsconfig.json | 3 +- sample/README.md | 2 +- sample/ios/Podfile | 7 +- 10 files changed, 41 insertions(+), 136 deletions(-) delete mode 100644 plugin/src/__tests__/withMParticleIOS.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 50d16a54..53851a58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,14 +15,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- iOS: require `mParticle-Rokt ~> 9.3` (kit declares `Rokt-Widget ~> 5.3`) and declare companion `Rokt-Widget ~> 5.3` in the sample Podfile and Expo config plugin, so consumers cannot resolve Rokt iOS `5.2.x` -- iOS: drop the sample `DcuiSchema` `2.7.0` pin. `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version, so the schema can no longer float out of sync and the old pin now conflicts during resolution +- iOS: require `mParticle-Rokt ~> 9.3` (kit declares `Rokt-Widget ~> 5.3`) +- iOS: no `Rokt-Widget` or `DcuiSchema` pins in the sample Podfile or Expo config plugin. Rokt iOS resolves through `mParticle-Rokt`, and `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version, so the schema can no longer float out of sync. Remove any `DcuiSchema` pin, which now conflicts during resolution ### Fixed - Preserve explicitly null custom event and product attributes as empty strings on iOS and Android, including product attributes with iOS New Architecture - iOS: raise the `mParticle-Apple-SDK-ObjC` floor to `>= 9.2.2` (was `~> 9.2`); the device-consent bridge uses `MParticle.deviceConsentState`, added in SDK `9.2.2`, so the previous floor permitted `9.2.0`/`9.2.1` which fail to compile -- iOS sample CI: pin `DcuiSchema` to `2.7.0` (avoids `2.8.x` schema floating under Rokt’s `~> 2.6` and breaking `RoktUXHelper` Swift compile); GitHub Actions stays on Xcode 16.x +- iOS sample CI: GitHub Actions stays on Xcode 16.x - Android: raise the `com.mparticle:android-core` / `android-rokt-kit` dependency floor to `[5.79.2, 6.0)` (Expo plugin kit injection and bridge `android/build.gradle`), and bump the sample app to `5.79.2`. This guarantees consumers resolve a Rokt kit built against `com.rokt:roktsdk` `4.14.5`, which observes the Activity lifecycle from process start so overlay/bottom-sheet placements display even when `Rokt.init()` runs after the host Activity has resumed (deferred / late RN initialisation) ## [3.3.1] - 2026-07-24 diff --git a/ExpoTestApp/README.md b/ExpoTestApp/README.md index 38f14766..100a3f77 100644 --- a/ExpoTestApp/README.md +++ b/ExpoTestApp/README.md @@ -205,7 +205,6 @@ Check `ios/Podfile` for: ```ruby pod 'mParticle-Rokt', '~> 9.3' - pod 'Rokt-Widget', '~> 5.3' ``` ### Verify Android Integration diff --git a/MIGRATING.md b/MIGRATING.md index 93b693ff..dad47a3c 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -41,16 +41,11 @@ For standard Rokt placements on iOS, use: ```ruby pod 'mParticle-Rokt', '~> 9.3' -pod 'Rokt-Widget', '~> 5.3' ``` -Kit `9.3.2+` already enforces the `5.3` floor transitively, so the explicit -`Rokt-Widget` line is not required to prevent `5.2.x`. Declaring it keeps the -floor visible in the Podfile and forces a resolve even when an existing -`Podfile.lock` still holds a `5.2.x` build. - -Do not add `Rokt-Widget` to this React Native wrapper's podspec — apps receive -it through `mParticle-Rokt`. +Do not add `Rokt-Widget` yourself — apps receive it through `mParticle-Rokt`, +which requires `~> 5.3`. Run `pod update` so an existing `Podfile.lock` does not +hold an older Rokt iOS build. `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version. Remove any `DcuiSchema` pin (for example the previously @@ -86,9 +81,8 @@ Use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements: ] ``` -The plugin pins generated `mParticle-Rokt` pods to `~> 9.3` and companion -`Rokt-Widget` to `~> 5.3`. It does not add payment-extension pods or URL -callback forwarding in this release. +The plugin pins generated `mParticle-Rokt` pods to `~> 9.3`. It does not add +payment-extension pods or URL callback forwarding in this release. For global CNAME setup, configure the shared `customBaseUrl` setting: diff --git a/README.md b/README.md index 70015859..c03b45ca 100644 --- a/README.md +++ b/README.md @@ -295,10 +295,11 @@ For standard Rokt placements, add the mParticle Rokt kit: ```ruby pod 'mParticle-Rokt', '~> 9.3' -pod 'Rokt-Widget', '~> 5.3' ``` -In Expo apps, use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements. The Expo plugin pins `mParticle-Rokt` to `~> 9.3` and `Rokt-Widget` to `~> 5.3`. It does not add payment-extension pods or URL callback forwarding in this release. +The kit requires `Rokt-Widget` `~> 5.3`, so Rokt iOS resolves transitively — do not declare it yourself. + +In Expo apps, use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements. The Expo plugin pins `mParticle-Rokt` to `~> 9.3`. It does not add payment-extension pods or URL callback forwarding in this release. See [MIGRATING.md](./MIGRATING.md) for release-specific migration guidance. diff --git a/jest.config.js b/jest.config.js index 2ea6aa12..666f90a7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,8 +1,5 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', - testMatch: [ - '/js/**/*.test.ts?(x)', - '/plugin/**/*.test.ts?(x)', - ], + testMatch: ['/js/**/*.test.ts?(x)'], }; diff --git a/plugin/src/__tests__/withMParticleIOS.test.ts b/plugin/src/__tests__/withMParticleIOS.test.ts deleted file mode 100644 index dc34a2bf..00000000 --- a/plugin/src/__tests__/withMParticleIOS.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { addKitPodsToPodfile } from '../withMParticleIOS'; - -const basePodfile = `platform :ios, '15.6' - -target 'MParticleExpoTest' do - config = use_native_modules! - - use_react_native!( - :path => config[:reactNativePath], - :app_path => "#{Pod::Config.instance.installation_root}/.." - ) -end -`; - -describe('addKitPodsToPodfile', () => { - it('declares the kit and its companion Rokt-Widget floor', () => { - const result = addKitPodsToPodfile(basePodfile, ['mParticle-Rokt']); - - expect(result).toContain("pod 'mParticle-Rokt', '~> 9.3'"); - expect(result).toContain("pod 'Rokt-Widget', '~> 5.3'"); - }); - - it('adds a missing companion pod to a Podfile that already declares the kit', () => { - const upgraded = basePodfile.replace( - /(\)\n)/, - "$1\n pod 'mParticle-Rokt', '~> 9.2'\n" - ); - - const result = addKitPodsToPodfile(upgraded, ['mParticle-Rokt']); - - expect(result).toContain("pod 'Rokt-Widget', '~> 5.3'"); - expect(result.match(/pod 'mParticle-Rokt'/g)).toHaveLength(1); - }); - - it('leaves a Podfile untouched when every required pod is present', () => { - const complete = addKitPodsToPodfile(basePodfile, ['mParticle-Rokt']); - - expect(addKitPodsToPodfile(complete, ['mParticle-Rokt'])).toBe(complete); - }); - - it('declares kits without a pinned version or companions', () => { - const result = addKitPodsToPodfile(basePodfile, ['mParticle-Amplitude']); - - expect(result).toContain("pod 'mParticle-Amplitude'"); - expect(result).not.toContain('Rokt-Widget'); - }); -}); diff --git a/plugin/src/withMParticleIOS.ts b/plugin/src/withMParticleIOS.ts index 7dc04564..5cb8437c 100644 --- a/plugin/src/withMParticleIOS.ts +++ b/plugin/src/withMParticleIOS.ts @@ -386,25 +386,11 @@ const KIT_TRANSITIVE_DEPENDENCIES: Record = { // "mParticle-Braze": [], }; -type PodDeclaration = { - name: string; - version?: string; -}; - const KIT_VERSION_REQUIREMENTS: Record = { // 9.3+ declares Rokt-Widget ~> 5.3 (mParticle Apple SDK #796 / kit 9.3.2). 'mParticle-Rokt': "'~> 9.3'", }; -/** - * Extra pods declared alongside a kit. mParticle-Rokt 9.3+ already requires - * Rokt-Widget ~> 5.3 transitively; declaring it directly keeps the Rokt iOS floor - * visible in the Podfile and survives a lockfile that still holds a 5.2.x build. - */ -const KIT_COMPANION_PODS: Record = { - 'mParticle-Rokt': [{ name: 'Rokt-Widget', version: "'~> 5.3'" }], -}; - /** * Get all pods that need dynamic framework linking */ @@ -429,52 +415,11 @@ function getDynamicFrameworkPods(iosKits?: string[]): string[] { return [...new Set(pods)]; // Remove duplicates } -function getPodDeclaration({ name, version }: PodDeclaration): string { - return version ? ` pod '${name}', ${version}` : ` pod '${name}'`; -} - -/** - * Every pod a kit selection needs in the Podfile: the kit itself plus its companions. - */ -function getKitPods(kits: string[]): PodDeclaration[] { - const pods: PodDeclaration[] = []; - for (const kit of kits) { - pods.push({ name: kit, version: KIT_VERSION_REQUIREMENTS[kit] }); - pods.push(...(KIT_COMPANION_PODS[kit] ?? [])); - } - return pods; -} - -/** - * Declare each kit and its companion pods inside the main target block. - * - * Pods are matched individually rather than per kit selection: a Podfile generated by an - * earlier plugin version already declares the kit, and must still pick up companion pods - * added since (for example the `Rokt-Widget` floor). - */ -export function addKitPodsToPodfile( - podfileContent: string, - iosKits: string[] -): string { - const missingPods = getKitPods(iosKits).filter( - pod => !podfileContent.includes(`pod '${pod.name}'`) - ); - - if (missingPods.length === 0) { - return podfileContent; - } - - // Look for use_react_native! and add after it - const useReactNativeRegex = /(use_react_native!\([^)]*\))/s; - if (!useReactNativeRegex.test(podfileContent)) { - return podfileContent; - } - - const kitPods = missingPods.map(getPodDeclaration).join('\n'); - return podfileContent.replace( - useReactNativeRegex, - `$1\n\n # mParticle kits (added by react-native-mparticle expo plugin)\n${kitPods}` - ); +function getKitPodDeclaration(kit: string): string { + const versionRequirement = KIT_VERSION_REQUIREMENTS[kit]; + return versionRequirement + ? ` pod '${kit}', ${versionRequirement}` + : ` pod '${kit}'`; } /** @@ -529,8 +474,26 @@ end } } + // Add kit pods if specified. Kits are matched individually so a Podfile that + // already declares one kit does not get it re-injected alongside a missing one. if (props.iosKits && props.iosKits.length > 0) { - podfileContent = addKitPodsToPodfile(podfileContent, props.iosKits); + const missingKits = props.iosKits.filter( + kit => !podfileContent.includes(`pod '${kit}'`) + ); + + if (missingKits.length > 0) { + const kitPods = missingKits.map(getKitPodDeclaration).join('\n'); + + // Add kit pods inside the main target block + // Look for use_react_native! and add after it + const useReactNativeRegex = /(use_react_native!\([^)]*\))/s; + if (useReactNativeRegex.test(podfileContent)) { + podfileContent = podfileContent.replace( + useReactNativeRegex, + `$1\n\n # mParticle kits (added by react-native-mparticle expo plugin)\n${kitPods}` + ); + } + } } fs.writeFileSync(podfilePath, podfileContent); diff --git a/plugin/tsconfig.json b/plugin/tsconfig.json index 12450ebe..6375b286 100644 --- a/plugin/tsconfig.json +++ b/plugin/tsconfig.json @@ -4,6 +4,5 @@ "outDir": "build", "rootDir": "src" }, - "include": ["./src"], - "exclude": ["./src/**/__tests__/**"] + "include": ["./src"] } diff --git a/sample/README.md b/sample/README.md index ba0b2187..26f43e51 100644 --- a/sample/README.md +++ b/sample/README.md @@ -64,7 +64,7 @@ cd sample/ios pod install ``` -The sample Podfile pins `mParticle-Rokt` `~> 9.3` and **`Rokt-Widget` `~> 5.3`**. Kit `9.3+` requires Rokt iOS `5.3+`, so CocoaPods does not resolve older `5.2.x`. +The sample Podfile pins `mParticle-Rokt` `~> 9.3`. That kit requires `Rokt-Widget` `~> 5.3`, so Rokt iOS resolves transitively and the Podfile does not declare it. There is no longer a `DcuiSchema` pin. `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version, so the schema cannot float out of sync with the `RoktUXHelper` sources. The previous `2.7.0` pin guarded against that float (schema `2.8.x` added `image` styling APIs that older `RoktUXHelper` Swift did not pass through, breaking `StyleTransformer` / `BaseStyles`) and now conflicts with the exact version `RoktUXHelper` requires. diff --git a/sample/ios/Podfile b/sample/ios/Podfile index 44357548..da241cbb 100644 --- a/sample/ios/Podfile +++ b/sample/ios/Podfile @@ -33,12 +33,11 @@ target 'MParticleSample' do # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) - # 9.3+ requires Rokt-Widget ~> 5.3 (mParticle-Rokt 9.3.2+). - pod 'mParticle-Rokt', '~> 9.3' - pod 'Rokt-Widget', '~> 5.3' - # No DcuiSchema pin: Rokt-Widget 5.3 resolves RoktUXHelper 1.0.0, which requires an + # The kit requires Rokt-Widget ~> 5.3, so Rokt iOS resolves transitively. No + # DcuiSchema pin either: Rokt-Widget 5.3 resolves RoktUXHelper 1.0.0, which requires an # exact `DcuiSchema` version, so the schema can no longer float out of sync with the # RoktUXHelper sources (the desync that the previous 2.7.0 pin guarded against). + pod 'mParticle-Rokt', '~> 9.3' target 'MParticleSampleTests' do inherit! :complete From 02c02831e250d6b93c33bbc63dc795b18b159d80 Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Wed, 29 Jul 2026 13:14:36 -0400 Subject: [PATCH 4/4] fix(ios): floor mParticle-Rokt at 9.3.1 so Rokt iOS 5.2.x cannot resolve `~> 9.3` admitted kit 9.3.0, which still declares Rokt-Widget ~> 5.2, so the stated 5.3 floor was not enforced. Reproduced with `pod install`: `~> 9.3` plus Rokt-Widget 5.2.6 resolves mParticle-Rokt 9.3.0 and Rokt-Widget 5.2.6. 9.3.1 is the first kit release declaring Rokt-Widget ~> 5.3, so use `>= 9.3.1', '< 10.0'` in the Expo config plugin, the sample Podfile, and docs, matching the podspec idiom already used for the core SDK floor. --- CHANGELOG.md | 2 +- ExpoTestApp/README.md | 2 +- MIGRATING.md | 19 ++++++++++--------- README.md | 6 +++--- plugin/src/withMParticleIOS.ts | 4 ++-- sample/README.md | 2 +- sample/ios/Podfile | 11 ++++++----- 7 files changed, 24 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53851a58..ee8c4d91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- iOS: require `mParticle-Rokt ~> 9.3` (kit declares `Rokt-Widget ~> 5.3`) +- iOS: require `mParticle-Rokt >= 9.3.1, < 10.0`. `9.3.1` is the first kit release declaring `Rokt-Widget ~> 5.3`; `9.3.0` still allows `~> 5.2` - iOS: no `Rokt-Widget` or `DcuiSchema` pins in the sample Podfile or Expo config plugin. Rokt iOS resolves through `mParticle-Rokt`, and `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version, so the schema can no longer float out of sync. Remove any `DcuiSchema` pin, which now conflicts during resolution ### Fixed diff --git a/ExpoTestApp/README.md b/ExpoTestApp/README.md index 100a3f77..9057c8e6 100644 --- a/ExpoTestApp/README.md +++ b/ExpoTestApp/README.md @@ -204,7 +204,7 @@ Check `ios/Podfile` for: - Kit pods (if specified): ```ruby - pod 'mParticle-Rokt', '~> 9.3' + pod 'mParticle-Rokt', '>= 9.3.1', '< 10.0' ``` ### Verify Android Integration diff --git a/MIGRATING.md b/MIGRATING.md index dad47a3c..ed91fd8d 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -28,24 +28,25 @@ dependencies with the `[6.0.0, 7.0)` range. `selectShoppableAds` remains a no-op on Android in this release. -## Migrating to mParticle-Rokt 9.3+ (Rokt iOS 5.3 floor) +## Migrating to mParticle-Rokt 9.3.1+ (Rokt iOS 5.3 floor) -This update aligns the React Native wrapper with `mParticle-Rokt` **9.3+**, +This update aligns the React Native wrapper with `mParticle-Rokt` **9.3.1+**, which requires `Rokt-Widget` `~> 5.3` (and `RoktContracts` `~> 2.0`), so the Rokt iOS floor is enforced by the kit's own dependency graph rather than only by -an app-level pin. +an app-level pin. `9.3.0` is excluded because it still allows `Rokt-Widget` +`~> 5.2`. ### Dependency Changes For standard Rokt placements on iOS, use: ```ruby -pod 'mParticle-Rokt', '~> 9.3' +pod 'mParticle-Rokt', '>= 9.3.1', '< 10.0' ``` -Do not add `Rokt-Widget` yourself — apps receive it through `mParticle-Rokt`, -which requires `~> 5.3`. Run `pod update` so an existing `Podfile.lock` does not -hold an older Rokt iOS build. +Do not add `Rokt-Widget` yourself — apps receive it through `mParticle-Rokt`. +Run `pod update` so an existing `Podfile.lock` does not hold an older Rokt iOS +build. `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version. Remove any `DcuiSchema` pin (for example the previously @@ -81,8 +82,8 @@ Use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements: ] ``` -The plugin pins generated `mParticle-Rokt` pods to `~> 9.3`. It does not add -payment-extension pods or URL callback forwarding in this release. +The plugin pins generated `mParticle-Rokt` pods to `>= 9.3.1, < 10.0`. It does +not add payment-extension pods or URL callback forwarding in this release. For global CNAME setup, configure the shared `customBaseUrl` setting: diff --git a/README.md b/README.md index c03b45ca..55534357 100644 --- a/README.md +++ b/README.md @@ -294,12 +294,12 @@ Next, you'll need to start the SDK: For standard Rokt placements, add the mParticle Rokt kit: ```ruby -pod 'mParticle-Rokt', '~> 9.3' +pod 'mParticle-Rokt', '>= 9.3.1', '< 10.0' ``` -The kit requires `Rokt-Widget` `~> 5.3`, so Rokt iOS resolves transitively — do not declare it yourself. +Kit `9.3.1` is the first release requiring `Rokt-Widget` `~> 5.3` (`9.3.0` still allows `~> 5.2`), so Rokt iOS resolves transitively from this floor — do not declare `Rokt-Widget` yourself. -In Expo apps, use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements. The Expo plugin pins `mParticle-Rokt` to `~> 9.3`. It does not add payment-extension pods or URL callback forwarding in this release. +In Expo apps, use `iosKits: ["mParticle-Rokt"]` for standard Rokt placements. The Expo plugin pins `mParticle-Rokt` to `>= 9.3.1, < 10.0`. It does not add payment-extension pods or URL callback forwarding in this release. See [MIGRATING.md](./MIGRATING.md) for release-specific migration guidance. diff --git a/plugin/src/withMParticleIOS.ts b/plugin/src/withMParticleIOS.ts index 5cb8437c..d0f27b89 100644 --- a/plugin/src/withMParticleIOS.ts +++ b/plugin/src/withMParticleIOS.ts @@ -387,8 +387,8 @@ const KIT_TRANSITIVE_DEPENDENCIES: Record = { }; const KIT_VERSION_REQUIREMENTS: Record = { - // 9.3+ declares Rokt-Widget ~> 5.3 (mParticle Apple SDK #796 / kit 9.3.2). - 'mParticle-Rokt': "'~> 9.3'", + // 9.3.1 is the first kit declaring Rokt-Widget ~> 5.3; 9.3.0 still allows ~> 5.2. + 'mParticle-Rokt': "'>= 9.3.1', '< 10.0'", }; /** diff --git a/sample/README.md b/sample/README.md index 26f43e51..75261d4c 100644 --- a/sample/README.md +++ b/sample/README.md @@ -64,7 +64,7 @@ cd sample/ios pod install ``` -The sample Podfile pins `mParticle-Rokt` `~> 9.3`. That kit requires `Rokt-Widget` `~> 5.3`, so Rokt iOS resolves transitively and the Podfile does not declare it. +The sample Podfile pins `mParticle-Rokt` `>= 9.3.1, < 10.0`. Kit `9.3.1` is the first release requiring `Rokt-Widget` `~> 5.3` (`9.3.0` still allows `~> 5.2`), so Rokt iOS resolves transitively and the Podfile does not declare it. There is no longer a `DcuiSchema` pin. `Rokt-Widget` `5.3` resolves `RoktUXHelper` `1.0.0`, which requires an exact `DcuiSchema` version, so the schema cannot float out of sync with the `RoktUXHelper` sources. The previous `2.7.0` pin guarded against that float (schema `2.8.x` added `image` styling APIs that older `RoktUXHelper` Swift did not pass through, breaking `StyleTransformer` / `BaseStyles`) and now conflicts with the exact version `RoktUXHelper` requires. diff --git a/sample/ios/Podfile b/sample/ios/Podfile index da241cbb..809630e4 100644 --- a/sample/ios/Podfile +++ b/sample/ios/Podfile @@ -33,11 +33,12 @@ target 'MParticleSample' do # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) - # The kit requires Rokt-Widget ~> 5.3, so Rokt iOS resolves transitively. No - # DcuiSchema pin either: Rokt-Widget 5.3 resolves RoktUXHelper 1.0.0, which requires an - # exact `DcuiSchema` version, so the schema can no longer float out of sync with the - # RoktUXHelper sources (the desync that the previous 2.7.0 pin guarded against). - pod 'mParticle-Rokt', '~> 9.3' + # 9.3.1 is the first kit requiring Rokt-Widget ~> 5.3 (9.3.0 still allows ~> 5.2), so + # Rokt iOS resolves transitively from this floor. No DcuiSchema pin either: Rokt-Widget + # 5.3 resolves RoktUXHelper 1.0.0, which requires an exact `DcuiSchema` version, so the + # schema can no longer float out of sync with the RoktUXHelper sources (the desync that + # the previous 2.7.0 pin guarded against). + pod 'mParticle-Rokt', '>= 9.3.1', '< 10.0' target 'MParticleSampleTests' do inherit! :complete