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
44 changes: 43 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,52 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.3.0] - 2026-04-28

### Changed
- Reduced snapshot size and screen capture cost.
- Optimized masking performance for dynamic webviews.

### Fixed
- Fixed multiple memory leaks and reduced CPU usage during paused recording.
- Fixed crashes and ANRs related to session recording lifecycle.
- Improved web view masking stability.
- Fixed incorrect session engagement time calculation.

## [2.2.1] - 2026-01-29

### Changed
- Lowered the minimum supported Dart SDK to `3.5.0` across the plugin to match current Flutter stable toolchains.
- Improved session replays stabality and performance.
- Reduced log noise.
- [Android] Removed redundant dependencies for reduced SDK size and enhanced security.

### Fixed
- Fixed session data not found.

## [2.2.0] - 2025-12-23

### Added
- [Android] Support for session capturing on Android 16 devices.
- Support for tracking hybrid platforms and their versions.
- [iOS] Added automatic restoration of sessions lost when the app is killed.
- Introduced a capture error API so apps can report runtime errors through the SDK.

### Changed
- Improved rage tap detection to avoid misclassifying double taps as rage taps.
- Improved performance and modularity by decoupling the screen recording functionality from the main tracking flow.
- [Android] Optimized session recording and network request handling to reduce overhead during active sessions.

### Fixed
- Fixed an issue in the logout flow.
- [iOS] Corrected timer response rounding to return accurate durations.
- [Android] Fixed incorrect engagement time calculation in crash scenarios.
- [Android] Fixed ANRs occurring during SDK initialization.

## [2.1.1] - 2025-07-25

### Fixed
- Fixed an issue with manual unmasking of input components.
- Fixed an issue with manual unmasking of input components.
- Fixed an issue with session uploads when the app is rapidly killed.

## [2.1.0] - 2025-06-27
Expand Down
21 changes: 11 additions & 10 deletions MIGRATION.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
# Migration Guide
# Migration guide

This guide and chart should help facilitate the transition from the legacy UserExperior SDK to the new DevRev SDK in your Cordova application, providing insights into feature equivalents and method changes.

## Feature Equivalence Chart
## Feature equivalence chart

