Розробка мобільного додатку для турагентства
Мобільний додаток турагентства — це не просто вітрина турів. Це агрегація пропозицій від кількох постачальників (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
}
}
}
}
Прогресивне завантаження критичне для користувацького досвіду: не чекаємо на всіх постачальників, показуємо перші тури протягом 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 зараз.
Оплата через YooKassa або CloudPayments з підтримкою розстрочення (Halva, Tinkoff Installments). Для дорогих турів розстрочення підвищує конверсію—інтеграція через 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 у фоновому режимі (URLSessionDownloadTask).
Етапи та терміни
Проектування API-агрегатора → інтеграція з 1–2 туроператорами → пошук та фільтрування → бронювання → оплата → особистий кабінет → push-повідомлення → iOS + Android.
10–14 тижнів для повноцінного додатку з інтеграцією туроператорів, картами та особистим кабінетом. Вартість розраховується індивідуально після аналізу вимог.







