Open-source (MIT) native SDK for Pushproof — device-level push notification delivery confirmation on iOS (NSE) and Android (FirebaseMessagingService), plus the Capacitor wrapper.
Core-first architecture: the core is native and reusable; ecosystem wrappers are thin bridges only.
| Website | pushproof.dev |
| Product docs | pushproof.dev/en/docs |
| Dashboard | app.pushproof.dev |
| API reference | pushproof.dev/docs/#partie-api |
This repo is the open-source SDK (runs on the device). Sign up on Pushproof for the managed backend: ingestion, delivery-rate metrics, retention, and dashboard. Ingest endpoint:
api.pushproof.dev/v1/receipts.
- iOS — a Notification Service Extension (NSE) captures the delivery before display, even
app-closed/background. Foreground deliveries are captured in-app via
recordDelivery(). Receipts the NSE queued while offline are replayed viagetPendingReceipts(). - Android — a
FirebaseMessagingServicecaptures data-only messages. The SDK also, whendisplayNotificationis on (default), shows the notification (data-only pushes don't display by themselves) and forwards it to your Capacitor push listeners (foreground →pushNotificationReceived, tap →pushNotificationActionPerformed). - Per-user tracking (Pro) —
identify({ userId })tags the device, so "did this user receive it?" works even for batch/multicast sends (where a shared payload can't carry a per-user id). - Campaign attribution — reads
campaignfrom the push payload and relays it on the receipt, so delivered lines up withPOST /v1/sentper campaign. - Non-blocking & resilient — sends run off the main thread with bounded timeouts; a slow/unreachable backend never blocks the app. iOS rate is a lower bound (iOS may suspend the NSE).
| Method | Description |
|---|---|
configure({ ingestUrl, ingestKey, appGroup?, displayNotification? }) |
Required, at startup. appGroup = iOS App Group (app ↔ NSE). displayNotification = Android data-only display (default true). |
identify({ userId }) / clearIdentity() |
Per-user tracking — call at login / logout. Mono-account. |
recordDelivery({ notifId, campaign?, userId? }) |
Foreground capture (iOS). Idempotent (server dedups). |
getPendingReceipts() |
Replay receipts the NSE queued during degraded network (iOS). |
Native APIs mirror these: Swift Pushproof.shared.* (PushproofCore) and Kotlin dev.pushproof.PushproofCore /
PushproofMessagingService. Full integration guide: pushproof.dev/docs.
Package.swift + Sources/ Swift Package "Pushproof" (iOS) : repo root (required by SPM)
Sources/PushproofCore/ In-app API, App Group, receipt posting
Sources/PushproofNSE/ NotificationService (imported by the NSE target)
android/ Kotlin library (dev.pushproof) — required by JitPack
PushproofMessagingService FCM data-only capture (override or delegate)
NotificationDisplay shows data-only notifications (displayNotification)
CapacitorPushForwarder forwards data-only pushes to Capacitor listeners
capacitor/ @pushproof/capacitor (npm) : wrapper for Capacitor
INSTALL-iOS-NSE.md Official NSE setup guide (iOS only)
File → Add Package Dependencies… → https://github.com/csurbier/pushproofsdk
(version 1.3.3 — pin the 1.3.3 git tag), then link PushproofCore (app)
and PushproofNSE (NSE target). See
pushproof.dev/docs/#ios-nse or INSTALL-iOS-NSE.md.
Published via JitPack. Add the repository (in
settings.gradle › dependencyResolutionManagement, or the root build.gradle):
repositories {
maven { url 'https://jitpack.io' }
}then the dependency:
implementation 'com.github.csurbier:pushproofsdk:1.3.3'Capacitor users don't need this — the native core is bundled inside
@pushproof/capacitor.
npm install @pushproof/capacitor@1.3.4
npx cap syncFull integration guide: pushproof.dev/docs (see also capacitor/README.md).
The SDK code here is free and inspectable (it runs on the device). The
Pushproof SaaS provides the managed backend:
scalable ingestion, delivery-rate computation, data retention, and the
dashboard. Create a project there to obtain your
pk_ingest_… key.
iOS: the measured rate is a lower bound (iOS may suspend the NSE).
MIT — see LICENSE.
Contact us for support or to request a feature.