Skip to content

chore: merge commit from Main#594

Merged
BrandonStalnaker merged 63 commits intoworkstation/9.0-Releasefrom
chore/merge-commit-Feb
Feb 17, 2026
Merged

chore: merge commit from Main#594
BrandonStalnaker merged 63 commits intoworkstation/9.0-Releasefrom
chore/merge-commit-Feb

Conversation

@BrandonStalnaker
Copy link
Collaborator

Background

  • Merge commit to cleanup commit history

jamesnrokt and others added 30 commits December 10, 2025 11:05
* refactor: Remove specific line numbers from test comments

- Made comments more maintainable by removing hardcoded line references
- Comments now reference source methods without specific line numbers

* Add integration test for getUserAudiences API

- Tests retrieving user audience memberships via Identity API
- Covers successful audience retrieval with mock data
- Verifies getAudiencesWithCompletionHandler method
- Includes enabled AudienceAPI flag in config for testing

* Add integration test for timed events

- Add testLogTimedEvent function to test begin/end timed event flow
- Test uses fixed 2-second delay for deterministic behavior
- Add WireMock recordings for timed event API call
- Verify event duration is properly calculated and sent

* Add integration test for logError

- Tests error logging with custom event info dictionary
- Verifies error events are properly sent with attributes (cause: slippery floor)
- Covers error severity level and exception handling attributes
- Adds iba (instruction base address) and el (event length) to dynamic fields list
- Fixes timed event mapping to ignore variable event length values

* Add integration test for logException

- Tests NSException logging functionality
- Covers exception name, reason, and SDK handling
- Based on ViewController.m logException method
- Fixes dynamic 'is' field in mapping-log-error.json to use ${json-unit.ignore}

* feat: Pass API keys via environment variables in integration tests

- Read MPARTICLE_API_KEY and MPARTICLE_API_SECRET from environment variables in main.swift
- Pass environment variables to simulator using SIMCTL_CHILD_ prefix in common.sh
- Add documentation for required environment variables in README.md
- Validate that environment variables are set before launching tests

* Add integration test for setUserAttribute

- Tests setting predefined user attributes (Age, Gender)
- Covers custom user attributes (Achieved Level)
- Verifies attributes are properly sent in events batch
- Related to SDKE-632

* Add integration test for incrementUserAttribute

- Tests incrementing a numeric user attribute by a specified value
- Covers setting initial attribute value and incrementing it
- Verifies both SET and INCREMENT operations are properly handled
- Related to user attribute management functionality

* - decrease timeout

* Add mapping for Rokt identify request

* Auto-create/remove proxy mappings in recorder/verification scripts

- Add create_proxy_mappings() function to common.sh
- Add remove_proxy_mappings() function to common.sh
- Call create_proxy_mappings in run_wiremock_recorder.sh
- Call remove_proxy_mappings in run_clean_integration_tests.sh
- Remove static proxy mapping files (now generated dynamically)

* Allow running verification tests without API keys

- Use fake keys (us1-00000000...) when env vars not set
- Real keys only required for recording mode
- Update README.md to document this behavior
- Add key validation in run_wiremock_recorder.sh

* Add integration test for setSessionAttribute

- Test sets session attribute 'Station' with value 'Classic Rock'
- Session attributes are sent in session end message (dt: se)
- Calls endSession() to trigger sending the attribute
- Added corresponding WireMock mapping and body files

* Add integration test for incrementSessionAttribute

- Test increments session attribute 'Song Count' by 1 (initial value 5 → 6)
- Requires beginSession() since previous test ends session
- Session attributes are sent in session end message (dt: se)
- Added two mappings: session start (ss) and session end (se)
- Based on ViewController.m lines 348-351

* Add integration test for CCPA consent state

Test 14: Toggle CCPA Consent
- Sets CCPA consent state on current user with all fields (consented, document, timestamp, location, hardwareId)
- Logs event to trigger upload that includes consent data in request body
- Verifies CCPA data is transmitted in 'con.ccpa.data_sale_opt_out' field

Based on ViewController.m toggleCCPAConsent method (lines 357-386)

* Add integration test for toggleGDPRConsent

