Перейти к содержимому

iOS-приложение

Notifly для iOS — нативный клиент для iPhone и iPad. Прежде чем на него рассчитывать, посмотрите на его текущий статус.

Если нужно получать уведомления на iPhone, когда приложение закрыто, сейчас работают такие варианты:

  • Эскалация — непрочитанное за заданное время сообщение Notifly дошлёт в Telegram, на почту или в рабочий чат (Slack, Discord, Teams, Mattermost) — эти уведомления iPhone показывает через их собственные приложения, независимо от Notifly.
  • Вкладка веб-админки на компьютере — уведомления браузера, пока вкладка открыта.
  • Android-приложение — полноценный клиент с фоновым соединением, если под рукой есть Android-устройство.

Приложение — нативный SwiftUI-клиент, двойник Android-приложения: те же экраны, боковое меню, подписи и поведение. Нативными сделаны лента сообщений, мониторы, heartbeat, отправка сообщений и вопросов, тихие часы, настройки и экран подтверждения входа. Разделы, которые удобнее править в вебе (каналы, устройства, API-токены, метрики, статус-страницы, интеграции, профиль, тарифы), открываются встроенной веб-админкой — той же, что на app.notifly.ru, без повторного входа.

Сервер зашит (https://api.notifly.ru), поэтому при входе вы вводите только логин и пароль — поля адреса сервера в UI нет.

  • Лента сообщений. «Все сообщения» и лента отдельного канала, дерево каналов в боковом меню, markdown, картинки и скриншоты браузерных проверок. Вопросы (Ask) отвечаются прямо в ленте: кнопки, текст, формы.
  • Уведомления с действиями. На каждое новое сообщение — системное уведомление. Кнопка «Прочитано» отмечает сообщение прочитанным на сервере (и останавливает эскалацию на SMS и звонок); у вопроса с вариантами до трёх кнопок — по одной на вариант, у открытого вопроса — «Ответить» с вводом текста прямо в уведомлении; формы и мультивыбор открывают приложение.
  • Догрузка пропущенного. При каждом подключении приложение добирает сообщения, пришедшие без сокета, и показывает их (не более 20 за раз). На первом запуске история в уведомления не дублируется. Уведомления складываются в стопку по каналу; тап открывает ссылку из client::notification.click.url (см. Доп. поля).
  • Режим будильника для отдельного канала (настройки канала в ленте): полноэкранный экран с повторяющимся звуком и вибрацией и кнопкой «Ознакомлен». Работает, пока приложение активно; в фоне такое сообщение приходит как «важное» уведомление.
  • Тихие часы и окна обслуживания. Приложение читает тихие часы аккаунта и в эти часы показывает сообщения ниже порога срочности беззвучно; сообщения из окна обслуживания тоже приходят без звука.
  • Мониторы и heartbeat. Список мониторов всех семейств со статусами и паузой, heartbeat каналов со статусами и историей проверок.
  • Отправка сообщения или вопроса из меню — в любой свой канал.
  • Офлайн-кэш. Последние каналы и сообщения сохраняются на устройстве и видны без связи.
  • Вход, регистрация и восстановление пароля. Регистрация и восстановление открываются листом внутри приложения, без ухода в Safari.
  • Двухфакторная аутентификация. При входе приложение спрашивает код из authenticator-приложения или recovery-код. Обратный сценарий тоже работает: когда вы входите в веб-админку с методом «Notifly mobile», телефон показывает экран «Подтвердите вход», куда вводится двузначный код с экрана входа (вручную — меню → Подтвердить вход). Тем же экраном подтверждается подключение телефона к методу «Notifly mobile».
  • Токен в Keychain. Токен устройства хранится в системном Keychain, а само устройство видно и отзывается в разделе Устройства админки.
  • Внешние ссылки — в Safari. Всё, что ведёт за пределы notifly.ru, открывается в системном браузере.

Соединение живёт, пока приложение на экране. Когда вы сворачиваете приложение, iOS не даёт держать WebSocket в фоне, и сокет закрывается; при возврате он поднимается заново, и пропущенные сообщения догружаются и показываются уведомлениями. Фоновая доставка через APNs — следующий этап работ.

Практический вывод: iOS-приложение сейчас удобно как «Notifly в кармане» — лента, мониторы, ответы на вопросы и подтверждение входа во время работы с телефоном. Если нужен звонок посреди ночи, настраивайте эскалацию на телефон/SMS или Android-клиент — они от состояния приложения не зависят.

Приоритет сообщения (0–10) задаётся при отправке или берётся из defaultPriority канала. На iOS он превращается в уровень прерывания уведомления:

ПриоритетПоведение на iPhone
0–1Тихо: без звука, только в Центре уведомлений
2–3Обычный баннер, без звука
4–7Обычный баннер со звуком
8–10«Важное» (time-sensitive): баннер со звуком

Пока приложение открыто, обычные сообщения баннером не дублируются — они и так видны в ленте приложения, поэтому уведомление уходит сразу в Центр уведомлений (со звуком, если приоритет 4 и выше). Приоритет 8–10 показывает баннер и поверх открытого приложения.

Уведомления с приоритетом 8–10 помечаются как time-sensitive, но отдельного разрешения Apple на пробитие режима «Фокус» у приложения пока нет — рассчитывать на то, что они пройдут сквозь «Фокус», не стоит.

Готовой сборки в App Store пока нет — приложение собирается из исходников репозитория (каталог ios/). Нужны macOS, Xcode 15+ и XcodeGen: .xcodeproj в репозитории не хранится, он генерируется из project.yml.

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

В Xcode укажите свою команду подписи (DEVELOPMENT_TEAM), выберите схему Notifly и запустите на симуляторе или на своём iPhone. Подробности сборки, схема для локального стенда и порядок отладки — в ios/README.md.

Требования и параметры сборки:

ПараметрЗначение
Минимальная iOS16.0
УстройстваiPhone и iPad
Bundle identifierru.notifly.app
Серверhttps://api.notifly.ru (зашит)

Откройте приложение и войдите тем же логином и паролем, что и на app.notifly.ru. Разрешите уведомления по системному запросу. Если у аккаунта исчерпан лимит подключённых устройств, сервер сам отключит самое старое устройство — освобождать место вручную не нужно. Включённая 2FA попросит код из authenticator-приложения или recovery-код.