Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.stringboot.com/llms.txt

Use this file to discover all available pages before exploring further.


The FAQ Provider delivers cached, searchable FAQs to your iOS app with automatic sync and offline support.

Initialization

Important: FAQProvider must be initialized separately from StringProvider.
FAQProvider.shared.initialize(
    cacheSize: 200,
    apiToken: "YOUR_API_TOKEN",
    baseURL: "https://api.stringboot.com"
)

// Setup auto-sync (recommended)
Task {
    let locale = StringProvider.shared.deviceLocale()

    // Preload FAQs from cache for instant access
    await FAQProvider.shared.preloadFromDatabase(lang: locale, maxFAQs: 100)

    // Sync latest FAQs from server in background
    await FAQProvider.shared.refreshFromNetwork(lang: locale)
}
The preload step ensures FAQs are available immediately when your app opens, while the background sync fetches the latest updates.

Usage

Fetching FAQs

Task {
    // Get FAQs for a specific tag
    let faqs = await FAQProvider.shared.getFAQs(tag: "payments")

    for faq in faqs {
        print("Q: \(faq.question)")
        print("A: \(faq.answer)")
    }
}

Filtering by SubTags

// Get FAQs with specific subtags
let faqs = await FAQProvider.shared.getFAQs(
    tag: "payments",
    subTags: ["refunds", "disputes"],
    lang: "en"
)

SwiftUI Integration

You can easily build an FAQ view in SwiftUI.
struct FAQListView: View {
    @State private var faqs: [FAQ] = []

    var body: some View {
        List(faqs) { faq in
            VStack(alignment: .leading) {
                Text(faq.question).font(.headline)
                Text(faq.answer).font(.body).foregroundColor(.secondary)
            }
        }
        .task {
            faqs = await FAQProvider.shared.getFAQs(tag: "general")
        }
    }
}

Manual Refresh

Manually refresh FAQs from the server (e.g., on pull-to-refresh):
Button("Refresh FAQs") {
    Task {
        let success = await FAQProvider.shared.refreshFromNetwork(lang: "en")
        if success {
            // FAQs updated successfully
            faqs = await FAQProvider.shared.getFAQs(tag: "payments")
        }
    }
}

Reactive Updates with Combine

Use Combine to automatically update your UI when FAQs change:
import Combine

class FAQViewModel: ObservableObject {
    @Published var faqs: [FAQ] = []
    private var cancellables = Set<AnyCancellable>()

    func subscribe(tag: String) {
        FAQProvider.shared.observeFAQs(tag: tag, lang: "en")
            .receive(on: DispatchQueue.main)
            .sink { [weak self] updatedFAQs in
                self?.faqs = updatedFAQs
            }
            .store(in: &cancellables)
    }
}