Skip to content
Closed
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 — inbox read/deleted state now syncs automatically across a user's devices. 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 Native Display experiences, with element-level attribution.

* **[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 read/deleted state now syncs automatically across a user's devices. 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 Native Display experiences, with element-level attribution.
* Silent-in-foreground push — push notifications can now be suppressed while the app is in the foreground using the `wzrk_sif:true` key in the push payload; requires the host app's `UNUserNotificationCenterDelegate.willPresent` to be implemented (automatic when using `autoIntegrate`).

**API changes**
* **[Android and iOS Platform]**
* Adds `fetchInbox(callback?)` — triggers an on-demand App Inbox refresh from the server. Throttled to once every 5 minutes. Optional callback receives a boolean success/failure result.
* Adds `pushDisplayUnitElementClickedEventForID(unitID, additionalProperties)` — records a `Notification Clicked` event for a specific element within a Display Unit, merging caller-supplied properties (e.g. `wzrk_element_id`) 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: '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.pushDisplayUnitElementClicked();
break;
case Actions.PRODUCT_CONFIG_FETCH:
AppUtils.fetch();
break;
Expand Down
18 changes: 18 additions & 0 deletions Example/app/app-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,24 @@ export const getAllDisplayUnits = () => {
});
};

export const pushDisplayUnitElementClicked = () => {
CleverTap.pushDisplayUnitElementClickedEventForID('unit-abc-123', {
wzrk_element_id: 'btn-cta-1',
product_name: 'Running Shoes',
discount_pct: 20,
is_featured: true,
});
showToast('pushDisplayUnitElementClickedEventForID called');
console.log('pushDisplayUnitElementClickedEventForID called');
};

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

// 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 @@ -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 @@ -30,6 +30,7 @@
685D0A42F74FC38D84284799 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 9A4C3DD3EBC1242A62F0E22B /* PrivacyInfo.xcprivacy */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
C28EE22363709BEF624F9F1E /* libPods-NotificationContentSwift.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C33252DD165317E32A556B4 /* libPods-NotificationContentSwift.a */; };
EF6439EFF7F94569B2D990A3 /* templates.json in Resources */ = {isa = PBXBuildFile; fileRef = 147C3A0983424A48965F553C /* templates.json */; };
FFDFBBA910887882FBEAC7E1 /* libPods-NotificationContent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DEC195091200DD33134801AA /* libPods-NotificationContent.a */; };
/* End PBXBuildFile section */

Expand Down Expand Up @@ -88,6 +89,7 @@
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Example/Images.xcassets; sourceTree = "<group>"; };
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>"; };
147C3A0983424A48965F553C /* templates.json */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = templates.json; path = ../assets/templates.json; 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>"; };
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; };
Expand Down Expand Up @@ -281,6 +283,7 @@
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
7168044AA71FBFBA4A3B8E24 /* Pods */,
EB5DFED248BD44DFA6EFF9B2 /* Resources */,
);
indentWidth = 2;
sourceTree = "<group>";
Expand All @@ -299,6 +302,15 @@
name = Products;
sourceTree = "<group>";
};
EB5DFED248BD44DFA6EFF9B2 /* Resources */ = {
isa = PBXGroup;
children = (
147C3A0983424A48965F553C /* 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 */,
EF6439EFF7F94569B2D990A3 /* 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