mirror of
https://github.com/binwiederhier/ntfy.git
synced 2026-05-09 08:26:00 +02:00
[GH-ISSUE #1680] INPUT WANTED: iOS improvement plan 🍎📱 #1170
Labels
No labels
ai-generated
android-app
android-app
android-app
🪲 bug
build
build
dependencies
docs
enhancement
enhancement
🔥 HOT
in-progress 🏃
ios
prio:low
prio:low
pull-request
question
🔒 security
server
server
unified-push
web-app
website
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/ntfy#1170
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @binwiederhier on GitHub (Mar 27, 2026).
Original GitHub issue: https://github.com/binwiederhier/ntfy/issues/1680
ntfy iOS App: Stabilization & Feature Parity Plan
⚠️ Warning: AI-generated, but reviewed and heavily refined by Phil (@binwiederhier)
Current State
The ntfy iOS app is a ~2,500-line Swift/SwiftUI app that handles basic pub-sub notifications via Firebase Cloud Messaging. It works for simple use cases but is significantly behind the Android app in both reliability and features. Users are vocal about this — notification delivery issues alone have 86+ comments across multiple GitHub issues, and Discord shows a steady stream of iOS complaints over the past year.
A community member (@dehlen) started a ground-up iOS rewrite in January 2026, which signals strong user demand. The rewrite was quickly abandoned, but may be salvagable. Multiple users on Discord have noted that "iOS is really behind."
What works today
What's missing or broken
See prioritized tiers below.
Current architecture
iOS does not allow background processes, so WebSocket or JSON stream connections cannot be used. Apple requires that all push notifications go through the Apple Push Notification service (APNs). The notification flow depends on the server type:
The self-hosted flow is awkward because it requires ntfy.sh involvement even for private servers, but this is unavoidable due to iOS platform constraints. The Notification Service Extension (NSE) runs in a separate process with a 25-second execution limit, handles incoming notifications, and shares data with the main app via Core Data through an App Group.
For a detailed explanation, see the blog post on ntfy's iOS architecture.
Scope
.critical)Priority 1: Stability Fixes — MUST DO
These are crashes and reliability issues that affect every user.
1A. Notifications silently break, requiring reinstall
GitHub: #1305 (4 thumbs up, 16 comments), #898 (4 thumbs up, 25 comments), #1003 (7 thumbs up, 16 comments)
Discord: 107 mentions of notification delivery problems in the last year
Push notifications stop arriving with no visible error. The only fix is reinstalling the app. Errors are logged but never shown to the user (acknowledged TODO in the codebase). This needs:
1B. UI doesn't refresh after receiving notifications
GitHub: #337
Users receive the iOS notification banner, but the in-app notification list doesn't update until they manually pull-to-refresh. The Notification Service Extension writes to Core Data, but the main app's UI doesn't reliably pick up those changes.
1C. App crashes when clearing notifications
GitHub: #1642, #377
Clearing all notifications or bulk-deleting crashes the app consistently. This is a Core Data threading bug — deletes are dispatched on a background thread but the Core Data context is main-queue.
1D. No sound on iOS 26 + breaks other app sounds
GitHub: #1562
On iOS 26.2+, ntfy notifications have no sound. Worse, receiving a silent ntfy notification breaks sound for other apps until the user makes a phone call. 100% reproducible. Possibly related to notification channel/category configuration.
Priority 2: Most-Requested Features — SHOULD DO
These are the highest-voted feature requests on GitHub.
2A. Critical alerts & time-sensitive notifications
GitHub: #1235 (31 thumbs up), #332 (7 thumbs up, 16 comments)
The #1 most upvoted iOS issue. Priority 4/5 notifications should bypass Focus mode and Do Not Disturb. The code sets the interruption levels but the required entitlements and capabilities aren't properly configured in the Xcode project. The Critical Alerts entitlement is available — it just needs to be wired up and tested end-to-end.
2B. Image & attachment display
GitHub: #1226 (22 thumbs up), #276 (6 thumbs up)
Discord: 23 mentions in last year
The #2 most upvoted iOS issue. The server already sends attachment metadata via FCM (
attachment_url,attachment_name,attachment_type, etc.) but the iOS app completely ignores these fields. Needs:UNNotificationAttachment(rich notification preview)2C. Clickable links in messages
GitHub: #281 (6 thumbs up), #586 (6 thumbs up), #1480, #1605
Message text is rendered as plain, non-interactive text. URLs, phone numbers, and other links are not tappable. With the iOS 16+ deployment target,
Text(AttributedString(markdown:))can handle this directly. This also partially addresses the Markdown rendering request (#1072, 12 thumbs up).2D. Copy-to-clipboard with feedback
GitHub: #279, #1506
Discord: 20 mentions in last year
There's a hidden tap-to-copy gesture with zero visual feedback. Users don't know it exists. Replace with a context menu (long-press) and add haptic/visual confirmation.
Priority 3: Quality-of-Life — NICE TO HAVE
Completes the core feature set users expect.
2A. Display names for subscriptions
GitHub: #1314 (7 thumbs up), #357 (3 thumbs up)
Users want to rename subscriptions to human-readable names instead of seeing raw topic URLs. Android has this.
2B. Per-subscription mute
GitHub: #278 (8 comments)
No way to mute a noisy topic without unsubscribing. Android has per-subscription mute with "mute until" options.
2C. Publish messages from the app
GitHub: #301 (3 thumbs up), #302
The API call for publishing already exists in the codebase (used by "Send test notification"). Just needs a user-facing compose UI with message, title, priority, and tags fields.
2D. Show notification timestamps
GitHub: #875 (7 thumbs up)
Notification times should be visible in the message list.
2E. Unread/new message indicators
GitHub: #280 (4 thumbs up)
No visual distinction between read and unread notifications. Android shows green dots.
Priority 4: Polish — IF TIME ALLOWS
3A. Auto-delete old notifications
GitHub: #1549
Add a setting to automatically clean up notifications older than N days.
3B. Swipe-back navigation
GitHub: #312
The native iOS swipe-back gesture is disabled due to a custom back button. Should be restored.
3C. Markdown rendering
GitHub: #1072 (12 thumbs up)
Partially addressed by 2C (clickable links). Full markdown would be a bonus if time allows.
Out of Scope
Technical Notes
if #available(iOS 15, *)guards. Use modern APIs directly.group.io.heckel.ntfy. It has a 25-second execution limit.GoogleService-Info.plistor a test Firebase project.docs/FEATURE_PARITY.mdas features are completed.Data Sources
ntfy-ios/docs/FEATURE_PARITY.mdntfy-ios/docs/TECHNICAL_LIMITATIONS.md@thesainthell commented on GitHub (Mar 29, 2026):
In my opinion, the “Update/Edit Notifications” feature should be included in the improvements, as I believe this is a significant difference from the Android app and offers substantial added value. Unfortunately, I’m just a user making a request and have no way to independently support this feature through pull requests.
@binwiederhier commented on GitHub (Mar 29, 2026):
I'd love that too, and we'll do it eventually. Baby steps though. Let's see if we can get things fixed and working first though.
@TRS-SoD commented on GitHub (Mar 30, 2026):
I would like to suggest moving "Self-signed certificate support" up to Priority 4.
It would be a nice to have, and it shouldn't be too hard to implement.
@condio commented on GitHub (Apr 4, 2026):
These improvements would be huge for iOS. My personal priority/wishlist is:
@Metal-Snake commented on GitHub (Apr 15, 2026):
From the Out of Scope List:
I don't think this is true. The App Ice Cubes (a Mastodon client) shows the avatar of the user who posted the message, with the App Icon as a small badge in the bottom right.
@Hustleberry commented on GitHub (Apr 15, 2026):
Silence specific topics - I want them in my phone but not always notified about things.
@binwiederhier commented on GitHub (Apr 15, 2026):
That is surprisingly difficult in iOS, because iOS forces you to show the notification if it's sent from the server. It would be significant work.
@Terabyte1385 commented on GitHub (Apr 16, 2026):
Aren't silent notifications supposed to solve this problem (with
"content-available": 1)? Don't take my word too seriously, I have little experience on this. I do believe that this will require both server and client changes, though. Indeed, push notifications cannot be cancelled/suppressed at extension-level on the device.@k0ste commented on GitHub (Apr 17, 2026):
An hour of studying what is ntfy.sh and here I am. Well, without Markdown, it's impossible to replace Telegram 🥹
@Batwam commented on GitHub (Apr 17, 2026):
In the meantime, just add a shortcut to your iOS Home Screen to use as PWA. You'll get markdown and notifications.
@k0ste commented on GitHub (Apr 17, 2026):
Is there documentation how-to do this for self-hosted? 🤔
Seems I need self-hosted deployment for use static private topics
@Batwam commented on GitHub (Apr 17, 2026):
@k0ste just open the WebUI using Safari, select share -> Add to Home Screen, check the "Open as Web App" option.
You'll need to set up and use https and set up push notifications for notifications to work (I'm using Tailscale to get a valid certificate). There should be instructions for that in the documentation.
But yeah, that would be a lot easier if there was an iOS app. The main downside of the app currently for me is the absence of support for markdown.
@k0ste commented on GitHub (Apr 17, 2026):
Got it. Only unclear is - should I setup
upstream-base-urlorweb-push*? Or this is different kinds?@Batwam commented on GitHub (Apr 17, 2026):
web-push definitely. base-url I can't remember. Maybe not as it was to ensure the app would get the notifications (I believe). I have it set up anyway as I started with the app and never bothered removing it.
@LevantinLynx commented on GitHub (Apr 20, 2026):
Comment/Info for 1A:
I only mention this, cause i think it's a common home lab/server setup to block some DNS or run some kind of ad blocker.
(My setup is self hosted with docker and upstream-base-url: "https://ntfy.sh")
My notifications have been broken for the past month or so. I was reminded by Jeff Geerlings shirt: "It was DNS" to check just that. Turns out, some blocklist added "firebaseinstallations.googleapis.com" and "firebaselogging-pa.googleapis.com", and the notifications broke. Reinstall was a temporary fix until the iPhone send a DNS query for those domains, and then notifications broke again. Whitelisting those domains fixed Problem 1A for me.
Hope it helps others. And it may be a hint of not being a NTFY app problem after all.
Maybe the App could add an indicator if DNS block for those domains is detected?
@jruben4 commented on GitHub (Apr 25, 2026):
Would like to have a substitute for "push notifications" even when running local only. Could you make a NTFY shortcuts activity to pull new messages? Then we could set up a shortcut automation to manually pull every few minutes.
@mil1i commented on GitHub (May 2, 2026):
This also fixed getting notifications to work for me.
So if you're running pi-hole, blocky, technitium or some other network level domain adblocker this could be the source of notifications not working on a mobile device.