Skip to content

iOS application

Notifly for iOS is a native client for iPhone and iPad. Before relying on it, check its current status.

If you need notifications on an iPhone while the app is closed, these options work today:

  • Escalation — a message left unread for a set time is forwarded by Notifly to Telegram, email or a team chat (Slack, Discord, Teams, Mattermost); the iPhone shows those notifications through their own apps, independently of Notifly.
  • A web dashboard tab on your computer — browser notifications while the tab is open.
  • The Android app — a full client with a background connection, if you have an Android device at hand.

The app is a native SwiftUI client, a twin of the Android app: the same screens, navigation drawer, labels and behavior. The message feed, monitors, heartbeats, sending messages and questions, quiet hours, settings and the login-approval screen are native. Sections that are easier to edit on the web (channels, devices, API tokens, metrics, status pages, integrations, profile, plans) open in the embedded web admin — the same one as on app.notifly.ru, with no second login.

The server is hardcoded (https://api.notifly.ru), so on login you only enter your username and password — there is no server address field in the UI.

  • Message feed. “All messages” and a per-channel feed, the channel tree in the drawer, markdown, images and browser-check screenshots. Questions (Ask) are answered right in the feed: buttons, text, forms.
  • Notifications with actions. Every new message produces a system notification. The Mark read button marks it read on the server (and stops escalation to SMS and calls); a question with options gets up to three buttons, one per option; an open question gets Reply with text input right in the notification; forms and multi-choice questions open the app.
  • Back-fill of what you missed. On every connect the app fetches the messages that arrived while the socket was down and shows them (at most 20 at a time). On the very first launch your history is not replayed as notifications. Notifications stack per channel; a tap opens the URL from client::notification.click.url (see Extra message fields).
  • Alarm mode for an individual channel (channel settings in the feed): a full-screen alert with a looping sound, vibration and an Acknowledge button. It works while the app is active; in the background such a message arrives as a time-sensitive notification.
  • Quiet hours and maintenance windows. The app reads the account’s quiet hours and during them shows messages below the urgency threshold silently; messages from a maintenance window are silent too.
  • Monitors and heartbeats. A list of monitors of every family with statuses and pause, channel heartbeats with statuses and check history.
  • Send a message or a question from the drawer to any of your channels.
  • Offline cache. The latest channels and messages are stored on the device and visible without a connection.
  • Login, registration and password recovery. Registration and recovery open as a sheet inside the app, without a detour to Safari.
  • Two-factor authentication. On login the app asks for the code from your authenticator app or a recovery code. The reverse flow works too: when you sign in to the web admin with the “Notifly mobile” method, the phone shows a “Confirm login” screen where you type the two-digit code from the login page (manually — drawer → Confirm login). The same screen confirms connecting the phone to the “Notifly mobile” method.
  • Token in the Keychain. The app’s client token is stored in the system Keychain, and the device itself is listed and revocable in the Devices section of the admin panel.
  • External links open in Safari. Anything pointing outside notifly.ru opens in the system browser.

The connection lives while the app is on screen. When you background the app, iOS does not allow holding a WebSocket open, so the socket is closed; on return it reconnects and the missed messages are fetched and shown as notifications. Background delivery over APNs is the next piece of work.

The practical takeaway: today the iOS app is a handy “Notifly in your pocket” — the feed, monitors, answering questions and login approval while you’re using the phone. If you need to be woken up at 3 a.m., set up escalation to a phone call/SMS or use the Android client — neither depends on the app being open.

A message priority (0–10) is set when sending or taken from the channel’s defaultPriority. On iOS it maps to the notification’s interruption level:

PriorityBehavior on the iPhone
0–1Quiet: no sound, Notification Center only
2–3Ordinary banner, no sound
4–7Ordinary banner with sound
8–10Time-sensitive: banner with sound

While the app is open, ordinary messages are not duplicated as banners — you already see them in the app’s feed, so the notification goes straight to Notification Center (with sound if the priority is 4 or higher). Priority 8–10 still shows a banner on top of the running app.

Notifications with priority 8–10 are marked time-sensitive, but the app does not yet have Apple’s separate entitlement to break through Focus modes — do not count on them getting through Focus.

There is no App Store build yet — the app is built from the repository sources (the ios/ directory). You need macOS, Xcode 15+ and XcodeGen: the .xcodeproj is not committed, it is generated from project.yml.

Окно терминала
brew install xcodegen
cd ios
xcodegen generate # → Notifly.xcodeproj
open Notifly.xcodeproj

In Xcode set your signing team (DEVELOPMENT_TEAM), pick the Notifly scheme and run it on a simulator or on your own iPhone. Build details, the scheme for a local backend and the debugging order are in ios/README.md.

Requirements and build parameters:

ParameterValue
Minimum iOS16.0
DevicesiPhone and iPad
Bundle identifierru.notifly.app
Serverhttps://api.notifly.ru (fixed)

Open the app and sign in with the same username and password you use on app.notifly.ru. Allow notifications when the system asks. If the account has reached its connected-device limit, the server disconnects the oldest device by itself — you don’t need to free a slot manually. With 2FA enabled you’ll be asked for the code from your authenticator app or a recovery code.