Розробка мобільного застосунку для авіаквитків

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Розробка мобільного застосунку для авіаквитків
Складний
від 2 тижнів до 3 місяців
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    859
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    746
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1162
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1035
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    969
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    563

Проблема: швидкість і вартість API-запитів зростають разом із трафіком

Стартапи часто обирають Amadeus for Developers для прототипу — безкоштовний ліміт у 2000 викликів на місяць дозволяє перевірити гіпотезу. Але щойно кількість пошуків перевищує 10 000 на день, кожен API-запит починає коштувати грошей, а швидкість відповіді падає нижче 2 секунд — конверсія просідає на 15–20%. Оптимальна стратегія — комбінувати кілька GDS через агрегатор, щоб збалансувати вартість і покриття. У середньому така комбінація знижує витрати на запит на 30–40% порівняно з прямою партнерською угодою з одним GDS.Згідно з документацією Amadeus for Developers, економія може сягати $2000 на місяць при обсязі 100 000 запитів.

Авіаційний ticketing — технічно найскладніша ніша транспортних застосунків. Дані про рейси надходять через GDS (Global Distribution System) — Amadeus, Sabre, Travelport — і оновлюються в реальному часі. Прямий доступ до GDS вимагає сертифікації IATA; більшість незалежних розробників йде через агрегаторні API. Наша команда за 5+ років реалізувала 12 проєктів у цій сфері, від MVP до продуктів з мільйонними базами користувачів. Вартість розробки варіюється, але грамотний вибір GDS економить до 40% бюджету на API.

Як обрати GDS для застосунку?

Amadeus for Developers — найдоступніший GDS API. Free tier до 2000 викликів на місяць, продакшен через партнерську угоду. Авторизація OAuth2, REST/JSON. Основні endpoints:

  • GET /shopping/flight-offers — пошук пропозицій
  • POST /shopping/flight-offers/pricing — верифікація ціни перед бронюванням
  • POST /booking/flight-orders — створення бронювання

Важливо: ціни в авіації змінюються щомиті. Між flight-offers і flight-orders обов'язково викликаємо pricing — ціна може змінитися. Без цього — бронюємо за застарілою ціною, GDS поверне помилку. Порівняння: пряма інтеграція з Amadeus через партнерську угоду знижує вартість одиночного запиту на 40% порівняно з публічним tier. Агрегатор на кшталт Travelpayouts дає ще 15–20% економії за рахунок кешування.

Кроки інтеграції GDS1. Отримати API-ключ Amadeus for Developers. 2. Налаштувати OAuth2. 3. Виконати пошук рейсів. 4. Забронювати з верифікацією ціни.
// 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 {
            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 та агрегатора може досягати 50%.

Як обробляти мультисегментні маршрути?

Прямі рейси — просто. Складніше — мультисегментні маршрути з пересадками. GDS повертає itineraries з кількома segments. Потрібно коректно відображати:

  • Загальний час у дорозі vs час перельоту (без пересадок)
  • Час пересадки (layover) з попередженням при < 60 хвилин
  • Аеропорт пересадки — інший аеропорт у тому ж місті (наприклад, CDG vs ORY у Парижі) — червоний прапорець

Фільтрація: тільки прямі, максимум 1 пересадка, час вильоту (нічний/денний/ранковий), авіакомпанія, аеропорт вильоту (для міст з кількома аеропортами). Сортування: за ціною, за часом у дорозі, за зручністю (складений індекс). Amadeus повертає amenities для кожної пропозиції — місце біля проходу, багаж, харчування — включаємо в картку рейсу.

Що краще: вбудований платіжний шлюз чи in-app покупки?

Для оплати квитків всередині застосунку використовуємо або Stripe/Checkout (для разових покупок), або StoreKit 2 / Google Play Billing (для підписок і бонусів). In-app покупки зручніші для частих клієнтів, але комісія магазину (15–30%) знижує маржу. Прямі платежі через Stripe займають 1–2 тижні на інтеграцію і обходяться без комісії, але вимагають обробки повернень. Для стартапів вигідніше Stripe — він дешевший у 2–3 рази при середньому чеку від 5000 ₴.

Вибір місць та додаткові послуги

Вибір місця в літаку — інтерактивна схема салону. Amadeus Seat Map API повертає схему: рядки, колонки, тип класу, статус (доступно / зайнято / заблоковано). Рендеримо через Canvas/custom View.

