Представьте: приложение выросло до 50+ экранов, поддержка тонет в однотипных вопросах — 40% обращений касаются одного и того же. Документация разбросана по Google Docs, Confluence и Jira. Клиенты уходят, потому что не могут найти ответ за 2 минуты. База знаний (Knowledge Base) решает это, но её реализация — не просто поиск по страницам. Мы расскажем, как спроектировать и внедрить мобильную базу знаний, которая будет работать офлайн, синхронизироваться с CMS, обеспечит мгновенный поиск FTS5 и даст аналитику. Наш опыт — более 10 лет инженерной практики, поэтому мы гарантируем стабильную синхронизацию и быстрый поиск.
Как устроена архитектура мобильной базы знаний?
Источники контента и синхронизация
Наиболее универсальный подход — собственный или headless CMS (Contentful, Strapi, Sanity) с REST/GraphQL API. Мобильный клиент скачивает статьи при первом запуске и при обновлении, хранит в локальной БД. Синхронизация по updatedAt: при каждом запуске скачиваем только изменённые статьи с момента последнего sync-timestamp. Если сеть недоступна, изменения накапливаются и применяются при следующем подключении. Конфликты разрешаются по принципу «последний выигрывает». Обычно это 10–20 КБ данных на обновление, что занимает менее секунды при стабильном соединении.
// Android: Room-схема для статей базы знаний @Entity(tableName = "kb_articles") data class KbArticle( @PrimaryKey val id: String, val title: String, val content: String, // Markdown или HTML val categoryId: String, val updatedAt: Long, val searchIndex: String // нормализованный текст для FTS ) Интеграция с Zendesk Help Center / Freshdesk Solutions
Если поддержка уже на Zendesk — Help Center API предоставляет статьи напрямую. Для кастомного дизайна используем Zendesk Guide API: GET /api/v2/help_center/articles.json. Response содержит body в HTML — рендерим через WebView с кастомным CSS, соответствующим дизайн-системе приложения.
Почему локальный поиск FTS лучше серверного?
Поиск по тысяче статей на сервере при каждом запросе — лишний round-trip и зависимость от сети. Для мобильного приложения лучше локальный Full-Text Search (FTS5). Он работает мгновенно, без интернета, и нагружает только устройство.
| Платформа | Технология FTS | Токенайзер для кириллицы |
|---|---|---|
| Android | Room FTS4 | unicode61 через FTS5 |
| iOS | SQLite FTS5 (GRDB.swift) | unicode61 |
| Cross-platform | SQLite FTS5 через dart:ffi | unicode61 |
Android — Room FTS4:
@Fts4(contentEntity = KbArticle::class) @Entity(tableName = "kb_articles_fts") data class KbArticleFts( val title: String, val searchIndex: String ) @Dao interface KbSearchDao { @Query("SELECT * FROM kb_articles WHERE id IN " + "(SELECT rowid FROM kb_articles_fts WHERE kb_articles_fts MATCH :query)") suspend fun search(query: String): List<KbArticle> } iOS — SQLite с FTS5 через GRDB.swift:
try db.create(virtualTable: "articles_fts", using: FTS5()) { t in t.column("title") t.column("body") t.tokenizer = .unicode61() } Как обеспечить офлайн-доступ и аналитику?
Рендеринг Markdown/HTML
Статьи часто хранятся в Markdown. Мы выбираем нативные библиотеки: Markwon для Android и Down для iOS. Они поддерживают таблицы, code blocks с подсветкой синтаксиса и изображения — достаточно для технической документации. WebView даёт полный HTML/CSS, но медленнее в навигации. Для базового Markdown на iOS 15+ можно использовать AttributedString без зависимостей.
Офлайн-доступ
База знаний должна работать без интернета. Все статьи после первой загрузки хранятся локально. Изображения кешируются через Kingfisher (iOS) или Coil (Android) с настройкой максимального размера кеша — 200 МБ. Обновляем данные только при появлении сети.
Аналитика и обратная связь
Кнопка оценки полезности статьи — простой механизм обратной связи. Отправляем событие с article_id и helpful: true/false в Firebase Analytics.
Analytics.logEvent("kb_article_feedback", parameters: [ "article_id": article.id, "helpful": isHelpful ? "yes" : "no", "time_spent_seconds": Int(Date().timeIntervalSince(openedAt)) ]) time_spent_seconds даёт дополнительный сигнал: если пользователь прочитал за 3 секунды и нажал «не полезно» — статья не по теме. Если провёл 5 минут и нажал «полезно» — контент глубокий и релевантный. Такая аналитика помогает дорабатывать документацию.
Что входит в работу?
- Документация: схема БД, описание API, инструкция по обновлению контента.
- Доступы: тестовые аккаунты к CMS, App Store Connect / Google Play Console.
- Исходный код: репозиторий с модулем базы знаний, покрытие тестами 80%+.
- Обучение: воркшоп для команды поддержки по наполнению контента.
- Поддержка: 2 недели бесплатного сопровождения после релиза.
Этапы разработки и сроки
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика | 1–2 дня | Инвентаризация контента, выбор источников |
| Проектирование | 2–3 дня | Схема БД, API, архитектура синхронизации |
| Реализация | 4–8 дней | Код на Swift 5.9+ / Kotlin, FTS, интеграция с CMS |
| Тестирование | 2–3 дня | Проверка на 10+ устройствах, в том числе офлайн |
| Деплой | 1 день | Публикация, настройка Firebase Crashlytics |
Стоимость разработки рассчитывается индивидуально после аудита. Экономия времени пользователей на поиск информации окупает затраты в течение первого месяца. Готовы оценить ваш проект — свяжитесь с нами для консультации. Закажите разработку базы знаний под ключ и получите стабильное решение, которое улучшит пользовательский опыт.