| Feature | UserExperior SDK | DevRev SDK |
|-|-|-|
| Installation | `cordova plugin add userexperior-cordova-plugin@<version>` | `cordova plugin add @devrev/sdk-cordova@<version>` |
| Installation | `cordova plugin add userexperior-cordova-plugin@<VERSION>` | `cordova plugin add @devrev/sdk-cordova` |
| Initialization | `UserExperior.startRecording(appID)` | `DevRev.configure(appID, successCallback, errorCallback)` |
| User Identification | `UserExperior.setUserIdentifier(userIdentifier)` | `DevRev.identifyAnonymousUser(userID, successCallback, errorCallback)`<br> `DevRev.identifyUnverifiedUser(identity, successCallback, errorCallback)`<br> `DevRev.identifyVerifiedUser(userID, sessionToken, successCallback, errorCallback)`<br> `DevRev.updateUser(identity, successCallback, errorCallback)`<br> `DevRev.logout(deviceID, successCallback, errorCallback)` |
| User Identification | `UserExperior.setUserIdentifier(userIdentifier)` | `DevRev.identifyAnonymousUser(userID, successCallback, errorCallback)`<br /> `DevRev.identifyUnverifiedUser(identity, successCallback, errorCallback)`<br /> `DevRev.identifyVerifiedUser(userID, sessionToken, successCallback, errorCallback)`<br /> `DevRev.updateUser(identity, successCallback, errorCallback)`<br /> `DevRev.logout(deviceID, successCallback, errorCallback)` |
| Event Tracking | `UserExperior.logEvent(name)` | `DevRev.trackEvent(name, properties, successCallback, errorCallback)` |
| Session Recording | `UserExperior.stopRecording()`<br />`UserExperior.pauseRecording()`<br />`UserExperior.resumeRecording()` | `DevRev.startRecording(successCallback, errorCallback)`<br />`DevRev.stopRecording(successCallback, errorCallback)`<br />`DevRev.pauseRecording(successCallback, errorCallback)`<br />`DevRev.resumeRecording(successCallback, errorCallback)`<br />`DevRev.processAllOnDemandSessions(successCallback, errorCallback)` |
| Opting-in or out | `UserExperior.optOut()`<br> `UserExperior.optIn()`<br> `UserExperior.getOptOutStatus()` | `DevRev.stopAllMonitoring(successCallback, errorCallback)`<br> `DevRev.resumeAllMonitoring(successCallback, errorCallback)` |
| Session Properties | `UserExperior.setUserProperties(userProperties)` | `DevRev.addSessionProperties(properties, successCallback, errorCallback)`<br />`DevRev.clearSessionProperties()` |
| Session Recording | `UserExperior.stopRecording()`<br />`UserExperior.pauseRecording()`<br />`UserExperior.resumeRecording()` | `DevRev.startRecording(successCallback, errorCallback)`<br />`DevRev.stopRecording(successCallback, errorCallback)`<br />`DevRev.pauseRecording(successCallback, errorCallback)`<br />`DevRev.resumeRecording(successCallback, errorCallback)` |
| Opt-in or out | `UserExperior.optOut()`<br /> `UserExperior.optIn()`<br /> `UserExperior.getOptOutStatus()` | `DevRev.stopAllMonitoring(successCallback, errorCallback)`<br /> `DevRev.resumeAllMonitoring(successCallback, errorCallback)` |
| Session Properties | `UserExperior.setUserProperties(userProperties)` | `DevRev.addSessionProperties(properties, successCallback, errorCallback)`<br />`DevRev.clearSessionProperties(successCallback, errorCallback)` |
| Masking Sensitive Data | `<input type="text" placeholder="Enter Username" name="username" required class="ue-mask">`<br />`<input type="text" placeholder="Enter Username" name="username" required class="ue-unmask">` | `<input type="text" placeholder="Enter Username" name="username" required class="devrev-mask">`<br />`<input type="text" placeholder="Enter Username" name="username" required class="devrev-unmask">` |
| Timers | `UserExperior.startTimer(timerName, properties)`<br> `UserExperior.endTimer(timerName, properties)` | `DevRev.startTimer(name, properties)`<br> `DevRev.endTimer(name, properties)` |
| PLuG support chat | Not supported. | `DevRev.showSupport(successCallback, errorCallback)`<br> `DevRev.createSupportConversation(successCallback, errorCallback)`<br> `DevRev.setShouldDismissModalsOnOpenLink(value, successCallback, errorCallback)`<br> `DevRevSDK.setInAppLinkHandler(handler, successCallback, errorCallback)` |
| Push Notifications | Not supported. | `DevRev.registerDeviceToken(deviceToken, deviceID, successCallback, errorCallback)`<br> `DevRev.unregisterDevice(deviceID, successCallback, errorCallback)`<br>`DevRev.processPushNotification(payload, successCallback, errorCallback)` |
| Timers | `UserExperior.startTimer(timerName, properties)`<br /> `UserExperior.endTimer(timerName, properties)` | `DevRev.startTimer(name, properties, successCallback, errorCallback)`<br /> `DevRev.endTimer(name, properties, successCallback, errorCallback)` |
| Support chat | Not supported. | `DevRev.showSupport(successCallback, errorCallback)`<br /> `DevRev.createSupportConversation(successCallback, errorCallback)`<br /> `DevRev.setShouldDismissModalsOnOpenLink(value, successCallback, errorCallback)`<br /> `DevRev.setInAppLinkHandler(handler, successCallback, errorCallback)` |
| Push Notifications | Not supported. | `DevRev.registerDeviceToken(deviceToken, deviceID, successCallback, errorCallback)`<br /> `DevRev.unregisterDevice(deviceID, successCallback, errorCallback)`<br />`DevRev.processPushNotification(payload, successCallback, errorCallback)` |
Loading
Loading