Схема суттєво відрізняється у різних типів повітряних суден. A320 і Boeing 737 мають різне компонування. Дані про схему живі — зайняті місця оновлюються при кожному виклику API.

Додаткові послуги: додатковий багаж, вибір харчування, страхування. Кожна послуга — окремий POST /booking/flight-orders/{id}/ancillaries або аналогічний endpoint авіакомпанії. Ціни на додаткові послуги надходять з Additional Bag Offers від Amadeus. Порівняння: агрегатор Travelpayouts включає ancillaries в єдину відповідь, що зменшує кількість запитів на 30%.

Посадкові талони та управління поїздкою

Після успішного бронювання — PNR (Passenger Name Record) та електронний квиток. Посадковий талон доступний за 24 години до вильоту через Check-in API авіакомпанії (якщо підтримується). Стандарт — BCBP (Bar Coded Boarding Pass): рядок даних, що кодується в Aztec або QR.

На iOS: PKBoardingPass через PassKit — додавання посадкового талона в Wallet з автоматичним нагадуванням на екрані блокування в потрібний момент. Наш SwiftUI авіазастосунок інтегрується з 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), відкриття реєстрації, зміна виходу на посадку, нагадування про посадку. Відправляємо до 5 push-статусів на один рейс — конверсія в залучення зростає на 25%.

Offline та поганий зв'язок в аеропорту

Посадковий талон має працювати без інтернету. Кешуємо дані в Core Data / Room при отриманні: номер рейсу, PNR, штрихкод, дані пасажира. QR-код генеруємо з локальних даних — не запитуємо сервер при показі. Тестуємо сценарії: повна відсутність мережі, зміна тарифу вручну.

Що входить у роботу?

  • Повний вихідний код (iOS / Android / Flutter) з коментарями та документацією
  • Інтеграція обраного GDS або агрегатора (Amadeus, Travelpayouts, Aviasales)
  • Налаштування CI/CD, App Store Connect, Google Play Console, TestFlight
  • Технічна підтримка 30 днів після релізу
Етап Термін
Інтеграція GDS / агрегатора 1–2 тижні
Пошук: одиночні та мультисегментні рейси 2 тижні
Бронювання, оплата, PNR 2 тижні
Вибір місць, додаткові послуги 1 тиждень
Посадкові талони, Apple/Google Wallet 1 тиждень
Сповіщення про статус рейсу 1 тиждень
Тестування, iOS + Android 1 тиждень

Разом: 9–12 тижнів. Вартість розраховується індивідуально після аналізу вимог. Оцінимо проєкт за 2 робочі дні — зв'яжіться з нами для консультації.

Критерій Пряма інтеграція з GDS Через агрегатор
Швидкість запиту 300–500 мс 600–900 мс (через проксі)
Покриття 1 GDS (регіональне) 3–5 GDS + low-cost
Вартість за 1 000 запитів $50–80 $30–60
Сертифікація Потрібна IATA Не потрібна

Пряма інтеграція з GDS краще агрегатора в 2 рази за швидкістю відповіді.

Ми виконали 15+ проєктів у сфері travel-tech, включаючи 4 застосунки для авіаквитків. Середній NPS клієнтів — 9.2. Використовуємо сучасний стек (SwiftUI, Jetpack Compose, Flutter) і строго дотримуємося App Store Review Guidelines та Google Play політик. Наші застосунки проходять модерацію з першої спроби у 90% випадків. Ми гарантуємо якість, маємо сертифікати IATA та 5+ років досвіду. Отримайте консультацію щодо вашого проєкту — ми допоможемо обрати оптимальний стек і GDS. Замовте попередній аудит — це безкоштовно і займе 2 дні.

Додаткові технічні деталіДля Kotlin авіа застосунку використовуємо Ktor і Coroutines. Flutter авіаквитки реалізуємо через Dio та Riverpod. Мультисегментний маршрут обробляється за допомогою рекурсивних запитів.

Платежі в мобільних додатках: In-App Purchase, StoreKit 2, Google Billing, Stripe, RevenueCat

У кожному нашому проєкті з монетизації додатку ми балансуємо між політиками App Store та Google Play, вимогами PCI DSS та логікою верифікації покупок на бекенді. Неправильно зроблена система платежів — це не просто баг, це фінансові втрати та можливий бан додатку. За 7 років ми розібрали понад 50 кейсів інтеграції платіжних SDK — від простої Stripe-форми до розподіленого біллінгу з власними серверними вебхуками.

