תארו לעצמכם: האפליקציה שלכם גדלה ל-50+ מסכים, התמיכה טובעת בשאלות חוזרות — 40% מהפניות עוסקות באותה בעיה. התיעוד מפוזר בין Google Docs, Confluence ו-Jira. לקוחות עוזבים כי הם לא מוצאים תשובה תוך 2 דקות. מאגר ידע (KB) פותר את זה, אבל הטמעתו היא יותר מסתם הוספת דף חיפוש. נסביר כיצד לתכנן ולהשיק מאגר ידע נייד שעובד במצב לא מקוון, מסתנכרן עם CMS, מספק חיפוש FTS5 מיידי ומספק אנליטיקה. עם ניסיון הנדסי של למעלה מ-10 שנים, אנו מבטיחים סנכרון יציב וחיפוש מהיר.
כיצד פועלת הארכיטקטורה של מאגר ידע נייד
מקורות תוכן וסנכרון
הגישה המגוונת ביותר היא CMS מותאם אישית או headless (Contentful, Strapi, Sanity) עם REST/GraphQL API. האפליקציה הניידת מורידה מאמרים בהפעלה הראשונה ובעדכונים, ומאחסנת אותם במסד נתונים מקומי. הסנכרון משתמש ב-updatedAt: בכל הפעלה, אנו מורידים רק מאמרים ששונו מאז חותמת הזמן האחרונה של הסנכרון. אם הרשת לא זמינה, השינויים מצטברים ומוחלים בחיבור הבא. קונפליקטים נפתרים לפי "הכותב האחרון מנצח". בדרך כלל 10–20 KB של נתונים לכל עדכון, מה שלוקח פחות משנייה בחיבור יציב.
// 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: // 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 ) . התשובה מכילה GET /api/v2/help_center/articles.json ב-HTML — אנו מציגים אותה באמצעות WebView עם CSS מותאם אישית התואם למערכת העיצוב של האפליקציה.
מדוע חיפוש FTS מקומי עדיף על פני צד שרת
חיפוש באלף מאמרים בשרת עבור כל בקשה מוסיף עגלות מיותרות ותלות ברשת. עבור אפליקציות ניידות, חיפוש טקסט מלא מקומי (FTS5) עדיף. הוא עובד באופן מיידי, במצב לא מקוון, ומעמיס רק על המכשיר.
| פלטפורמה | טכנולוגיית FTS | מנתח קירילית |
|---|---|---|
| Android | Room FTS4 | body באמצעות FTS5 |
| iOS | SQLite FTS5 (GRDB.swift) | unicode61 |
| חוצה-פלטפורמות | 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 ו-unicode61 עבור iOS. הן תומכות בטבלאות, בלוקי קוד עם הדגשת תחביר, ותמונות — מספיק לתיעוד טכני. WebView מספק HTML/CSS מלא אך איטי יותר לניווט. עבור Markdown בסיסי ב-iOS 15+, ניתן להשתמש ב-@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> } ללא תלות.
גישה לא מקוונת
מאגר הידע חייב לעבוד ללא אינטרנט. כל המאמרים מאוחסנים מקומית לאחר ההורדה הראשונה. תמונות נשמרות במטמון באמצעות Kingfisher (iOS) או Coil (Android) עם גודל מטמון מקסימלי של 200 MB. עדכוני נתונים מתרחשים רק כאשר הרשת זמינה.
אנליטיקה ומשוב
כפתור "האם זה עזר?" מספק משוב פשוט. אנו שולחים אירוע עם try db.create(virtualTable: "articles_fts", using: FTS5()) { t in t.column("title") t.column("body") t.tokenizer = .unicode61() } ו-Down ל-Firebase Analytics.
Analytics.logEvent("kb_article_feedback", parameters: [
"article_id": article.id,
"helpful": isHelpful ? "yes" : "no",
"time_spent_seconds": Int(Date().timeIntervalSince(openedAt))
])AttributedString נותן אות נוסף: אם משתמש קורא במשך 3 שניות ולוחץ על "לא עזר" — המאמר לא רלוונטי. אם הוא מבלה 5 דקות ולוחץ על "עזר" — התוכן עמוק ורלוונטי. אנליטיקה זו עוזרת לשפר את התיעוד.
מה כלול בעבודה?
- תיעוד: סכמת DB, תיאור API, הוראות עדכון תוכן.
- גישה: חשבונות בדיקה עבור CMS, App Store Connect / Google Play Console.
- קוד מקור: מאגר עם מודול מאגר הידע, כיסוי בדיקות 80%+.
- הדרכה: סדנה לצוות התמיכה על יצירת תוכן.
- תמיכה: שבועיים של סיוע חינם לאחר השחרור.
שלבי פיתוח ולוחות זמנים
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח | 1–2 ימים | מלאי תוכן, בחירת מקורות |
| עיצוב | 2–3 ימים | סכמת DB, API, ארכיטקטורת סנכרון |
| יישום | 4–8 ימים | קוד (Swift 5.9+ / Kotlin), FTS, אינטגרציית CMS |
| בדיקות | 2–3 ימים | אימות על 10+ מכשירים, כולל מצב לא מקוון |
| השקה | יום אחד | פרסום, הגדרת Firebase Crashlytics |
עלות הפיתוח מחושבת באופן אישי לאחר ביקורת. החיסכון בזמן עבור משתמשים שמוצאים מידע משתלם כבר בחודש הראשון. אנו מוכנים להעריך את הפרויקט שלכם — צרו קשר לייעוץ. הזמינו פיתוח מאגר ידע במפתח מלא וקבלו פתרון יציב שמשפר את חוויית המשתמש.







