Skip to content
Open
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
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
Change Log
==========

Version 4.2.0 *(June 11 2026)*
-------------------------------------------
**What's new**
* **[Android Platform]**
* Supports [CleverTap Android SDK v8.3.0](https://github.com/CleverTap/clevertap-android-sdk/blob/master/docs/CTCORECHANGELOG.md#version-830-june-2026).
* App Inbox Cross-Device Sync (landed in Android SDK v8.2.0) — inbox state (read, deleted) syncs across a user's devices automatically. The built-in App Inbox view now includes a pull-to-refresh gesture, throttled to once every 5 minutes.
* Native Display Element Click — finer-grained click analytics for Native Display experiences via `pushDisplayUnitElementClickedEventForID`.

* **[iOS Platform]**
* Supports [CleverTap iOS SDK v7.7.1](https://github.com/CleverTap/clevertap-ios-sdk/blob/master/CHANGELOG.md#version-771-june-04-2026).
* App Inbox Cross-Device Sync (landed in iOS SDK v7.7.0) — inbox state (read, deleted) syncs across a user's devices automatically. The built-in App Inbox view now includes a pull-to-refresh gesture, throttled to once every 5 minutes.
* Native Display Element Click — finer-grained click analytics for Native Display experiences via `pushDisplayUnitElementClickedEventForID`.
* Silent-in-foreground push notifications — push notifications can be suppressed from appearing as heads-up alerts when the app is in the foreground via the `wzrk_sif:true` payload key. Works automatically when using `autoIntegrate`; manual integration requires calling the new `handleWillPresentNotification:withDefaultOptions:completionHandler:` method from your `UNUserNotificationCenterDelegate`.

**API changes**
* **[Android and iOS Platform]**
* Adds `fetchInbox(callback?)` — triggers an on-demand App Inbox refresh from the server; optional callback receives a success/failure boolean. Throttled to once every 5 minutes.
* Adds `pushDisplayUnitElementClickedEventForID(unitID, additionalProperties)` — records a `Notification Clicked` event for a specific element within a Display Unit, merging caller-supplied properties with cached `wzrk_*` attribution fields.

Version 4.1.0 *(April 30 2026)*
-------------------------------------------
**What's new**
Expand Down
68 changes: 68 additions & 0 deletions Example/android/app/src/main/assets/custom/templates.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
{
"Example template": {
"type": "template",
"arguments": {
"bool": {
"type": "boolean",
"value": false
},
"string": {
"type": "string",
"value": "Default"
},
"map": {
"type": "object",
"value": {
"int": {
"type": "number",
"value": 0
},
"string": {
"type": "string",
"value": "Default"
}
}
},
"action": {
"type": "action"
},
"file": {
"type": "file"
}
}
},
"Example function": {
"type": "function",
"isVisual": false,
"arguments": {
"double": {
"type": "number",
"value": 99.98
},
"string": {
"type": "string",
"value": "Default"
},
"file": {
"type": "file"
}
}
},
"Example visual function": {
"type": "function",
"isVisual": true,
"arguments": {
"color": {
"type": "string",
"value": "transparent"
},
"enabled": {
"type": "boolean",
"value": false
},
"image": {
"type": "file"
}
}
}
}
8 changes: 8 additions & 0 deletions Example/app/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ export default class App extends Component {
action: Actions.INBOX_NOTIFICATION_CLICKED,
name: 'pushInboxNotificationClickedEvent',
},
{ action: Actions.FETCH_INBOX, name: 'fetchInbox' },
],
},
{
Expand Down Expand Up @@ -348,6 +349,7 @@ export default class App extends Component {
subCategory: [
{ action: Actions.DISPLAY_UNIT_ID, name: 'getUnitID' },
{ action: Actions.ALL_DISPLAY_UNITS, name: 'getAllDisplayUnits' },
{ action: Actions.PUSH_DISPLAY_UNIT_ELEMENT_CLICKED, name: 'pushDisplayUnitElementClickedEventForID' },
],
},
{
Expand Down Expand Up @@ -513,6 +515,9 @@ export default class App extends Component {
case Actions.INBOX_NOTIFICATION_CLICKED:
AppUtils.pushInboxNotificationClicked();
break;
case Actions.FETCH_INBOX:
AppUtils.fetchInbox();
break;
case Actions.PUSH_EVENT:
AppUtils.pushevent();
break;
Expand Down Expand Up @@ -579,6 +584,9 @@ export default class App extends Component {
case Actions.ALL_DISPLAY_UNITS:
AppUtils.getAllDisplayUnits();
break;
case Actions.PUSH_DISPLAY_UNIT_ELEMENT_CLICKED:
AppUtils.pushDisplayUnitElementClickedEventForID();
break;
case Actions.PRODUCT_CONFIG_FETCH:
AppUtils.fetch();
break;
Expand Down
15 changes: 15 additions & 0 deletions Example/app/app-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,13 @@ export const pushInboxNotificationClicked = () => {
CleverTap.pushInboxNotificationClickedEventForId('Message Id');
};

export const fetchInbox = () => {
CleverTap.fetchInbox((err, success) => {
console.log('fetchInbox success:', success, err);
showToast(`fetchInbox success: ${success}`);
});
};

export const printInboxMessagesArray = (data) => {
if (data != null) {
console.log('Total Inbox Message count = ' + data.length);
Expand Down Expand Up @@ -572,6 +579,14 @@ export const getAllDisplayUnits = () => {
});
};

export const pushDisplayUnitElementClickedEventForID = () => {
const unitID = 'unit-5a8f3b';
const additionalProperties = { wzrk_element_id: 'cta-button-buy', campaign_type: 'banner', position: 0 };
CleverTap.pushDisplayUnitElementClickedEventForID(unitID, additionalProperties);
showToast('pushDisplayUnitElementClickedEventForID called');
console.log('pushDisplayUnitElementClickedEventForID', unitID, additionalProperties);
};

// Product Config
export const productConfig = () => {
showToast('Product Configuration set to default');
Expand Down
2 changes: 2 additions & 0 deletions Example/app/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export const Actions = {
INBOX_READ_MESSAGE_FOR_ID: 'INBOX_READ_MESSAGE_FOR_ID',
INBOX_NOTIFICATION_VIEWED: 'INBOX_NOTIFICATION_VIEWED',
INBOX_NOTIFICATION_CLICKED: 'INBOX_NOTIFICATION_CLICKED',
FETCH_INBOX: 'FETCH_INBOX',
PUSH_EVENT: 'PUSH_EVENT',
PUSH_CHARGED_EVENT: 'PUSH_CHARGED_EVENT',
GET_USER_EVENT_LOG: 'GET_USER_EVENT_LOG',
Expand All @@ -45,6 +46,7 @@ export const Actions = {
CREATE_NOTIFICATION_CHANNEL_WITH_GROUP_AND_SOUND: 'CREATE_NOTIFICATION_CHANNEL_WITH_GROUP_AND_SOUND',
DISPLAY_UNIT_ID: 'DISPLAY_UNIT_ID',
ALL_DISPLAY_UNITS: 'ALL_DISPLAY_UNITS',
PUSH_DISPLAY_UNIT_ELEMENT_CLICKED: 'PUSH_DISPLAY_UNIT_ELEMENT_CLICKED',
PRODUCT_CONFIG_FETCH: 'PRODUCT_CONFIG_FETCH',
PRODUCT_CONFIG_ACTIVATE: 'PRODUCT_CONFIG_ACTIVATE',
PRODUCT_CONFIG_FETCH_AND_ACTIVATE: 'PRODUCT_CONFIG_FETCH_AND_ACTIVATE',
Expand Down
1 change: 1 addition & 0 deletions Example/ios/.xcode.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export NODE_BINARY=$(command -v node)
23 changes: 21 additions & 2 deletions Example/ios/Example.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
48BF79812AB076F20091FF16 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 48BF797F2AB076F20091FF16 /* MainInterface.storyboard */; };
48BF79852AB076F20091FF16 /* NotificationContentSwift.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 48BF79792AB076F10091FF16 /* NotificationContentSwift.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
685D0A42F74FC38D84284799 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 9A4C3DD3EBC1242A62F0E22B /* PrivacyInfo.xcprivacy */; };
6CEFC61A3BFA454385B2DEB1 /* templates.json in Resources */ = {isa = PBXBuildFile; fileRef = 63BD588CF877484CA41FBE5E /* templates.json */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
C28EE22363709BEF624F9F1E /* libPods-NotificationContentSwift.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C33252DD165317E32A556B4 /* libPods-NotificationContentSwift.a */; };
FFDFBBA910887882FBEAC7E1 /* libPods-NotificationContent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DEC195091200DD33134801AA /* libPods-NotificationContent.a */; };
Expand Down Expand Up @@ -112,6 +113,7 @@
494B16C126B01FD7008F32F7 /* Example.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Example.entitlements; path = Example/Example.entitlements; sourceTree = "<group>"; };
59A64E1CB57DEDF6784E1EA0 /* Pods-NotificationContentSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationContentSwift.release.xcconfig"; path = "Target Support Files/Pods-NotificationContentSwift/Pods-NotificationContentSwift.release.xcconfig"; sourceTree = "<group>"; };
5CDAF8163A120B0E6653507A /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
63BD588CF877484CA41FBE5E /* templates.json */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = templates.json; path = ../assets/templates.json; sourceTree = "<group>"; };
73C88AB325F594C5AD9B8C55 /* Pods-NotificationServiceSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceSwift.release.xcconfig"; path = "Target Support Files/Pods-NotificationServiceSwift/Pods-NotificationServiceSwift.release.xcconfig"; sourceTree = "<group>"; };
7C33252DD165317E32A556B4 /* libPods-NotificationContentSwift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NotificationContentSwift.a"; sourceTree = BUILT_PRODUCTS_DIR; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = Example/LaunchScreen.storyboard; sourceTree = "<group>"; };
Expand Down Expand Up @@ -281,6 +283,7 @@
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
7168044AA71FBFBA4A3B8E24 /* Pods */,
B9DAD0142AE54E09A5E3EC9F /* Resources */,
);
indentWidth = 2;
sourceTree = "<group>";
Expand All @@ -299,6 +302,15 @@
name = Products;
sourceTree = "<group>";
};
B9DAD0142AE54E09A5E3EC9F /* Resources */ = {
isa = PBXGroup;
children = (
63BD588CF877484CA41FBE5E /* templates.json */,
);
name = Resources;
path = "";
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
Expand Down Expand Up @@ -461,6 +473,7 @@
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
685D0A42F74FC38D84284799 /* PrivacyInfo.xcprivacy in Resources */,
6CEFC61A3BFA454385B2DEB1 /* templates.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -1295,7 +1308,10 @@
);
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "$(inherited) ";
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
USE_HERMES = true;
Expand Down Expand Up @@ -1363,7 +1379,10 @@
"\"$(inherited)\"",
);
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_LDFLAGS = "$(inherited) ";
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
USE_HERMES = true;
Expand Down
2 changes: 1 addition & 1 deletion Example/ios/Example/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
</dict>
</dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<string/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
Expand Down
37 changes: 37 additions & 0 deletions Example/ios/Example/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>
5 changes: 5 additions & 0 deletions Example/ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,28 @@ target 'Example' do
aggregate_target.user_project.save
end
end
pod "SDWebImage", :modular_headers => true
end

target 'NotificationService' do
pod_clevertap_ios_sdk
pod "CTNotificationService", :modular_headers => true
pod "SDWebImage", :modular_headers => true
end

target 'NotificationContent' do
pod "CTNotificationContent"
pod "SDWebImage", :modular_headers => true
end

# Added these target for sample code only in Swift
target 'NotificationServiceSwift' do
pod_clevertap_ios_sdk
pod "CTNotificationService", :modular_headers => true
pod "SDWebImage", :modular_headers => true
end

target 'NotificationContentSwift' do
pod "CTNotificationContent"
pod "SDWebImage", :modular_headers => true
end
Loading