Розробка мобільного додатку для аренди житла (аналог Airbnb)
Платформа аренди житла—це двостороння програма (гість + господар) з маркетплейсом, escrow-платіжною системою, вбудованим чатом та інфраструктурою довіри. Складність полягає не в окремих функціях, а в тому, що гість і господар мають одночасно довіряти платформі гроші та майно. Це визначає архітектуру від зберігання платежів до системи ідентифікації.
Одна програма чи дві з переключенням ролей
Перший варіант: одна програма з режимами «гість» / «господар» або два окремих додатки. Airbnb використовує один додаток. На практиці—один простіше підтримувати, але екрани господаря (управління списаннями, блокування календаря, виплати) сильно відрізняються від екранів гостя. На iOS—переключення через TabView з різними наборами вкладок залежно від активної ролі. На Android—BottomNavigationView з динамічним набором пунктів.
Список: структура даних та фотографії
Список—найбагатший об'єкт у системі:
data class Listing(
val id: String,
val hostId: String,
val title: String,
val description: String,
val propertyType: PropertyType, // APARTMENT, HOUSE, ROOM, VILLA
val location: GeoPoint,
val address: Address,
val roomCount: Int,
val maxGuests: Int,
val amenities: Set<Amenity>, // WIFI, KITCHEN, PARKING, POOL...
val rules: HouseRules,
val pricePerNight: Decimal,
val cleaningFee: Decimal,
val minNights: Int,
val instantBook: Boolean, // миттєве бронювання або запит
val photos: List<String>, // URLs у CDN
val avgRating: Float?,
val reviewCount: Int
)
Завантаження фотографій від господаря—через UIImagePickerController / PHPickerViewController (iOS) або PhotoPicker API (Android 13+). Стискаємо фотографії перед завантаженням: UIGraphicsImageRenderer на iOS, Bitmap.compress() на Android. Оригінал не потрібен—достатньо 1200px по довгій стороні. Завантажуємо в S3 / Cloudflare R2 через presigned URL, щоб бінарні дані не йшли через ваш сервер.
Календар та доступність
Господар відмічає заблоковані дати та встановлює ціну за дні тижня (п'ятниця/субота дорожче). Гість бачить доступні діапазони. Це кастомний CalendarView—жоден стандартний компонент не підтримує багатоденне вибір діапазону з розфарбуванням занятих дат.
На iOS: UICollectionView з кастомним UICollectionViewFlowLayout—комірки дня, підсвічування вибраного діапазону. На Android: можна взяти kizitonwose/calendar-compose—якісна бібліотека з підтримкою вибору діапазону та декораторів.
// SwiftUI: кастомний календар діапазону
struct RangeCalendarView: View {
@Binding var checkIn: Date?
@Binding var checkOut: Date?
let blockedDates: Set<DateComponents>
let pricedDates: [DateComponents: Decimal]
var body: some View {
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 7)) {
ForEach(calendarDays, id: \.self) { day in
DayCell(
date: day,
isBlocked: blockedDates.contains(day.dateComponents),
price: pricedDates[day.dateComponents],
isInRange: isInSelectedRange(day),
isCheckIn: day.date == checkIn,
isCheckOut: day.date == checkOut
)
.onTapGesture { handleDayTap(day) }
}
}
}
}
Платіжна система з escrow
Гроші гостя не повинні одразу йти господарю—це escrow. Airbnb тримає гроші до 24 годин після заїзду, потім передає господарю. Схема:
- Гість бронює → гроші списуються з карти та замораживаються на рахунку платформи
- Check-in наступив → через 24 години гроші розблоковуються та йдуть господарю
- Проблема при заїзді → гроші повертаються гостю
Реалізується через YooKassa або Stripe Connect. Stripe Connect—найбільш гнучкий: destination charge або separate charge and transfer. Господар реєструє Connected Account; виплата—POST /v1/transfers з указанням destination (рахунок господаря). Скасування—POST /v1/refunds.
Для російського ринку: YooKassa з POST /v3/payouts для виплат господарям, вимагає підключення split-оплати.
Чат між гостем та господарем
Вбудований чат—обов'язковий елемент. Firebase Realtime Database або Stream Chat (готовий SDK для iOS/Android з UI). Stream Chat швидше в інтеграції: StreamChatClient, ChatChannelView—ChannelList і MessageList з коробки, підтримка зображень, індикатор введення.
Важливо: переписка повинна зберігатися на платформі. Не дозвольте ділитися контактами до бронювання—платформа втрачає транзакцію та довіру до безпеки.
Верифікація та довіра
Верифікація особистості: фото паспорта через VisionKit / ML Kit Document Scanner + селфі з liveness detection. Інтегруємо Sum Sub або Veriff—їхній мобільний SDK обробляє весь потік верифікації.
Верифікація жилого приміщення: господар повинен підтвердити адресу. Відправляємо фізичний лист з кодом (рідко) або верифікуємо через API державних служб (ESIA OAuth).
Рейтинги: двосторонні відзиви—гість оцінює житло, господар оцінює гостя. Обидва бачать оцінку лише після того, як обидва залишили відзив (blind review)—зменшує упередженість.
Пошук та карта
PostGIS для геопошуку з фільтрами (тип житла, кількість кімнат, зручності, ціна). Пошук за багатокутником—користувач рухає карту, результати оновлюються для видимої площі (GET /listings?bounds=lat1,lon1,lat2,lon2). Кластеризація маркерів.
Повнотекстовий пошук за містом через Mapbox Geocoding API або Nominatim (OpenStreetMap)—конвертуємо текст у координати перед геопошуком.
Етапи та терміни
| Етап | Терміни |
|---|---|
| Архітектура: ролі, моделі даних | 1 тиждень |
| Список: створення, фото, календар | 2 тижні |
| Пошук, карта, фільтри | 2 тижні |
| Бронювання, escrow, оплата | 2 тижні |
| Чат, повідомлення | 1 тиждень |
| Верифікація, відзиви, профілі | 1 тиждень |
| Тестування, складання | 1 тиждень |
Усього: 10–14 тижнів для повноцінного MVP обох ролей. Вартість розраховується індивідуально після аналізу вимог.