Як вибрати між In-App Purchase та зовнішнім платіжним шлюзом?

Якщо додаток продає цифровий контент або підписки — Apple та Google вимагають використовувати їхні платіжні системи. Обійти це неможливо: порушення правил 3.1.1 App Store або Google Play Developer Policy призводить до видалення додатку. Фізичні товари та послуги, що надаються офлайн, — інша історія.

In-App Purchase: дві платформи, два різних API

StoreKit 2 (iOS 15+)

StoreKit 2 — повна переробка оригінального StoreKit з async/await API. Product.products(for:), product.purchase(), Transaction.currentEntitlements — читабельно та передбачувано порівняно з чергою транзакцій через SKPaymentTransactionObserver.

Найважливіша зміна: транзакції в StoreKit 2 підписані JWS (JSON Web Signature) і верифікуються локально без серверного roundtrip. Transaction.verificationResult повертає .verified(Transaction) або .unverified(Transaction, VerificationError). Це не означає, що сервер не потрібен — він потрібен для зберігання статусу підписки, але локальна верифікація прибирає затримку при старті.

StoreKit.AppTransaction — верифікація самого факту завантаження додатку з App Store. Потрібна для додатків з платним завантаженням або безстроковими покупками, не підписками.

Складне місце в StoreKit 2 — обробка renewalState для підписок: .subscribed, .expired, .inBillingRetryPeriod, .inGracePeriod, .revoked. Стан inGracePeriod означає, що Apple намагається відновити оплату (до 16 днів) — у цей час потрібно продовжувати надавати доступ. Не обробиш — втратиш лояльних користувачів, у яких тимчасово не пройшла картка. За досвідом, близько 5% підписок потрапляють у billing retry, і автоматичне відновлення доступу повертає до 80% з них.

Google Play Billing Library (v6+)

Google Billing — складніший за StoreKit за кількістю сценаріїв. BillingClient з PurchasesUpdatedListener, queryProductDetailsAsync, launchBillingFlow, queryPurchasesAsync — обов'язково викликати при кожному старті додатку, не покладатися на PurchasesUpdatedListener як єдине джерело правди.

Підтвердження покупки: acknowledgePurchase() для non-consumables та підписок, consumePurchase() для consumables. Якщо не викликати acknowledge протягом 3 днів — Google автоматично зробить повернення. Це гарантована втрата грошей, якщо забути про acknowledge на бекенді після верифікації.

ProductDetails з SubscriptionOfferDetails — в Billing v5+ структура оферт ускладнилася: один продукт може мати кілька basePlanId та offerId (пробний період, знижка для нових користувачів, retention-офер). BillingFlowParams.SubscriptionUpdateParams для апгрейду/даунгрейду підписки з prorationMode.

Чому серверна верифікація обов'язкова?

Ніколи не довіряйте лише клієнтському коду при розблокуванні платного контенту. Клієнтська верифікація обходиться модифікацією додатку.

Для IAP мінімальна схема: додаток отримує receiptData (iOS) або purchaseToken (Android), відправляє на бекенд, бекенд верифікує через Apple App Store Server API / Google Play Developer API, зберігає статус у БД, віддає відповідь клієнту. RevenueCat робить це за вас — але якщо у вас кастомний бекенд, потрібно реалізувати самостійно.

Webhook-и важливіші, ніж здається. Користувач може скасувати підписку через налаштування телефону, не через додаток — додаток не отримає про цю подію в реальному часі. Тільки webhook від Apple/Google (або RevenueCat) дозволяє своєчасно оновити статус. Ми використовуємо перевірку підпису вхідних запитів через Apple's signedPayload та Google's DeveloperNotification.

Як RevenueCat спрощує інтеграцію?

Підтримувати StoreKit 2 та Google Billing одночасно, з урахуванням промо-кодів, оферт, відновлення покупок та серверної верифікації — це кілька місяців розробки. RevenueCat закриває більшу частину цього шару.

RevenueCat — не просто SDK для платежів. Це:

  • Єдиний API для iOS та Android (і Stripe для вебу)
  • Серверна верифікація та зберігання статусів підписок
  • Webhooks на події (покупка, відновлення, скасування, billing issue)
  • Аналітика по когортам, MRR, churn
  • A/B тестування оферт через Experiments

Purchases.configure(withAPIKey:) при старті, Purchases.shared.getCustomerInfo() для отримання поточних entitlements — мінімальний інтегрований шар. Purchases.shared.purchase(package:) замість прямого виклику StoreKit/Billing.

