May 2026

We are excited to share the May SDK changelog for our product!

📘

Note

Click 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 CleverTapAPI provide 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 by fetchInbox()) are throttled once every 5 minutes between consecutive calls.
  • Inbox Viewed and Clicked Event Deduplication: Rapid duplicate Notification Viewed and Notification Clicked events for the same inbox message are now automatically suppressed to prevent analytics inflation. Additionally, a Notification Viewed event 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 calling markReadInboxMessage(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 CleverTapAPI provide 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 Viewed and Notification Clicked events for the same inbox message are now automatically suppressed to prevent analytics inflation. Additionally, a Notification Viewed event 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 calling markReadInboxMessage(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 Viewed continues to be raised regardless of read state, preserving existing behaviour.

Bug Fixes

  • Fixes a crash in CTInAppEvaluationManager that caused NSUserDefaults corruption.

May 04

Bug Fixes

iOS Push Notifications

  • Push permission dialog never appears: PromptForPushPermission was trying to register the device with Apple's servers (APNs) by calling registerForRemoteNotifications without first invoking requestAuthorizationWithOptions: to request permission from the user. iOS requires explicit authorization before registration; without it, the call is a silent no-op. Fixed by first calling requestAuthorizationWithOptions: 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,GetPushPermissionStatus was initialized to Unknown at 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 queries getNotificationSettingsWithCompletionHandler: 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 a SetPushToken function to forward the token to CleverTap, but nothing called it when the token arrived. Added a swizzle on application: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 registerForRemoteNotifications after 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: EnsurePushNotificationMonitoring read UNUserNotificationCenter.delegate to determine which class to swizzle. If the delegate was nil at init time, the willPresentNotification and didReceiveNotificationResponse swizzles would silently fail. Now falls back to AppDelegateClass when 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 bIOSAutoRequestPushPermission config flag. Defaults to false, preserving existing behavior where permission must be requested manually via the PromptForPushPermission call. This flag, when set to true, the app automatically requests push notification permission on first launch.

CleverTap Ask AI Widget (CSP-Safe)