- Test sets GDPR consent state on the current user
- Based on ViewController.m toggleGDPRConsent method (lines 388-416)
- Creates MPGDPRConsent with consented=true, document, timestamp, location, hardwareId
- Adds GDPR consent with purpose 'My GDPR Purpose' to MPConsentState
- Preserves existing CCPA consent state
- Logs event to trigger upload with consent state in 'con' field
- Uses static timestamp for deterministic testing

* Add integration test for logIDFA (modify iOS Advertiser ID)

- Test modifies user identity to add/update the iOS Advertiser ID via Identity API
- Uses static IDFA value for deterministic testing
- Based on ViewController.m logIDFA method (lines 418-429)
- Added corresponding WireMock mapping and body files

* Add integration test for setATTStatus (App Tracking Transparency)

- Test sets ATT status to 'authorized' with static timestamp
- Based on ViewController.m requestIDFA method (lines 431-476)
- ATT status is sent in device info ('atts' field)
- ATT timestamp is sent in device info ('attt' field)
- Added corresponding WireMock mapping and body files
* Manual APIs: To allow customers to manually forward these calls to mParticle in case they don’t want it to proxy.
* Backward Compatibility: We should maintain full support for AppDelegate-based apps while adding SceneDelegate support.

Co-authored-by: Denis Chilik <denis.chilik@rokt.com>
* Update max parrallel

* chore: Change setup xcode to use 3rd party action

* Setup specified simulator

* Add fail fast false so all tests run and we can see failures
* chore(ci): add GitHub Actions workflow for integration tests

- Add integration-tests.yml workflow with Colima/Docker setup
- Support headless simulator mode for CI environments
- Upload artifacts (WireMock logs, requests) on test failures

* fix(ci): use Java WireMock instead of Docker for macOS runners

- Replace Colima/Docker with standalone WireMock JAR
- Add run_integration_tests_ci.sh for CI-specific execution
- Use sudo for binding to privileged HTTPS port 443

* - update ranches

* fix(mappings): make timezone field dynamic for CI compatibility

* fix(mappings): make timezone name field dynamic for CI compatibility

* test: change events API version to v3 (intentional break)

* - revert test commit

* - run for all PRs

* Fix testIncrementSessionAttribute timing issue in CI

Replace sleep(1) with uploadWaiter.wait() after beginSession() to ensure
session start is uploaded as a separate request before session end.
This prevents SDK from batching both messages into one request in CI
where execution is faster.

* - address github comments
* chore: Align concurrency and branch rules

* Use same simulator setup in secondary platform tests

* Add timeout for native tests
* chore: Replace CPP Kit Bracket code

* Update max parrallel

* Use setup-xcode action

* Revert "Use setup-xcode action"

