Разработка мобильного приложения для авиабилетов
Авиационный ticketing — технически самая сложная ниша транспортных приложений. Данные о рейсах поступают через GDS (Global Distribution System) — Amadeus, Sabre, Travelport — и обновляются в реальном времени. Прямой доступ к GDS требует сертификации; большинство независимых разработчиков идёт через агрегаторные API.
Источники данных: GDS и агрегаторы
Amadeus for Developers — самый доступный GDS API. Free tier до 2000 вызовов в месяц, продакшен через партнёрское соглашение. Авторизация OAuth2, REST/JSON. Основные endpoint'ы:
-
GET /shopping/flight-offers— поиск предложений -
POST /shopping/flight-offers/pricing— верификация цены перед бронированием -
POST /booking/flight-orders— создание бронирования
Важно: цены в авиации меняются секундно. Между flight-offers и flight-orders обязательно вызываем pricing — цена может измениться. Без этого — бронируем по устаревшей цене, GDS вернёт ошибку.
// iOS: поиск рейсов через Amadeus API
struct FlightSearchParams {
let origin: String // "SVO"
let destination: String // "AYT"
let departureDate: String // "2025-07-10"
let adults: Int
let travelClass: String // "ECONOMY", "BUSINESS"
let nonStop: Bool
}
class FlightSearchViewModel: ObservableObject {
@Published var offers: [FlightOffer] = []
@Published var isLoading = false
@Published var error: SearchError?
func search(params: FlightSearchParams) async {
isLoading = true
do {
// Запрос к нашему бэкенду, который проксирует Amadeus
offers = try await flightAPI.searchOffers(params)
} catch {
self.error = .networkError(error.localizedDescription)
}
isLoading = false
}
}
Если нужна мультисистемность (несколько GDS + low-cost авиакомпании) — агрегаторы Travelpayouts API, Kiwi.com API, Skyscanner Partner API. Последний требует партнёрского статуса с трафиком от 100K поисков в месяц.
Для российского рынка: Aviasales API — доступ через partners.aviasales.ru, хорошее покрытие по СНГ, партнёрская модель.
Сложный поиск: мультисегментные маршруты
Прямые рейсы — просто. Сложнее — мультисегментные маршруты с пересадками. GDS возвращает itineraries с несколькими segments. Нужно корректно отображать:
- Общее время в пути vs время перелёта (без пересадок)
- Время пересадки (layover) с предупреждением при < 60 минутах
- Аэропорт пересадки — другой аэропорт в том же городе (например, CDG vs ORY в Париже) — красный флаг
Фильтрация: только прямые, максимум 1 пересадка, время вылета (ночной/дневной/утренний), авиакомпания, аэропорт вылета (для городов с несколькими аэропортами).
Сортировка: по цене, по времени в пути, по удобству (составной индекс). Amadeus возвращает amenities для каждого предложения — место у прохода, багаж, питание — включаем в карточку рейса.
Выбор мест и дополнительные услуги
Выбор места в самолёте — интерактивная схема салона. Amadeus Seat Map API возвращает схему: строки, колонки, тип класса, статус (доступно / занято / заблокировано). Рендерим через Canvas/custom View.
Схема существенно отличается у разных типов воздушных судов. A320 и Boeing 737 имеют разную компоновку. Данные о схеме живые — занятые места обновляются при каждом вызове API.
Дополнительные услуги: дополнительный багаж, выбор питания, страхование. Каждая услуга — отдельный POST /booking/flight-orders/{id}/ancillaries или аналогичный endpoint авиакомпании. Цены на допуслуги приходят из Additional Bag Offers от Amadeus.
Посадочные талоны и управление поездкой
После успешного бронирования — PNR (Passenger Name Record) и электронный билет. Посадочный талон доступен за 24 часа до вылета через Check-in API авиакомпании (если поддерживается). Стандарт — BCBP (Bar Coded Boarding Pass): строка данных, кодируемая в Aztec или QR.
На iOS: PKBoardingPass через PassKit — добавление посадочного талона в Wallet с автоматическим напоминанием на экране блокировки в нужный момент:
// Добавление посадочного талона в Apple Wallet
func addBoardingPassToWallet(pass: PKPass) {
let passLibrary = PKPassLibrary()
if passLibrary.containsPass(pass) { return }
let addPassVC = PKAddPassesViewController(pass: pass)
present(addPassVC, animated: true)
}
На Android: аналог через Google Wallet API с BoardingCardObject.
Push-уведомления через FCM/APNs: задержка рейса (через FlightAware API или AviationStack), открытие регистрации, изменение выхода на посадку, напоминание о посадке.
Offline и плохая связь в аэропорту
Посадочный талон должен работать без интернета. Кэшируем данные в Core Data / Room при получении: номер рейса, PNR, штрихкод, данные пассажира. QR-код генерируем из локальных данных — не запрашиваем сервер при показе.
Возврат и обмен билетов
Возврат/обмен через API авиакомпании или GDS. У каждого тарифа своя fare conditions — отображаем их на экране покупки: невозвратный, частично возвратный, свободный обмен. Amadeus Branded Fares API помогает структурировать условия тарифов для пользователя.
Этапы и сроки
| Этап | Срок |
|---|---|
| Интеграция GDS / агрегатора | 1–2 недели |
| Поиск: одиночные и мультисегментные рейсы | 2 недели |
| Бронирование, оплата, PNR | 2 недели |
| Выбор мест, допуслуги | 1 неделя |
| Посадочные талоны, Apple/Google Wallet | 1 неделя |
| Уведомления о статусе рейса | 1 неделя |
| Тестирование, iOS + Android | 1 неделя |
Итого: 9–12 недель. Стоимость рассчитывается индивидуально после анализа требований.







