Реалізація бази знань у мобільному додатку
База знань відрізняється від FAQ масштабом й структурою: не 20 питань-ответів, а сотні статей з категоризацією, пошуком, версіюванням контенту й навігацією по темі. Для мобільного додатку це означає іншу архітектуру: локальний пошук по індексу, кеширування, offline-доступ й рендеринг розмітки.
Джерела контенту й синхронізація
CMS-бэкенд з API
Найбільш універсальний підхід — власний або headless CMS (Contentful, Strapi, Sanity) з REST/GraphQL API. Мобільний клієнт скачує статі при першому запуску й при оновленні, зберігає в локальній БД.
// 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
)
@Entity(tableName = "kb_categories")
data class KbCategory(
@PrimaryKey val id: String,
val title: String,
val parentId: String?,
val position: Int
)
Синхронізація по updatedAt: при кожному запуску скачуємо тільки змінені статі з моменту останнього sync-timestamp.
Zendesk Help Center / Freshdesk Solutions
Якщо підтримка на Zendesk — Help Center API надає статі напрямки. SDK Zendesk показує їх через вбудований UI, але він слабо кастомізуєм. Для кастомного дизайну використовуємо Zendesk Guide API:
GET https://yoursubdomain.zendesk.com/api/v2/help_center/articles.json
Response містить body в HTML — рендеримо через WebView з кастомним CSS, відповідним дизайн-системі додатку.
Повнотекстовий пошук
Пошук по тисячі статей на сервері при кожному запиті — зайвий round-trip. Для мобільного додатку краще локальний Full-Text Search.
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 — CoreData з NSPredicate або SQLite FTS5:
// NSPredicate для CoreData
let predicate = NSPredicate(
format: "title CONTAINS[cd] %@ OR content CONTAINS[cd] %@",
query, query
)
Для великих баз (>500 статей) — SQLite з FTS5 через GRDB.swift:
try db.create(virtualTable: "articles_fts", using: FTS5()) { t in
t.column("title")
t.column("body")
t.tokenizer = .unicode61()
}
FTS5 з unicode61 токенайзером підтримує кирилицю — важливо для російськомовних додатків.
Рендеринг Markdown/HTML
Статі часто зберігаються у Markdown. Варіанти рендеринга:
| Підхід | iOS | Android | Плюси | Мінуси |
|---|---|---|---|---|
| WebView | WKWebView | WebView | Повний HTML/CSS | Повільний скролл, складна навігація |
| Native Markdown | Down (lib) |
Markwon |
Нативний TextKit | Обмежений CSS |
| AttributedString | iOS 15+ | — | Без залежностей | Тільки базовий Markdown |
Markwon для Android підтримує таблиці, code blocks з підсвіткою синтаксису й зображення — достатньо для технічної документації.
Аналітика й зворотний зв'язок по статтям
Кнопка «Була ли стаття корисна?» — простий механізм оцінки якості контенту. Відправляємо подію з 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 хвилин й натиснув «корисна» — контент глибокий й релевантний.
Offline-доступ
База знань повинна працювати без інтернету — користувач може звертатись до документації в зоні без мережі. Всі статті після першої завантаження зберігаються локально. Зображення кешуються через Kingfisher (iOS) або Coil (Android) з настройкою максимального розміру кешу.
Процес роботи
Аудит джерела контенту й прийняття рішення про архітектуру (headless CMS, helpdesk API або власний бэкенд).
Проектування схеми даних з урахуванням ієрархії категорій й пошуку.
Реалізація: синхронізація, локальне зберігання, FTS, рендеринг контенту.
UI: навігація по категоріям, екран статті, пошук з підсвіткою збігів.
Аналітика й offline-режим.
Орієнтири по строкам
Базова база знань з remote API, пошуком й offline-режимом — 1–2 тижня. Інтеграція з Zendesk Help Center, кастомний Markdown-рендеринг й аналітика — до 3 тижнів.







