Представьте: пожилой прихожанин пытается прослушать проповедь на iPhone 6s. Аудио прерывается при переходе в другое приложение, шрифт слишком мелкий, а уведомление о ближайшей службе не приходит. Такая ситуация — результат отсутствия грамотной работы с фоновым аудио, Dynamic Type и push-уведомлениями. Мы накопили решения этих задач для церковных приложений, которые работают на устройствах 5–7-летней давности.
Как работает расписание и уведомления?
Расписание богослужений — календарь с повторяющимися событиями и исключениями. Локальная копия в Core Data (iOS) или Room (Android) с синхронизацией при запуске. Повторяющиеся события (iCalendar RRULE семантика) удобнее хранить как правило + список исключений, а не как N отдельных записей.
Push-уведомления за час до службы — через FCM или APNs. На клиенте также локальные уведомления через UNUserNotificationCenter (iOS) или AlarmManager + NotificationCompat (Android) как резерв для пользователей без стабильного интернета.
Локальные уведомления: пошагово
- Запросить разрешение:
UNUserNotificationCenter.current().requestAuthorization(options:). - Создать контент:
UNMutableNotificationContent()с заголовком и телом. - Задать триггер:
UNCalendarNotificationTrigger(dateMatching:repeats:). - Добавить запрос:
UNUserNotificationCenter.current().add(request).
На Android — NotificationCompat.Builder + AlarmManager.setExact().
Как устроена медиатека проповедей?
Аудио и видео проповеди — основной контент. Видео через HLS от CDN (AVPlayer с AVAsset(url: m3u8URL)), аудио — AVAudioPlayer или AVPlayer в зависимости от формата. Background audio обязателен: пользователи слушают во время поездки.
Background audio на iOS: AVAudioSession с категорией .playback, UIBackgroundModes: audio в Info.plist, MPRemoteCommandCenter для управления из Control Center и AirPods (play/pause, следующий трек, перемотка). Без MPRemoteCommandCenter — уведомление в системном плеере не показывается, AirPods не управляют воспроизведением. Для корректной работы настройка MPRemoteCommandCenter обязательна — подробнее в документации Apple.
На Android — MediaSessionCompat + MediaBrowserServiceCompat + уведомление с MediaStyle. ExoPlayer в ForegroundService для background playback. PlayerNotificationManager из ExoPlayer автоматически создаёт медиа-уведомление с управлением.
Поиск по проповедям — full-text search через API. Фильтр по спикеру, дате, серии. Offline-доступ для скачанных материалов — сохраняем в FileManager (iOS) или getExternalFilesDir() (Android).
Чат общины: готовое SDK или своё решение?
Общий чат — либо через стороннее SDK (Stream Chat, SendBird), либо самостоятельная реализация на WebSocket. Для небольших общин (до 500 человек) готовые SDK с freemium моделью выгоднее по времени разработки и стоимости. Stream Chat SDK для iOS и Android предоставляет готовый UI — ChatChannelVC / ChannelListFragment — с возможностью кастомизации.
| Критерий | Stream Chat | Собственная реализация |
|---|---|---|
| Время внедрения | 1–2 дня | 2–4 недели |
| Стоимость | Бесплатный тариф до 10k MAU | Затраты на сервер + разработка |
| Возможности | Модерация, реакции, файлы | Полный контроль, но сложнее |
Модерация контента — роли администратора и модератора. Удаление сообщений, блокировка пользователей. Это обязательная функция для религиозного сообщества.
Как обрабатываются пожертвования?
Встроенный сбор пожертвований — наиболее регулируемая часть. На iOS нельзя просто встроить свою платёжную форму для цифровых товаров/услуг — Apple требует StoreKit. Но пожертвования для НКО/религиозных организаций не являются покупкой цифрового контента, поэтому WebView с внешней платёжной формой (Stripe, PayPal) допустим. Это нужно явно прописать в назначении приложения при ревью — иначе риск отклонения по гайдлайну 3.1.1.
На Android ограничений меньше — нативная Stripe SDK (com.stripe:stripe-android) с PaymentSheet даёт готовый UI для ввода карты.
Регулярные пожертвования — подписки через Stripe Billing. Управление из приложения: отмена, изменение суммы. Экономия на комиссии Stripe по сравнению с собственным платёжным шлюзом может быть значительной.
Поддержка старых устройств: на что обратить внимание?
Минимальная версия iOS 14 (охватывает более 95% активных устройств). Android минимум API 26 (Android 8). На iOS 14 нет AsyncImage — используем Kingfisher. Без @Observable (iOS 17) — ObservableObject + @Published.
Шрифт — Dynamic Type (UIFont.preferredFont(forTextStyle:), sp единицы на Android). Пожилые пользователи часто увеличивают шрифт в настройках системы — приложение должно корректно реагировать без переполнения текста.
| Какие устройства мы тестируем? |
|---|
| iPhone 6s (iOS 14), iPhone 8, iPhone X, iPod touch 7, Samsung Galaxy S8 (Android 8), Galaxy J5, Xiaomi Redmi Note 5. На каждом устройстве проверяем масштабирование шрифта, фоновое воспроизведение, push-уведомления. |
Что входит в работу? (Deliverables)
| Этап | Результат |
|---|---|
| Анализ | ТЗ, архитектурная схема, прототип UX |
| Дизайн | Pixel Perfect макеты под iOS и Android, адаптация под Dynamic Type |
| Разработка | Нативный код на Swift/Kotlin, интеграция API, push-сертификаты |
| Тестирование | QA на реальных устройствах, UI-тесты, нагрузочное тестирование |
| Публикация | Загрузка в App Store Connect и Google Play Console, обход гайдлайнов |
| Поддержка | 3 месяца баг-фиксов и консультаций после релиза |
Сроки и стоимость
Расписание + медиатека с background audio + push-уведомления — 4–6 недель. Чат + пожертвования + offline — 2–3 месяца. Стоимость рассчитывается после анализа требований. Свяжитесь с нами для оценки вашего проекта — мы подготовим коммерческое предложение за 2 дня.
Гарантии и опыт
Мы гарантируем прохождение App Store Review и Google Play Review, соответствие гайдлайнам (Section 4.2, 5.1) и защиту персональных данных. 5+ лет на рынке мобильной разработки, 30+ релизов. Получите консультацию по архитектуре приложения уже сегодня.