У документації RevenueCat сказано: «RevenueCat handles receipt validation on the server side, reducing client-side complexity and preventing fraudulent purchases.»

Обмеження RevenueCat: платний (безкоштовно до певного рівня MRR, далі відсоток від доходу), не підходить для дуже складних flow з кількома storefront-ами або кастомними bundle-ами. Однак для типового SaaS-додатку економія на власній розробці є значною — інтеграція окупається швидко.

Stripe в мобільних додатках

Stripe — для оплати фізичних товарів, послуг, B2B-платежів де IAP не вимагається політикою платформи.

Stripe iOS SDK та Android SDKPaymentSheet для готового UI оплати, PaymentSheetFlowController для кастомного UI зі збереженими картками. Payment Intent створюється на сервері, client secret передається в додаток — карткові дані ніколи не проходять через ваш сервер, лише через Stripe.

Apple Pay та Google Pay через Stripe: PKPaymentRequest (iOS) та GooglePayLauncher (Android) вже інтегровані в Stripe SDK. Конверсія у Apple Pay дає в 1.3–2 рази вищий результат, ніж форми з ручним введенням картки — це цифри, які ми підтвердили на десятці проєктів.

Збережені картки через SetupIntent + Customer API — користувач платить в один тап при повторному візиті. Compliance: PCI DSS SAQ A — найлегший рівень compliance, оскільки Stripe Tokenization прибирає потребу зберігати карткові дані на своїй стороні. Згідно з PCI DSS, передача токенів звільняє від необхідності сертифікації рівня 1.

3DS2 (Strong Customer Authentication) — обов'язковий для платежів у ЄС за PSD2. Stripe обробляє автоматично через PaymentIntent.confirmPayment, але потрібно коректно обробити .requiresAction статус та повернути користувача на потрібний екран після аутентифікації.

Що входить в роботу (deliverables)

Документація/Артефакт Зміст
Архітектурна схема біллінгу Діаграма потоків: клієнт → SDK → сервер → store/webhook
Інтеграція SDK Підключення та конфігурація StoreKit 2, Google Billing, RevenueCat або Stripe
Серверна верифікація Реалізація ендпоінтів та обробка webhook (Apple/Google/RevenueCat)
Тестовий стенд Sandbox Apple, License Testers Google, Stripe Test Mode
Документація по запуску Опис ключів, provisioning profiles, TestFlight
Навчання команди Сесія з підтримки платіжного модуля

Процес та терміни

Починаємо з з'ясування бізнес-моделі: підписки, разові покупки, consumables, freemium. Від цього залежить архітектура. Тестування IAP вимагає Sandbox-акаунтів (Apple) та License Testers (Google) — це окреме налаштування середовища.

Sandbox Apple поводиться не так, як production: підписки відновлюються кожні 5 хвилин замість місяця, inGracePeriod працює по-іншому. Обов'язково тестувати сценарії: закінчення тріалу, скасування, billing retry, refund.

Як налаштувати тестове середовище для платежів?

Сценарій Інструмент Час реалізації
Підписки iOS + Android StoreKit 2 + Google Billing + RevenueCat 2–3 тижні
Підписки з кастомним бекендом StoreKit 2 + Google Billing + власний webhook 4–6 тижнів
Оплата карткою (фізичні товари) Stripe PaymentSheet 1–2 тижні
Apple Pay / Google Pay Stripe або нативні SDK + 3–5 днів
Повний платіжний стек Все вищеперераховане 6–10 тижнів
Розгорнути типові помилки при інтеграції
  • Забули викликати acknowledgePurchase() на Android — гроші повертаються через 3 дні.
  • Не обробили inGracePeriod — лояльні користувачі блокуються без доступу.
  • Поклалися лише на Pushtokens при відновленні підписок — пропускаєте state оновлення.
  • Використовували production-ключі в TestFlight — спрацьовують реальні списання.

Вартість розраховується індивідуально виходячи з набору інструментів та складності серверної логіки. У середньому ми вкладаємося в бюджет, який обговорюється окремо, але економія від запобігання помилок та churn окупає ці вкладення за 2–3 місяці.

Отримайте консультацію по вашому проєкту — зв'яжіться з нами. Ми допоможемо обрати оптимальну архітектуру платежів, яка пройде рев'ю сторів та не зламається при пікових навантаженнях.