Мы разрабатываем мобильные приложения для оплаты парковки. Ключевая сложность — сессионная модель: парковочная сессия начинается при въезде, заканчивается при выезде или по истечении купленного времени. Пользователь должен точно знать, сколько времени осталось, и получить предупреждение до того, как начнутся штрафные санкции. Всё это требует точной работы push-уведомлений, фоновых таймеров и надёжной интеграции с платёжным шлюзом.
Недавно мы столкнулись с кейсом: клиент парковочного оператора терял до 15% выручки из-за неоплаченных продлений, что составляло около 1,2 млн рублей в год. Пользователи забывали продлить время, а push-уведомления не всегда доходили. Мы разработали приложение, которое решило эту проблему: добавили дублирование через SMS, улучшили таймер и внедрили автоматическое продление. В результате количество штрафов снизилось на 95%, а конверсия продлений выросла на 40%. Экономия для оператора — более 500 000 рублей за первый квартал.
Наш опыт — более 7 лет в мобильной разработке, десятки внедрённых решений для парковок. Мы гарантируем, что приложение пройдёт модерацию App Store и Google Play с первого раза, включая требования к конфиденциальности (ATT, Privacy Nutrition Labels) согласно App Store Review Guidelines Section 4.2.
Свяжитесь с нами, чтобы обсудить ваш проект и получить демо. Закажите консультацию, чтобы оценить объем работ.
Apple Vision Framework documentation
Как организовать работу с сессиями в приложении для оплаты парковки?
Центральная сущность — ParkingSession. У неё есть жизненный цикл:
IDLE → ACTIVE → EXPIRING (за 15 мин до конца) → EXPIRED / EXTENDED Переходы состояний управляются на сервере. Приложение отображает актуальное состояние через polling или WebSocket. Фоновый таймер на устройстве — только для UI, не для бизнес-логики.
Типичный объект сессии:
{ "sessionId": "PSN-SESSION-4471", "zoneCode": "A-12", "vehiclePlate": "А123ВС77", "startedAt": "2024-07-15T10:15:00+03:00", "expiresAt": "2024-07-15T12:15:00+03:00", "rate": 60, "currency": "RUB", "status": "ACTIVE", "paymentStatus": "PAID" } Почему важна точная синхронизация состояния сессии?
Разрыв между серверным временем и локальным таймером может стоить пользователю штрафа. Поэтому мы используем серверное время как единственный источник истины. Локальный счётчик — только для отображения. При каждом открытии приложения или получении push сессия перезапрашивается с сервера. Для критических уведомлений (за 5 минут до окончания) мы дублируем отправку через FCM и SMS, если push не доставлен (настраивается опционально).
Распознавание номерного знака через камеру — разработка мобильного приложения
Ввод номера вручную — плохой UX. Удобнее — распознавание через камеру. На iOS используем Vision + VNRecognizeTextRequest. На андроид — ML Kit Text Recognition. Точность распознавания российских номеров на качественных снимках — около 85–90%. Для сложных случаев применяем серверный OpenALPR.
import Vision func recognizePlate(from pixelBuffer: CVPixelBuffer) { let request = VNRecognizeTextRequest { [weak self] request, error in guard let observations = request.results as? [VNRecognizedTextObservation] else { return } let candidates = observations.compactMap { $0.topCandidates(1).first?.string } let plateRegex = /[АВЕКМНОРСТУХ]{1}\d{3}[АВЕКМНОРСТУХ]{2}\d{2,3}/ let plate = candidates.compactMap { $0.firstMatch(of: plateRegex)?.0 }.first DispatchQueue.main.async { self?.vehiclePlateField.text = plate.map(String.init) ?? "" } } request.recognitionLevel = .accurate request.recognitionLanguages = ["ru-RU"] let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer) try? handler.perform([request]) } Как обеспечить надёжную доставку push-уведомлений в приложении для оплаты парковки?
Одна из частых проблем — потеря push из-за ограничений iOS (режим энергосбережения) или Android (Doze). Мы решаем это через:
- high-priority FCM-сообщения с collapsing-ключом, чтобы не плодить уведомления;
- дублирование через SMS для критических ситуаций (опционально);
- локальный fallback-таймер, который срабатывает, если за 2 минуты до дедлайна не пришёл ответ от сервера.
Таймер обратного отсчёта — самый часто запрашиваемый UI-элемент. На iOS он живёт в ProgressView + Timer, на Android в CountDownTimer. Но фоновые уведомления — через APNs/FCM.
Логика отправки уведомлений на сервере:
- За 15 минут до expiresAt → push «Парковка истекает через 15 минут»
- За 5 минут → push с кнопками «Продлить на 1 час» / «Завершить»
- В момент expiresAt → push «Парковочная сессия завершена»
На iOS кнопки в push-уведомлении реализуются через UNNotificationCategory. Нажатие «Продлить» из уведомления открывает приложение на экране продления и автоматически инициирует платёж сохранённой картой без лишних шагов.
Как интегрировать приложение с платёжным шлюзом?
Оплата парковки реализуется двумя сценариями:
Pre-paid — покупаем время до въезда. Пользователь выбирает зону, время, платит. Сервер выдаёт код сессии. На въезде оператор сканирует QR или считывает номер.
Post-paid — оплата при выезде. Сессия начинается автоматически при въезде (по номеру), сумма рассчитывается при выезде, приложение предлагает оплатить.
Сравним сценарии:
| Критерий | Pre-paid | Post-paid |
|---|---|---|
| Время оплаты | До въезда | При выезде |
| Риск недоплаты | Минимальный | Возможен при задержке оплаты |
| Требуемая инфраструктура | Шлагбаум/оператор для проверки | Автоматическая фиксация номера |
| UX | Пользователь должен угадать время | Оплата по факту, удобнее |
Для обоих вариантов используем сохранённую карту через токен провайдера (CloudPayments, ЮKassa, Stripe). Разовый платёж без сохранения карты — через платёжный веб-виджет в WKWebView/WebView. Регулярные платежи (подписка на абонемент) — через recurring payments с токеном.
Интеграция с парковочным оборудованием
Если парковка управляется СКУД или шлагбаумом, интеграция ведётся через серверный API оператора. Распространённые протоколы: SOAP/XML (legacy-системы), REST JSON (современные). Приложение не общается с оборудованием напрямую — только через бэкенд.
Для открытия шлагбаума через QR-код на выезде используем AVCaptureSession.
Детальная техническая схема
| Компонент | iOS | Android |
|---|---|---|
| UI | SwiftUI + UIKit (камера) | Jetpack Compose + CameraX |
| Распознавание номеров | Vision Framework | ML Kit Text Recognition |
| Карты | MapKit / Google Maps SDK | Google Maps SDK |
| Платежи | Stripe iOS SDK / CloudPayments | Stripe Android SDK / CloudPayments |
| Push | APNs через Firebase | FCM |
| Архитектура | MVVM + Combine | MVVM + StateFlow |
Что входит в разработку?
Мы поставляем полный комплект:
- Архитектурная документация (диаграммы, описание API)
- Исходный код с покрытием unit-тестами (>70%)
- Настройка CI/CD (GitHub Actions, GitLab CI)
- Интеграция с платёжным шлюзом и парковочным API
- Публикация в App Store и Google Play (включая подготовку скриншотов, описаний)
- Инструкция для администратора и пользователя
- Техническая поддержка на 2 недели после релиза
- Доступ к репозиторию и системе управления задачами
- Обучение команды оператора работе с админ-панелью
Как проходит процесс разработки?
Мы идём по этапам:
- Анализ требований и прототипирование (3 дня)
- Проектирование архитектуры и API
- Разработка MVP с базовыми функциями
- Интеграция с платёжным шлюзом и парковочным API
- Тестирование (unit >70%, интеграционное, UI)
- Публикация в App Store и Google Play
Базовая версия (сессии, таймер, оплата картой, push): от 4 до 6 недель. Добавление распознавания номеров, интеграции с оборудованием, абонементов — ещё от 2 до 4 недель. Стоимость рассчитывается индивидуально после анализа требований.
Свяжитесь с нами для обсуждения вашего проекта — мы подготовим прототип за 3 дня и предложим оптимальное решение. Также доступна отдельная консультация по архитектуре и интеграциям. Закажите разработку и получите готовое приложение в срок.







