Feature | Min. iOS | Core RN | Expo | 3rd Party Libs | Native Module Required | Commentary |
Core Functionality | ||||||
Basic Remote Notification | 10.0 | ✓ | ✓ | ✓ | ✗ | All major libraries handle receiving and displaying basic alerts. |
Local/Scheduled Notification | 10.0 | ✓ | ✓ | ✓ | ✗ | Core functionality across the board for on-device scheduling. |
Background Notification Handling | 10.0 | ✓ | ✓ | ✓ | ✗ | onBackgroundEvent or similar handlers are standard for processing data payloads. |
App Icon Badge | 10.0 | ✓ | ✓ | ✓ | ✗ | setBadgeCount or similar is widely available. |
Custom sounds | 10.0 | ✗ | ✓ | ✓ | ✗ | the sound file must be added via Xcode.. |
Rich & Interactive | ||||||
Rich Attachments (Image, etc.) | 10.0 | ✗ | ⚠️ | ✓ | ✓ (Native) | Requires a Notification Service Extension. Expo needs a config plugin/dev client. Notifee/RNFirebase support this via native setup. |
Custom UI (Content Extension) | 10.0 | ✗ | ✗ | ⚠️ | ✓ (Native) | Requires a Notification Content Extension. Notifee has some guidance, but this is almost entirely native work. |
Interactive Actions (Buttons) | 10.0 | ⚠️ | ✓ | ✓ | ✗ | Core RN is limited. Expo & Notifee have robust APIs for setting categories and handling actions. |
Quick Reply (Text Input Action) | 10.0 | ✗ | ✓ | ✓ | ✗ | Supported by Notifee and Expo's category system. |
Delivery & UX Control | ||||||
Notification Grouping (thread-id) | 12.0 | ✗ | ✗ | ✓ | ✗ | Notifee provides a direct threadId property for conversational stacking. |
Provisional Authorization | 12.0 | ✗ | ✗ | ✓ | ✗ | Notifee and RNFirebase support requesting provisional permission. |
Notification Summary (relevance-score) | 15.0 | ✗ | ✓ | ✓ | ✗ | Expo and some services like Customer.io/OneSignal support this. Core RN does not. |
Interruption Levels | 15.0 | ✗ | ✓ | ✓ | ✗ | Crucial for Focus Modes. Expo and Notifee support this in the payload. RNFirebase may strip this key. |
Critical Alerts | 12.0 | ✗ | ✗ | ✓ | ✓ (Entitlement) | Notifee supports the critical flag, but requires the Apple entitlement, which is native project work. |
Real-Time & Specialized | ||||||
Live Activities | 16.1 | ✗ | ✗ | ⚠️ | ✓ (Native) | Early third-party libs exist (react-native-live-activity) but are thin wrappers. This is fundamentally native |
Broadcast Push (for Live Activities) | 18.0 | ✗ | ✗ | ✗ | ✓ (Native) | Bleeding-edge. No library support exists. Requires a full native module implementation to subscribe to a channel. |
iOS Feature | Support | Implementation Path & Expert Commentary |
Core Delivery & Authorization | ||
Standard Authorization Prompt | ✓ | firebase_messaging: The requestPermission() method directly invokes the standard system prompt. |
Provisional Authorization | ✓ | firebase_messaging: Supported by setting provisional: true in requestPermission(). Delivers notifications quietly to the Notification Center without a prompt. |
Rich Content & Presentation | ||
Rich Media (Images, GIFs) | ⚠️ | firebase_messaging + Native Module: Requires creating a UNNotificationServiceExtension in Xcode to intercept the push and attach media. The payload must include "mutable-content": 1. |
Grouped Threads | ✓ | flutter_local_notifications: Natively supported by setting the threadIdentifier in DarwinNotificationDetails. Can be achieved with remote pushes by including thread-id in the APNs payload. |
Custom UI (Content Extension) | ⚠️ | Native Module Required: The UI must be built with SwiftUI or UIKit inside a UNNotificationContentExtension created in Xcode. No Flutter plugin can render Dart widgets in this context. |
Interactivity & Actions | ||
Basic Actions (Buttons) | ✓ | flutter_local_notifications: Provides a robust, cross-platform API for defining action categories and handling callbacks. firebase_messaging only handles the main notification tap, not button actions. |
Text Input Actions | ✓ | flutter_local_notifications: Fully supports text input actions by mapping to the native UNTextInputNotificationAction. |
Advanced Delivery Control | ||
Focus-aware Delivery (Interruption Levels) | ⚠️ | Community Plugin / Custom Payload: Supported by plugins like awesome_notifications or forks like flutter_local_notifications_plus. Requires sending "interruption-level" in the APNs payload, which must be passed through firebase_messaging's data payload. |
Time-Sensitive Notifications | ⚠️ | Community Plugin + Entitlement: Same as above, but also requires enabling the "Time Sensitive Notifications" capability in Xcode, which adds the com.apple.developer.usernotifications.time-sensitive entitlement. |
Critical Alerts | ⚠️ | Community Plugin + Special Entitlement: Requires a special, manually-approved entitlement from Apple. Implementation is possible via plugins like awesome_notifications or by manually constructing the APNs sound dictionary in the payload. |
Live Activities & Dynamic Island | ||
App-Started Live Activities | ⚠️ | Community Plugin + Native Module: Requires a community plugin (e.g., live_activities) AND a native WidgetExtension with a SwiftUI view for the UI. The plugin bridges Dart data to the native view. |
Push-Updated Live Activities | ⚠️ | Community Plugin + Native Module: Same as above. The plugin facilitates retrieving the single-use Live Activity push token, which must be sent to your server for updates. |
Push-to-Start Live Activities (iOS 17.2+) | ⚠️ | Community Plugin + Native Module: Supported by plugins like live_activities. Requires a complex server-side implementation to handle the persistent pushToStartToken and send a specially formatted APNs payload to initiate the activity remotely. |
Layer | Plugin | Why you should care |
Transport | firebase_messaging | Handles APNs plumbing, token refresh, analytics |
Presentation | flutter_local_notifications | Buttons, grouped threads, foreground control |
Edge Cases | live_activities, awesome_notifications | Dynamic Island, Time-Sensitive, Critical alerts – but watch maintenance |
Issue | Native (Swift/Obj-C, Kotlin) | React Native / Flutter |
Feature lag | New toys (Live Activities, Notification Reactions, Focus-aware routing) are first-class on day -0. | Usually 3-12 months late and often require heavy Swift/Java modules. Example: one early-2025 React-Native Live-Activities guide admits “90% of the code is Swift”. |
SDK health | Apple/Google keep it alive. | Community plug-ins drift; e.g., the once-ubiquitous react-native-push-notification repo was archived Jan 14 2025 because “complexity is out of hand.” |
Edge-case control | Full access to UNNotificationServiceExtension, Critical Alerts, server-initiated Live Activity starts, etc. | Bridges exist, but debugging Objective-C↔JS race conditions at 3 a.m. is a rite of passage. |
Team skillset | Mobile specialists required. | Web-leaning teams ship faster—until they need a Swift wizard for that one lock-screen widget. |
Long-term cost | More expensive day one. | Cheaper to prototype, potentially pricier when you bolt on native modules later. |
Question | “Yes” → | “No” → |
Will you exceed ≈200 M pushes/month inside 12 months? (That’s ~$500 k/yr just in infra & on-call, per Fyno’s own cost calculator.) | Keep reading; SaaS CPM may crush you. | Skip to #2. |
Question | “Yes” → | “No” → |
Do you send HIPAA/PCI data that must never touch third-party logs? | DIY or an on-prem vendor; SaaS red-flags here. | Go to #3. |
Does legal insist on GDPR erasure in <30 days across all processors? | DIY or choose a vendor with contractually enforced deletion APIs. | Go to #3. |
Must-haves in next 6 months | Recommendation |
⚡ Ultra-custom workflows, real-time fail-over, cross-channel arbitration | DIY or a power-user platform like SuprSend—building all nine layers (retry, prefs, A/B, observability, etc.) is why in-house stacks balloon. |
🇮🇹 “Just ship rich media & Live Activities” | SaaS: OneSignal ships Live Activities today and already handles 12B messages every 24h. |
Question | “Yes” → | “No” → |
Can you allocate ≥$600 k/yr for two staff engineers plus pager duty? | DIY is viable. | Rent SaaS—reinvest those salaries in growth. |
Question | “Yes” → | “No” → |
Do you need push in prod inside one sprint? | SaaS. Plug SDK, press 🚀. | If you can wait 3–4 months, DIY still on the table. |
Vendor | Sweet spot & scale | iOS bells-&-whistles | Compliance / $ |
Firebase Cloud Messaging (FCM) | Free, Google-native; hobby → mid-tier apps; easy tie-in with Firebase Analytics | Live Activities & push-to-start via HTTP v1 API ✓; Rich media, threads ✓; No journey builder—DIY in Cloud Functions ⚠️ | $0 CPM (push is free) |
OneSignal | 12 B msgs/day infra; generous free tier, SDK in < 1 hr | Live Activities & Dynamic Island, incl. push-to-start ✓ | SOC 2 Type II & HIPAA BAA ✓; Free ≤ 10 K subs → usage pricing |
Braze | Enterprise cross-channel orchestration; Canvas journeys | Live Activities & push-to-start (Swift SDK 6+, RN bridge) ✓ | HIPAA BAA offered ✓; Starts ≈ $60 K / yr |
Airship | Heavyweight for media, airlines, retail; deep analytics | Live Activities in native, RN, Flutter, Capacitor modules ✓ | SOC 2; no public HIPAA guarantee—medical data banned in T&Cs ⚠️; Quote-only; customer chatter ≈ $35 K +/yr |
Supabase / NotificationAPI (open-source-friendly) | Dev-first; Edge Functions fire APNs straight from SQL triggers | Core push + rich media ✓; Live Activities ⇒ manual ActivityKit extension ⚠️ (no plugin yet) | HIPAA add-on & SOC 2 ✓; Free tier; paid from $10-25 / mo |
Pushwoosh | SMB → mid-market; unlimited sends, 1 K free subs | Live Activities & Dynamic Island SDK ✓ | HIPAA-certified (2025 audit) ✓; Pay-as-you-grow; +$3 per 1 K subs |
MoEngage | Growth / enterprise lifecycle; Push Amplification + boosts delivery ≤ 40 % | Broadcast Live Activities SDK 10.02 + ✓ | HIPAA-aligned controls ✓; Contact-sales pricing |
SuprSend | Dev-centric API; 10 K free pushes then $250 / mo for 50 K | Core push ✓; Live Activities require custom Swift extension ⚠️ (no official plugin) | SOC 2 Type II & HIPAA-ready ✓ |
CleverTap | AI-driven engagement; Essentials plan $75 / mo up to 5 K MAU | Live Activities announced WWDC ’24; rollout under way ✓ | HIPAA, SOC 2, GDPR compliant ✓ |