Розробка мобільного застосунку для читання електронних книг
Зробити просту читалку, яка відкриває EPUB — завдання на тиждень. Зробити читалку, якою приємно користуватися — зовсім інша історія. Плавний скрол довгих глав, коректний рендеринг CSS з EPUB3, синхронізація позиції читання між пристроями, нічний режим без артефактів — кожна з цих деталей вимагає окремих рішень. Наприклад, для коректної роботи кастомних шрифтів з EPUB3 потрібно нормалізувати шляхи в CSS, а для синхронізації — реалізувати вирішення конфліктів за timestamp.
Правильний вибір стеку рендерингу та синхронізації економить до 60% часу на налагодження. Ми використовуємо Readium Toolkit — перевірену бібліотеку, яка лягла в основу найбільших читалок (Літрес, Storytel). Цей вибір дозволяє нам гарантувати стабільну роботу з EPUB 2/3, PDF та аудіокнигами, а також вбудовану підтримку LCP DRM. Завдяки досвіду понад 10 проєктів читалок ми готові запропонувати оптимальну архітектуру.
Формати та рендеринг
Основні формати: EPUB 2/3, PDF, FB2. MOBI та AZW3 — на запит.
Чому Readium — найкращий вибір для рендерингу EPUB?
EPUB — це ZIP-архів із HTML/CSS/XML всередині. Рендерити його нативними засобами не вийде без проміжного шару. Readium — де-факто стандарт для мобільних читалок з відкритим кодом. Він підтримує EPUB 2/3, PDF, аудіокниги та LCP DRM. Readium Swift Toolkit (iOS) та Readium Kotlin Toolkit (Android) — це те, що використовують Бібліотека Літрес, Storytel та багато інших. Readium рендерить EPUB через вбудований WKWebView / WebView з ін'єкцією свого JavaScript-движка. Це дає повну підтримку CSS з книги, включаючи кастомні шрифти та складну типографіку.
// iOS — відкриття книги через Readium let publication = try await streamer.open(asset: bookAsset, allowUserInteraction: false) let navigator = try EPUBNavigatorViewController( publication: publication, config: .init( editingActions: EditingAction.defaultActions, fontOverrides: userSettings.fontOverrides ) ) Порівняння швидкості: Readium рендерить EPUB у 2 рази швидше, ніж самописний WebView-парсер на CSS-ін'єкції без оптимізацій.
Як обробляти PDF та FB2?
На iOS — PDFKit (нативно, швидко, підтримує анотації). На Android — PdfRenderer (вбудований, але базовий) або PdfiumAndroid для складних документів із векторною графікою. Для FB2 застосовується власний парсер XML з рендерингом через TextView (Android) / AttributedString (iOS). Або конвертація в EPUB на сервері чи пристрої через fb2c або Calibre-подібну логіку.
| Формат | Рендеринг | Підтримка анотацій | Складність |
|---|---|---|---|
| EPUB 2/3 | Readium (WKWebView/WebView) | Так | Середня |
| PDFKit (iOS) / Pdfium (Android) | Так | Низька | |
| FB2 | Власний парсер XML | Ні (базові виділення) | Висока |
Користувацькі налаштування читання
Шрифт, розмір, міжрядковий інтервал, відступи, тема (світла/темна/сепія) — зберігаються локально в UserDefaults / SharedPreferences та застосовуються через CSS-ін'єкцію в Readium:
val preferences = EPUBPreferences( fontFamily = FontFamily.GEORGIA, fontSize = Percentage(1.2), lineHeight = Double(1.5), theme = Theme.SEPIA ) navigator.submitPreferences(preferences) Важливий момент: тема застосунку та тема рідера — різні речі. Якщо користувач читає в темному режимі, але перемикає систему на світлу — читалка не повинна автоматично змінювати тему. Налаштування рідера незалежні від системних.
Прогрес та закладки
Поточна позиція читання — Locator в термінології Readium. Це об'єкт з href (шлях до глави), progression (0.0–1.0 всередині глави) та текстовим фрагментом для точного відновлення позиції після оновлення книги.
Закладки, анотації, виділення — зберігаються в Room / Core Data як Annotation(bookId, locator, text, color, note).
Як синхронізувати прогрес між пристроями?
Якщо потрібна синхронізація — позиція та анотації йдуть на сервер при кожній зміні. WorkManager / BGTaskScheduler надсилає накопичені зміни при появі мережі. Конфлікти вирішуються за timestamp: перемагає пізніша позиція. Readium підтримує OPDS Annotations — якщо сервер це підтримує, синхронізація майже безкоштовна.
Ми гарантуємо, що синхронізація не викличе втрату даних: тестуємо на 10+ пристроях одночасно.
Бібліотека книг та завантаження
Книги зберігаються в Files (iOS) / filesDir (Android) — не в cacheDir, інакше ОС видалить їх при нестачі місця. На iOS з iOS 16+ можна використовувати FileManager з ubiquityContainerIdentifier для iCloud-синхронізації файлів.
Завантаження через URLSession.downloadTask (iOS) / DownloadManager (Android) з відновленням (resumeData). Прогрес відображається в бібліотеці. Пошук по вмісту книги (full-text search всередині EPUB) — через індексацію тексту всіх глав у FTS4/FTS5 таблицю Room.
Типові проблеми та їх вирішення
Кастомні шрифти з EPUB3 (@font-face) не завантажуються, якщо шлях у CSS вказано з ../Fonts/ — потрібна нормалізація шляхів. WKWebView на iOS обрізає довгі сторінки, якщо увімкнено isScrollEnabled = false — вимагається правильна конфігурація пагінації. PDF з embedded CJK-шрифтами на PdfRenderer Android дає артефакти рендерингу, тому ми використовуємо Pdfium. Для кожного кейсу підготовлені внутрішні утиліти: нормалізатор шляхів CSS, автоматична конфігурація пагінації WKWebView та детектор CJK-шрифтів для перемикання на Pdfium.
Що входить у розробку
- Архітектура застосунку та вибір стеку рендерингу.
- UI/UX з адаптацією під iOS та Android.
- Інтеграція Readium Toolkit для EPUB/PDF та парсер FB2.
- Налаштування синхронізації прогресу та анотацій через сервер.
- Реалізація користувацьких налаштувань читання (шрифт, тема, відступи).
- Тестування на фізичних пристроях (не менше 10 моделей).
- Документація по API та збірці, передача вихідних кодів та доступів.
- 6 місяців безкоштовної підтримки після релізу.
Терміни розробки
| Етап | Тривалість |
|---|---|
| Базова читалка EPUB/PDF з налаштуваннями та закладками | 3–5 тижнів |
| Повноцінний застосунок із синхронізацією, пошуком по тексту, анотаціями та підтримкою кількох форматів | 8–10 тижнів |
Вартість розраховується після визначення набору форматів та вимог до синхронізації. Отримайте консультацію — ми підберемо оптимальне рішення. Замовте розробку читалки з гарантією якості: ми надаємо 6 місяців безкоштовної підтримки після релізу.







