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 12 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 — inbox state (read, deleted) syncs across a user's devices automatically. Includes a pull-to-refresh gesture in the built-in App Inbox view, throttled to once every 5 minutes.
* Native Display Element Click — finer-grained click analytics for individual elements within a Native Display unit.

* **[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 — inbox state (read, deleted) syncs across a user's devices automatically. Includes a pull-to-refresh gesture in the built-in App Inbox view, throttled to once every 5 minutes.
* Native Display Element Click — finer-grained click analytics for individual elements within a Native Display unit.
* Silent-in-foreground push — push notifications can now be suppressed when the app is in the foreground via `wzrk_sif:true` in the push payload; handled automatically when using `autoIntegrate`.

**API changes**
* **[Android and iOS Platform]**
* Adds `fetchInbox(callback?)` — triggers an on-demand App Inbox refresh from the server. The optional callback receives a boolean indicating whether the fetch succeeded. Calls are throttled to once every 5 minutes.
* Adds `pushDisplayUnitElementClickedEventForID(unitID, additionalProperties)` — records a `Notification Clicked` event for a specific element within a Native Display unit, merging caller-supplied properties (include `wzrk_element_id` from the element metadata) with cached 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: 'pushDisplayUnitElementClickedEvent' },
],
},
{
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.pushDisplayUnitElementClicked();
break;
case Actions.PRODUCT_CONFIG_FETCH:
AppUtils.fetch();
break;
Expand Down
17 changes: 17 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 result:', 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 @@ -552,6 +559,16 @@ export const createNotificationChannelWithGroupIdAndSound = () => {
};

// Native Display
export const pushDisplayUnitElementClicked = () => {
CleverTap.pushDisplayUnitElementClickedEventForID('unit-id-001', {
wzrk_element_id: 'btn_cta_1',
title: 'Summer Sale',
campaign_type: 'display',
});
showToast('Display Unit Element Clicked event pushed');
console.log('pushDisplayUnitElementClickedEventForID called');
};

export const getUnitID = () => {
CleverTap.getDisplayUnitForId('Unit Id', (err, res) => {
console.log('Get Display Unit for Id:', res, err);
Expand Down
2 changes: 2 additions & 0 deletions Example/app/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ 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',
FETCH_INBOX: 'FETCH_INBOX',
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 @@ -29,6 +29,7 @@
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 */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
95FFEF509E854EAD92574543 /* templates.json in Resources */ = {isa = PBXBuildFile; fileRef = 259EE3CCAE64436A8800F81F /* templates.json */; };
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 */; };
/* End PBXBuildFile section */
Expand Down Expand Up @@ -89,6 +90,7 @@
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Example/Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Example/main.m; sourceTree = "<group>"; };
14E2F58881084EE312574B68 /* Pods-NotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.debug.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.debug.xcconfig"; sourceTree = "<group>"; };
259EE3CCAE64436A8800F81F /* templates.json */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = templates.json; path = ../assets/templates.json; sourceTree = "<group>"; };
273ED08C65D1C0D2A1CF924D /* Pods-NotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.release.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.release.xcconfig"; sourceTree = "<group>"; };
35C0D77F08F13FB76F737463 /* libPods-Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example.a"; sourceTree = BUILT_PRODUCTS_DIR; };
48BF78BE2AA5B5110091FF16 /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -175,6 +177,15 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
0E655508297846A9BF4257DB /* Resources */ = {
isa = PBXGroup;
children = (
259EE3CCAE64436A8800F81F /* templates.json */,
);
name = Resources;
path = "";
sourceTree = "<group>";
};
13B07FAE1A68108700A75B9A /* Example */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -281,6 +292,7 @@
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
7168044AA71FBFBA4A3B8E24 /* Pods */,
0E655508297846A9BF4257DB /* Resources */,
);
indentWidth = 2;
sourceTree = "<group>";
Expand Down Expand Up @@ -461,6 +473,7 @@
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
685D0A42F74FC38D84284799 /* PrivacyInfo.xcprivacy in Resources */,
95FFEF509E854EAD92574543 /* 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