This reverts commit 0ffa2c9.
…nException (#469)

fix: handle NSInvalidUnarchiveOperationException on SDK upgrade
* fix: Rokt User Attribute Mapping

* code improvements suggested by Nick

* feat: Add IDFA and IDFV Support for FilteredMParticleUser

* fix: Simulator not found failing CI

* Update .github/workflows/native-tests.yml

Co-authored-by: Nickolas Dimitrakas <nickolas.dimitrakas@rokt.com>

---------

Co-authored-by: Nickolas Dimitrakas <nickolas.dimitrakas@rokt.com>
fix: Use awk for Changelog
* chore: Trunk fixes

* Manual fixes
* fix: Quotes and braces

* Quotes

* Fix sudo and regex quotes
* chore: Release 8.41.0

* Exclude CHANGELOG.md from linting

* fix Integrations Tests
* ci: Add Manual Release Workflow

* Improvements from CR
chore(release): 8.41.0

Updates version to 8.41.0 in:
- CHANGELOG.md
- Framework/Info.plist
- Package.swift
- mParticle-Apple-SDK.podspec
- mParticle-Apple-SDK/MPConstants.swift
- mParticle-Apple-SDK/MPIConstants.m
- mParticle_Apple_SDK.json
chore(release): 8.41.1

Updates version to 8.41.1 in:
- CHANGELOG.md
- Framework/Info.plist
- Package.swift
- mParticle-Apple-SDK.podspec
- mParticle-Apple-SDK/MPConstants.swift
- mParticle-Apple-SDK/MPIConstants.m
- mParticle_Apple_SDK.json
* chore: Fix common trunk issues

* Update version number in test

* Bump integration test versions

* Bump integration test versions

* Correct all versions
chore: Fix CHANGELONG.md entry for 8.41.0

Co-authored-by: James Newman <james.newman@rokt.com>
* ci: Generate size reports

* Cleanup

* Add temp push trigger

* Change output

* Update to report impact

* Build from source

* Correct swift-tools-version

* Remove temporary push trigger

* Create README.md

* Add comment ID so comments are correctly updated

* Report xcframework size

* Remove duplication of report data

* Remove usage of head ref

* Add diagram to explain the flow
* chore: bump actions/checkout from 5 to 6

Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Trunk fixes

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: James Newman <james.newman@rokt.com>
* - we should update mappings during the release process

* - formatting

* - address trunk checks

* - move mappings update into the separate file and verify that it works correctly

* - apply trunk fixes
* chore: bump actions/upload-artifact from 5 to 6

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: bump actions/upload-artifact from 5 to 6

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update integration-tests.yml

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: James Newman <james.newman@rokt.com>
Bumps [peter-evans/find-comment](https://github.com/peter-evans/find-comment) from 3 to 4.
- [Release notes](https://github.com/peter-evans/find-comment/releases)
- [Commits](peter-evans/find-comment@v3...v4)

---
updated-dependencies:
- dependency-name: peter-evans/find-comment
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [peter-evans/create-or-update-comment](https://github.com/peter-evans/create-or-update-comment) from 4 to 5.
- [Release notes](https://github.com/peter-evans/create-or-update-comment/releases)
- [Commits](peter-evans/create-or-update-comment@v4...v5)

---
updated-dependencies:
- dependency-name: peter-evans/create-or-update-comment
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
jamesnrokt and others added 25 commits February 5, 2026 17:24
* feat: Update logging and provide guidelines

* Fix static analysis warnings
* feat: Add and align logging

* Fix nil passed to a callee that needs a non-null
* chore(release): 8.42.1

Updates version to 8.42.1 in:
- CHANGELOG.md
- Framework/Info.plist
- Package.swift
- mParticle-Apple-SDK.podspec
- mParticle-Apple-SDK/MPConstants.swift
- mParticle-Apple-SDK/MPIConstants.m
- mParticle_Apple_SDK.json
- IntegrationTests/wiremock-recordings/mappings/*.json

* Trunk fixes

---------

Co-authored-by: mParticle Automation <developers@mparticle.com>
* feat: Add placement options and update method signatures

- Introduced MPRoktPlacementOptions class to encapsulate timing information for performance tracking.
- Updated method signatures to include options parameter in executeWithIdentifier calls.
- Modified unit tests to validate the new placement options functionality.

* fix: change `MPRoktPlacementOptions` and dynamicPerformanceMarkers
* chore(release): 8.42.2

Updates version to 8.42.2 in:
- CHANGELOG.md
- Framework/Info.plist
- Package.swift
- mParticle-Apple-SDK.podspec
- mParticle-Apple-SDK/MPConstants.swift
- mParticle-Apple-SDK/MPIConstants.m
- mParticle_Apple_SDK.json
- IntegrationTests/wiremock-recordings/mappings/*.json

* Fix trunk issues and format before creating the commit

---------

Co-authored-by: mParticle Automation <developers@mparticle.com>
* fix: MPURLRequestBuilder build crash

* Change signature to nullable
* fix: app crash from [MPUpload description]

Stacktrace
```
0  libsystem_malloc.dylib         0x30a0 _xzm_xzone_malloc_freelist_outlined + 864
1  Foundation                     0x4804 -[NSString quotedStringRepresentation] + 132
2  Foundation                     0x4724 -[NSString _stringRepresentation] + 360
3  CoreFoundation                 0x14a580 -[NSDictionary descriptionWithLocale:indent:] + 1128
4  CoreFoundation                 0x14a5ac -[NSDictionary descriptionWithLocale:indent:] + 1172
5  Foundation                     0x36b4 _NSDescriptionWithLocaleFunc + 56
6  CoreFoundation                 0x15cb0 __CFSTRING_IS_CALLING_OUT_TO_AN_OBJECT_FORMAT_ARGUMENT_WITH_LOCALE__ + 28
7  CoreFoundation                 0x8c4c __CFStringAppendFormatCore + 9968
8  CoreFoundation                 0x122e4 _CFStringCreateWithFormatAndArgumentsReturningMetadata + 184
9  CoreFoundation                 0x12398 _CFStringCreateWithFormatAndArgumentsAux2 + 44
10 Foundation                     0x9b2bb0 +[NSString stringWithFormat:] + 68
11 mParticle_Apple_SDK            0x3b7c8 -[MPUpload description] + 172
12 mParticle_Apple_SDK            0x232c4 -[MPPersistenceController_PRIVATE saveUpload:] + 1472
13 mParticle_Apple_SDK            0x94d1c -[MPUploadBuilder build:] + 3488
14 mParticle_Apple_SDK            0x6e30c __55-[MPBackendController_PRIVATE prepareBatchesForUpload:]_block_invoke_4 + 548
```

* MPListenerController is not required in this scenario.
Removing MPListenerController
…play (#576)

The currentUser property on MPIdentityApi was nonatomic with no
synchronization, but written on messageQueue (via identity responses)
and read on the main queue (via replayQueuedItems -> isActiveAndNotDisabled).
Stacktrace
```
0  libobjc.A.dylib                0x144c objc_retain_x0
1  libobjc.A.dylib                0x144c objc_retain
2  mParticle_Apple_SDK            0x392f8 -[MPIdentityApi currentUser] + 32
3  mParticle_Apple_SDK            0x8a078 -[MPKitContainer_PRIVATE isActiveAndNotDisabled:] + 208
4  mParticle_Apple_SDK            0x89ed0 -[MPKitContainer_PRIVATE activeKitsRegistry] + 208
5  mParticle_Apple_SDK            0x8ccc0 -[MPKitContainer_PRIVATE forwardSDKCall:event:parameters:messageType:userInfo:] + 124
6  mParticle_Apple_SDK            0x7ed3c __43-[MPKitContainer_PRIVATE replayQueuedItems]_block_invoke_3 + 88
```
* fix: background expiration race

* edit tests

* remove additional mock interface
fix: Guarantee UserDefsults Thread Safety
* fix: App crash when JSON serialization of upload dictionary

Prevent heap corruption from concurrent mutation of shared mutable objects during JSON serialization.
Added a mechanism to create a deep immutable copy of JSON-compatible objects, ensuring thread safety and preventing heap corruption during serialization.
Invalid entries are logged and dropped.
Stacktrace
```
0  libsystem_malloc.dylib         0x30a0 _xzm_xzone_malloc_freelist_outlined + 864
1  Foundation                     0xa2e854 -[_NSJSONWriter resizeTemporaryBuffer:] + 104
2  Foundation                     0x114f8 _convertJSONString + 148
3  Foundation                     0x1138c _writeJSONString + 84
4  Foundation                     0x94628 ___writeJSONObject_block_invoke + 412
5  CoreFoundation                 0x12044 __NSDICTIONARY_IS_CALLING_OUT_TO_A_BLOCK__ + 24
6  CoreFoundation                 0x19fb40 -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 288
7  Foundation                     0x97c54 _writeJSONObject + 512
8  Foundation                     0x94628 ___writeJSONObject_block_invoke + 412
9  CoreFoundation                 0x12044 __NSDICTIONARY_IS_CALLING_OUT_TO_A_BLOCK__ + 24
10 CoreFoundation                 0x19fb40 -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 288
11 Foundation                     0x97c54 _writeJSONObject + 512
12 Foundation                     0xa2e70c -[_NSJSONWriter dataWithRootObject:options:] + 104
13 Foundation                     0xa2f6b8 +[NSJSONSerialization dataWithJSONObject:options:error:] + 112
14 mParticle_Apple_SDK            0x3b480 -[MPUpload initWithSessionId:uploadDictionary:dataPlanId:dataPlanVersion:uploadSettings:] + 140
15 mParticle_Apple_SDK            0x94cfc -[MPUploadBuilder build:] + 3456
16 mParticle_Apple_SDK            0x6e30c __55-[MPBackendController_PRIVATE prepareBatchesForUpload:]_block_invoke_4 + 548
```

* refactor: rework the fix to cover SDKE-906

Stacktrace
```
0  libsystem_malloc.dylib         0x35104 _xzm_xzone_malloc_from_tiny_chunk.cold.1 + 36
1  libsystem_malloc.dylib         0x1d28 _xzm_xzone_malloc_from_tiny_chunk + 612
2  libsystem_malloc.dylib         0x164c _xzm_xzone_find_and_malloc_from_tiny_chunk + 112
3  libsystem_malloc.dylib         0x1e84 _xzm_xzone_malloc_tiny_outlined + 312
4  CoreFoundation                 0x3566c __CFBinaryPlistWriteOrPresize + 292
5  Foundation                     0x5ed80 -[NSKeyedArchiver finishEncoding] + 640
6  Foundation                     0x2c39e4 +[NSKeyedArchiver archivedDataWithRootObject:] + 112
7  mParticle_Apple_SDK            0x23234 -[MPPersistenceController_PRIVATE saveUpload:] + 1284
8  mParticle_Apple_SDK            0x95154 -[MPUploadBuilder build:] + 3488
9  mParticle_Apple_SDK            0x6e744 __55-[MPBackendController_PRIVATE prepareBatchesForUpload:]_block_invoke_4 + 548
10 CoreFoundation                 0x1ce98 __NSDICTIONARY_IS_CALLING_OUT_TO_A_BLOCK__ + 24
11 CoreFoundation                 0x1d078 -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 288
12 mParticle_Apple_SDK            0x6e4e0 __55-[MPBackendController_PRIVATE prepareBatchesForUpload:]_block_invoke_3 + 172
13 CoreFoundation                 0x1ce98 __NSDICTIONARY_IS_CALLING_OUT_TO_A_BLOCK__ + 24
14 CoreFoundation                 0x1d078 -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 288
15 mParticle_Apple_SDK            0x6e3fc __55-[MPBackendController_PRIVATE prepareBatchesForUpload:]_block_invoke_2 + 164
```
* fix: Potential crash in MPURLRequestBuilder

* Add validation for API key and secret

* Allow nil secrets and key

There's logic allowing network requests without the header x-mp-signature
* fix: endSessionIfTimedOut race condition

* add test
* fix: Dispatch MPNetworkCommunication main thread

* Update MPBackendControllerTests.m
* test: fix endSessionIfTimedOut failing tests

* adjust fix for message queue mismatch

* add test for automaticSessionTracking being disabled
* Reordered the release workflow steps so "Upload xcframeworks to S3" runs after "Push release branch"
* New step order: Commit version changes → Push release branch → Upload to S3 → Create Pull Request
* This ensures the irreversible S3 upload only happens after the git state is successfully committed and pushed, preventing version numbers from being burned on failed releases
* Removed trunk fmt step from the workflow since it's no longer needed
* Rewrote Scripts/update_mapping_versions.sh to use sed for in-place string replacement instead of jq. This preserves the original file formatting and eliminates the need for post-processing with prettier or trunk fmt.
chore: (release) 8.43.1

Updates version to 8.43.1 in:
- CHANGELOG.md
- Framework/Info.plist
- Package.swift
- mParticle-Apple-SDK.podspec
- mParticle-Apple-SDK/MPConstants.swift
- mParticle-Apple-SDK/MPIConstants.m
- mParticle_Apple_SDK.json
- IntegrationTests/wiremock-recordings/mappings/*.json
@BrandonStalnaker BrandonStalnaker self-assigned this Feb 17, 2026
@github-actions
Copy link

📦 SDK Size Impact Report

Measures how much the SDK adds to an app's size (with-SDK minus without-SDK).

Metric Target Branch This PR Change
App Bundle Impact 1.66 MB 1.66 MB +N/A
Executable Impact 896 bytes 896 bytes +N/A
XCFramework Size 5.47 MB 5.47 MB +N/A

➡️ SDK size impact change is minimal.

Raw measurements

Target branch (workstation/9.0-Release):

{"baseline_app_size_kb":84,"baseline_executable_size_bytes":75464,"with_sdk_app_size_kb":1788,"with_sdk_executable_size_bytes":76360,"sdk_impact_kb":1704,"sdk_executable_impact_bytes":896,"xcframework_size_kb":5604}

This PR:

{"baseline_app_size_kb":84,"baseline_executable_size_bytes":75464,"with_sdk_app_size_kb":1788,"with_sdk_executable_size_bytes":76360,"sdk_impact_kb":1704,"sdk_executable_impact_bytes":896,"xcframework_size_kb":5604}

@BrandonStalnaker BrandonStalnaker merged commit 955ed8c into workstation/9.0-Release Feb 17, 2026
13 checks passed
@BrandonStalnaker BrandonStalnaker deleted the chore/merge-commit-Feb branch February 17, 2026 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

Comments