May 2026
We are excited to share the May SDK changelog for our product!
NoteClick each SDK header to view the corresponding GitHub repository for release details.
May 20
What's New
- App Inbox Cross-Device Sync: App Inbox messages now sync across a user's devices. If a user reads or deletes a message on one device, it is automatically reflected on their other devices.
- New Inbox Fetch APIs: The SDK already fetches inbox messages automatically on app launch and user login. Two new public methods on
CleverTapAPIprovide on-demand refresh support, that are throttled once every 5 minutes between consecutive calls:fetchInbox(): triggers an inbox refresh from the server (fire-and-forget).fetchInbox(FetchInboxCallback): triggers an inbox refresh from the server (fire-and-forget), but invokes the callback with a success or failure result when the fetch completes. The callback fires on the SDK's network thread, not the main thread.
- Pull-to-Refresh in Built-in Inbox: The built-in App Inbox (
showAppInbox()) now supports a pull-to-refresh gesture. Manual inbox fetches (including those triggered byfetchInbox()) are throttled once every 5 minutes between consecutive calls. - Inbox Viewed and Clicked Event Deduplication: Rapid duplicate
Notification ViewedandNotification Clickedevents for the same inbox message are now automatically suppressed to prevent analytics inflation. Additionally, aNotification Viewedevent is not raised for messages that have already been read on another device.
Note
- For custom inbox implementations, ensure
pushInboxNotificationViewedEvent(messageId)is called when a message becomes visible to the user, before callingmarkReadInboxMessage(messageId). Calling them in reverse order will silently drop the Notification Viewed event.- The already-read suppression applies only to accounts enabled for App Inbox Cross-Device Sync. For accounts not using this feature, the Notification Viewed event is still raised regardless of read state, preserving existing behaviour.
- Pull-to-refresh is automatically disabled for accounts not enabled for App Inbox Cross-Device Sync. The message list remains fully visible and scrollable; only the swipe gesture is disabled.
May 19
What's New
- App Inbox Cross-Device Sync: App Inbox messages now sync across a user's devices. If a user reads or deletes a message on one device, it is automatically reflected on their other devices.
- New Inbox Fetch APIs: The SDK already fetches inbox messages automatically on app launch and user login. Two new public methods on
CleverTapAPIprovide on-demand refresh support, that are throttled once every 5 minutes between consecutive calls:fetchInbox(): triggers an inbox refresh from the server (fire-and-forget).fetchInbox(callback:): same as above, but invokes the callback with a success/failure result when the fetch completes.
- Pull-to-Refresh in Built-in Inbox: The built-in App Inbox now supports a pull-to-refresh gesture. Manual inbox fetches (including those triggered by
fetchInbox()) are throttled once every 5 minutes between consecutive calls. - Inbox Viewed and Clicked Event Deduplication: Rapid duplicate
Notification ViewedandNotification Clickedevents for the same inbox message are now automatically suppressed to prevent analytics inflation. Additionally, aNotification Viewedevent is not raised for messages that have already been read on another device.
Note
- For custom inbox implementations, ensure
recordInboxNotificationViewedEvent(messageId)is called when a message becomes visible to the user, before callingmarkReadInboxMessage(messageId). Calling them in reverse order will silently drop the Viewed event.- The already-read suppression applies only to accounts enabled for App Inbox Cross-Device Sync. For accounts not using this feature,
Notification Viewedcontinues to be raised regardless of read state, preserving existing behaviour.
Bug Fixes
- Fixes a crash in
CTInAppEvaluationManagerthat caused NSUserDefaults corruption.
May 04
Bug Fixes
iOS Push Notifications
- Push permission dialog never appears:
PromptForPushPermissionwas trying to register the device with Apple's servers (APNs) by callingregisterForRemoteNotificationswithout first invokingrequestAuthorizationWithOptions:to request permission from the user. iOS requires explicit authorization before registration; without it, the call is a silent no-op. Fixed by first callingrequestAuthorizationWithOptions:to show the Allow/Don't Allow dialog, then registering with APNs only after the user grants permission. - Push permission status always shows UNKNOWN: On app launch,
GetPushPermissionStatuswas initialized toUnknownat startup and never queried the real iOS state. This meant the the app does not register permission even if the user had already granted permission on a previous launch. Now queriesgetNotificationSettingsWithCompletionHandler:at init so the returned status is accurate immediately. - APNs token never reached CleverTap (dashboard showed "Unsubscribed"): When iOS generates a push token for a device, it delivers it via a specific AppDelegate method:
application:didRegisterForRemoteNotificationsWithDeviceToken:. The plugin had aSetPushTokenfunction to forward the token to CleverTap, but nothing called it when the token arrived. Added a swizzle onapplication:didRegisterForRemoteNotificationsWithDeviceToken:in the AppDelegate (the same interception pattern used for other push callbacks) to forward the token directly to CleverTap. This fix also injects the method entirely if it is missing in Unreal Engine 5.x. - Race condition on reinstalls: If permission was already granted on a previous install, iOS sends the APNs token almost immediately at app launch, before CleverTap's SDK has subscribed to listen for it, silently losing the token. Fixed by re-calling
registerForRemoteNotificationsafter subscribing, forcing iOS to re-deliver the current token even though registration is already done. - Silent registration failures: Added a swizzle on
application:didFailToRegisterForRemoteNotificationsWithError:so any APNs registration failure is logged clearly instead of disappearing silently. - Notification swizzles failing when delegate not yet set:
EnsurePushNotificationMonitoringreadUNUserNotificationCenter.delegateto determine which class to swizzle. If the delegate was nil at init time, thewillPresentNotificationanddidReceiveNotificationResponseswizzles would silently fail. Now falls back toAppDelegateClasswhen nil.
What's New
Android
- Android CleverTap SDK upgraded from 7.4.0 to 8.0.0.
iOS
- iOS CleverTap SDK upgraded from 7.2.0 to 7.6.0.
- Added a new
bIOSAutoRequestPushPermissionconfig flag. Defaults tofalse, preserving existing behavior where permission must be requested manually via thePromptForPushPermissioncall. This flag, when set totrue, the app automatically requests push notification permission on first launch.
Updated 17 days ago
