Lifecycle events
With
autoTrackPushEvents(true) (as in the iOS example):
- Body opens are auto-tracked
- Action-button taps are not treated as opens — the SDK only auto-opens on the default action
- Delivered is reliable when you add an NSE + App Groups; the example focuses on action buttons and does not ship an NSE
Payload fields
Accept both delivery-key casings when reading
userInfo.
Delivery tracking (Notification Service Extension)
The example app does not include an NSE. For rich push and reliable delivered metrics:.appGroupId(...).
Open tracking (body)
WithautoTrackPushEvents(true), body taps are tracked automatically. You do not need a wrapper for that path.
If you disable auto-track, call:
Action Button Clicked
Handle onlyACTION_0 / ACTION_1 in didReceive (match the example):
ZX_2BTN at launch — see Push Notifications.
Required properties: Zixflow-Delivery-ID, action_index, action_name. Recommended: Zixflow-Delivery-Token, action_deeplink.
Deeplink opening (example pattern)
The iOS example does not rely ondeepLinkCallback for campaign taps. It reads deeplink_url / button deeplink in UNUserNotificationCenterDelegate and routes through NavigationRouter:
deeplink (empty string is allowed — skip open).
You can still set SDKConfigBuilder.deepLinkCallback for other SDK-forwarded links; the example’s push interaction path uses the router above.
App Groups checklist (for NSE / delivered)
- Enable App Groups on the main app and Notification Service Extension
- Use the same group ID
- Pass it via
.appGroupId(...)in main-app and extension push config
Non-Zixflow pushes
If delivery ID is missing, skip Zixflow push metrics. Do not use reserved action event names for external pushes.Testing
Enable.logLevel(.debug). Dashboard → Messaging → Push Notifications: Delivered, Opened, Clicked. Use a physical device.