Разработка мобильного приложения для читалки электронных книг
Сделать читалку, которая просто открывает EPUB — задача на неделю. Сделать читалку, которой приятно пользоваться — совсем другая история. Плавный скролл длинных глав, корректный рендеринг CSS из EPUB3, синхронизация позиции чтения между устройствами, ночной режим без артефактов — каждая из этих деталей требует отдельных решений.
Форматы и рендеринг
Основные форматы: EPUB 2/3, PDF, FB2, иногда MOBI/AZW3.
EPUB
EPUB — это ZIP-архив с HTML/CSS/XML внутри. Рендерить его нативными средствами не получится без промежуточного слоя.
Readium — де-факто стандарт для мобильных читалок с открытым исходным кодом. Readium Swift Toolkit (iOS) и Readium Kotlin Toolkit (Android) поддерживают EPUB 2/3, PDF, аудиокниги, LCP DRM. Это то, что используют Библиотека Литрес, 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
)
)
На iOS — PDFKit (нативно, быстро, поддерживает аннотации). На Android — PdfRenderer (встроенный, но базовый) или PdfiumAndroid для сложных документов с векторной графикой.
FB2
Собственный парсер XML + рендеринг через TextView (Android) / AttributedString (iOS). Либо конвертация в EPUB на сервере/на устройстве через fb2c или Calibre-подобную логику.
Пользовательские настройки чтения
Шрифт, размер, межстрочный интервал, отступы, тема (светлая/тёмная/сепия) — хранятся локально в 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 — если сервер это поддерживает, синхронизация почти бесплатна.
Библиотека книг и загрузки
Книги хранятся в 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-шрифтами на
PdfRendererAndroid — артефакты рендеринга, нужен Pdfium
Что входит в работу
- Поддержка EPUB 2/3 через Readium Toolkit
- PDF-рендеринг нативными средствами
- Настройки шрифта, темы, интервалов
- Закладки и выделения с заметками
- Синхронизация прогресса между устройствами (при необходимости)
- Библиотека с оффлайн-загрузкой и поиском по содержимому
Сроки
Базовая читалка EPUB/PDF с настройками и закладками: 3–5 недель. Полноценное приложение с синхронизацией, поиском по тексту, аннотациями и поддержкой нескольких форматов: 8–10 недель. Стоимость рассчитывается после определения набора форматов и требований к синхронизации.







