Разработка мобильного приложения для туристического агентства
Мобильное приложение тураге нтства — не просто витрина туров. Это агрегация предложений от нескольких поставщиков (Amadeus, Sabre, GDS-системы или туроператоры напрямую), поиск с фильтрацией по датам, курортам и категории отеля, бронирование с холдированием мест и оплата. Каждый из этих слоёв добавляет сложность, и чаще всего проекты зависают именно на этапе интеграции с поставщиком туров.
Интеграция с поставщиками
Крупные российские туроператоры — TUI, Coral Travel, Anex Tour — предоставляют XML API по протоколу TourVisor или собственным WSDL. XML-over-HTTPS с синхронными запросами поиска, которые могут отвечать 5–15 секунд. Это сразу диктует архитектуру: мобильный клиент делает запрос на свой бэкенд, который параллельно опрашивает несколько поставщиков, нормализует результаты и отдаёт единый JSON.
// Прогрессивная загрузка результатов через WebSocket
class SearchViewModel: ObservableObject {
@Published var results: [TourPackage] = []
@Published var isSearching = false
private var webSocketTask: URLSessionWebSocketTask?
func startSearch(params: SearchParams) {
isSearching = true
results = []
// Бэкенд стримит результаты по мере получения от поставщиков
webSocketTask = URLSession.shared.webSocketTask(with: searchStreamURL(params))
webSocketTask?.resume()
receiveResults()
}
private func receiveResults() {
webSocketTask?.receive { [weak self] result in
switch result {
case .success(.string(let json)):
if let tour = TourPackage.decode(from: json) {
DispatchQueue.main.async {
self?.results.append(tour)
}
self?.receiveResults()
}
case .success(.data): break
case .failure:
DispatchQueue.main.async { self?.isSearching = false }
@unknown default: break
}
}
}
}
Прогрессивная загрузка критична для UX: не ждём пока ответят все поставщики, показываем первые туры через 2–3 секунды.
Поиск и фильтрация
Поиск по направлению, датам вылета, количеству ночей, типу питания (AI, UAI, BB) и звёздности отеля — стандартный набор. Сложнее — гибкие даты: «±3 дня от выбранной даты». Это умножает количество запросов к API туроператора. На бэкенде кэшируем результаты поиска в Redis с TTL 5 минут — одинаковые запросы с разных устройств возвращают кэш, снижая нагрузку на GDS.
Карта отелей — через MapKit (iOS) или Google Maps SDK (Android). Кластеризация маркеров через GMSMarkerCluster или MKAnnotationView с clusteringIdentifier — без неё на Турции с 800 отелями карта превращается в кашу.
Бронирование и оплата
После выбора тура — проверка актуальности цены (GET /tours/{id}/check) и наличия мест перед оплатой. Цены на туры меняются в реальном времени; тур, который стоил 75 000 руб. 2 минуты назад, может стоить 80 000 сейчас.
Оплата через ЮKassa или CloudPayments с поддержкой рассрочки (Халва, Тинькофф Рассрочка). Для дорогих туров рассрочка увеличивает конверсию — интеграция через POST /payments с параметром payment_method_data.type = installments. После оплаты — автоматическая отправка ваучера и авиабилетов на email и в приложение.
Личный кабинет туриста
История поездок, текущие бронирования, загрузка документов (заграничный паспорт для автозаполнения форм через ML Kit Document Scanner на Android или VisionKit на iOS). Напоминания через FCM/APNs: «До вылета 3 дня — проверьте документы», «Рейс задержан на 2 часа» (интеграция с FlightAware или AviationStack API).
Офлайн-доступ к ваучерам и маршрутным квитанциям — Core Data / Room с загрузкой PDF через URLSession в фоновом режиме (URLSessionDownloadTask).
Этапы и сроки
Проектирование API-агрегатора → интеграция с 1–2 туроператорами → поиск и фильтрация → бронирование → оплата → личный кабинет → push-уведомления → iOS + Android.
10–14 недель для полноценного приложения с интеграцией туроператоров, картой и личным кабинетом. Стоимость рассчитывается индивидуально после анализа требований.







