FastComments.com

Add Comments to Your iOS App


Αυτή είναι η επίσημη βιβλιοθήκη iOS για το FastComments.

Ενσωματώστε ζωντανά widgets σχολιασμού, συνομιλίας και αξιολόγησης στην iOS εφαρμογή σας.

Αποθετήριο

Προβολή στο GitHub


Χαρακτηριστικά Internal Link


  • Νηματοποιημένα δέντρα σχολίων με εμφωλευμένες απαντήσεις και σελιδοποίηση
  • Κοινωνική ροή με δημιουργία αναρτήσεων, αντιδράσεις και συνημμένα πολυμέσων
  • Λειτουργία ζωντανής συνομιλίας με αυτόματη κύλιση και διαχωριστικά ημερομηνιών
  • Ενημερώσεις σε πραγματικό χρόνο μέσω WebSocket (νέα σχόλια, ψήφοι, παρουσία)
  • Ενιαία Σύνδεση (Simple SSO για δοκιμές, Secure SSO για παραγωγή)
  • Πλούσια επεξεργασία κειμένου με έντονα, πλάγια, μορφοποίηση κώδικα και @mentions
  • Ψηφοφορία με ρυθμιζόμενα στυλ (επάνω/κάτω βέλη ή καρδιές)
  • Ενέργειες εποπτείας: αναφορά, καρφίτσωμα, κλείδωμα, αποκλεισμός
  • Ολοκληρωμένη θεματοποίηση με προεπιλογές και πλήρη προσαρμογή
  • Προσαρμοσμένα κουμπιά γραμμής εργαλείων για σχόλια και δημιουργία αναρτήσεων στη ροή
  • Μεταφορτώσεις εικόνων
  • Υποστήριξη περιοχής ΕΕ
  • Παρουσία χρήστη (ενδείκτες online/offline)
  • Φιλτράρισμα ροής με βάση ετικέτες
  • Υποστήριξη τοπικοποίησης

Απαιτήσεις Internal Link


  • iOS 16+ ή macOS 14+
  • Swift 5.9+
  • SwiftUI

Εγκατάσταση Internal Link


Προσθέστε το FastCommentsUI στο έργο σας χρησιμοποιώντας το Swift Package Manager.

Στο Xcode: File > Add Package Dependencies, στη συνέχεια εισάγετε το URL του αποθετηρίου.

Ή προσθέστε το στο Package.swift σας:

dependencies: [
    .package(url: "https://github.com/fastcomments/fastcomments-ios.git", from: "1.0.0")
]

Στη συνέχεια προσθέστε το προϊόν στον target σας:

.target(
    name: "YourApp",
    dependencies: [
        .product(name: "FastCommentsUI", package: "fastcomments-ios")
    ]
)

Εισάγετε και τα δύο modules όπου χρειάζεται:

import FastCommentsUI
import FastCommentsSwift

Γρήγορη εκκίνηση Internal Link


Η ελάχιστη ρύθμιση για εμφάνιση ενός widget σχολίων:

import SwiftUI
import FastCommentsUI

struct ContentView: View {
    @StateObject private var sdk = FastCommentsSDK(
        config: FastCommentsWidgetConfig(
            tenantId: "demo",
            urlId: "my-page-1",
            url: "https://example.com/page-1",
            pageTitle: "My Page"
        )
    )

    var body: some View {
        FastCommentsView(sdk: sdk)
            .task {
                try? await sdk.load()
            }
    }
}

Αντικαταστήστε το "demo" με το tenant ID του FastComments. Το urlId προσδιορίζει τη σελίδα ή το νήμα όπου αποθηκεύονται τα σχόλια.



Αυθεντικοποίηση (SSO) Internal Link

FastComments υποστηρίζει τρεις τρόπους αυθεντικοποίησης:

  1. Anonymous -- χωρίς SSO token; οι χρήστες λαμβάνουν ταυτότητες βάσει συνεδρίας
  2. Simple SSO -- token στην πλευρά του πελάτη για επιδείξεις και δοκιμές (μη ασφαλές)
  3. Secure SSO -- token υπογεγραμμένο από διακομιστή για παραγωγή

Simple SSO

Χρήσιμο για επιδείξεις και τοπικές δοκιμές. Οποιοσδήποτε μπορεί να μιμηθεί οποιονδήποτε χρήστη με το Simple SSO, οπότε μην το χρησιμοποιείτε σε παραγωγή.

import FastCommentsSwift

let userData = SimpleSSOUserData(
    username: "Jane Doe",
    email: "jane@example.com",
    avatar: "https://example.com/avatar.jpg"
)
let sso = FastCommentsSSO.createSimple(simpleSSOUserData: userData)
let token = try? sso.prepareToSend()

let config = FastCommentsWidgetConfig(
    tenantId: "YOUR_TENANT_ID",
    urlId: "my-page-1",
    sso: token
)
let sdk = FastCommentsSDK(config: config)

SimpleSSOUserData also supports optional fields:

  • id -- user ID (defaults to email if not set)
  • displayName -- separate display name
  • displayLabel -- custom label shown next to the name (e.g. "VIP")
  • websiteUrl -- link on the user's name
  • locale -- locale code
  • isProfileActivityPrivate -- hide profile activity (defaults to true)

Secure SSO

Σε παραγωγή, το backend σας δημιουργεί ένα υπογεγραμμένο SSO token χρησιμοποιώντας το μυστικό API σας. Η εφαρμογή iOS ανακτά αυτό το token από τον διακομιστή σας και το περνά στη διαμόρφωση.

On your backend (using the FastComments Swift SDK or any language):

let userData = SecureSSOUserData(
    id: "user-123",
    email: "user@example.com",
    username: "Display Name",
    avatar: "https://example.com/avatar.jpg"
)
let sso = try FastCommentsSSO.createSecure(apiKey: "YOUR_API_KEY", secureSSOUserData: userData)
let token = try sso.prepareToSend()
// Return this token to your iOS app via your API

In your iOS app:

struct MyView: View {
    @StateObject private var sdk = FastCommentsSDK(
        config: FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "my-page-1"
        )
    )
    @State private var isLoadingToken = true

    var body: some View {
        Group {
            if isLoadingToken {
                ProgressView("Loading...")
            } else {
                FastCommentsView(sdk: sdk)
            }
        }
        .task {
            // Ανάκτηση του token από το backend σας
            let token = try? await fetchSSOTokenFromYourBackend()
            // Δημιουργήστε μια νέα διαμόρφωση με το token, ή ορίστε το πριν τη φόρτωση
            isLoadingToken = false
            try? await sdk.load()
        }
    }
}

SecureSSOUserData supports additional fields:

  • optedInNotifications -- email notification opt-in
  • displayLabel -- custom label
  • displayName -- display name
  • websiteUrl -- website URL
  • groupIds -- group memberships
  • isAdmin -- admin privileges
  • isModerator -- moderator privileges
  • isProfileActivityPrivate -- profile privacy


Σχόλια με νήματα Internal Link

Βασική Χρήση

struct CommentsPage: View {
    @StateObject private var sdk = FastCommentsSDK(
        config: FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "article-42",
            url: "https://example.com/article/42",
            pageTitle: "Article Title"
        )
    )

    var body: some View {
        FastCommentsView(sdk: sdk)
            .task {
                try? await sdk.load()
            }
    }
}

Στυλ Ψηφοφορίας

Το προεπιλεγμένο στυλ ψήφου εμφανίζει βέλη πάνω/κάτω. Περάστε ._1 για ψήφους με σχήμα καρδιάς:

FastCommentsView(sdk: sdk, voteStyle: ._1)
Style Εμφάνιση
._0 Κουμπιά βελών πάνω/κάτω με καθαρό πλήθος
._1 Μονό κουμπί καρδιάς με πλήθος

Κλήσεις callback

Χρησιμοποιήστε callbacks τύπου modifier για να χειριστείτε τις αλληλεπιδράσεις του χρήστη:

FastCommentsView(sdk: sdk)
    .onCommentPosted { comment in
        print("New comment: \(comment.commentHTML)")
    }
    .onReplyClick { renderableComment in
        print("Replying to: \(renderableComment.comment.id)")
    }
    .onUserClick { context, userInfo, source in
        // το source είναι .name ή .avatar
        print("Tapped \(userInfo.displayName)")
    }

Εφαρμογή Θέματος

Περάστε ένα θέμα μέσω του περιβάλλοντος SwiftUI:

FastCommentsView(sdk: sdk)
    .fastCommentsTheme(myTheme)
    .task { try? await sdk.load() }

Ή ορίστε το απευθείας στο SDK:

sdk.theme = FastCommentsTheme.modern

Κατεύθυνση Ταξινόμησης

sdk.defaultSortDirection = .nf  // Νεότερα πρώτα (προεπιλογή)
sdk.defaultSortDirection = .of  // Παλαιότερα πρώτα
sdk.defaultSortDirection = .mr  // Πιο σχετικό


Ζωντανή συνομιλία Internal Link

LiveChatView παρέχει εμπειρία συνομιλίας σε πραγματικό χρόνο με αυτόματη κύλιση, διαχωριστές ημερομηνίας και συμπαγή διάταξη. Διαμορφώνει αυτόματα το SDK για ταξινόμηση από τον παλαιότερο προς τον νεότερο και άμεση ζωντανή εμφάνιση.

struct ChatView: View {
    @StateObject private var sdk: FastCommentsSDK = {
        let config = FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "chat-room-1",
            sso: ssoToken  // Συνιστάται SSO ώστε οι χρήστες να έχουν ονόματα
        )
        return FastCommentsSDK(config: config)
    }()

    var body: some View {
        LiveChatView(sdk: sdk)
            .onCommentPosted { comment in
                print("Sent: \(comment.commentHTML)")
            }
            .task {
                try? await sdk.load()
            }
    }
}

LiveChatView υποστηρίζει τα ακόλουθα callbacks:

  • .onCommentPosted -- ενεργοποιείται όταν ο χρήστης στέλνει ένα μήνυμα
  • .onCommentDeleted -- ενεργοποιείται όταν ένα μήνυμα διαγράφεται
  • .onUserClick -- ενεργοποιείται όταν πατηθεί το όνομα ή το avatar ενός χρήστη


Κοινωνική ροή Internal Link


Το σύστημα ροής είναι ένα ξεχωριστό SDK (FastCommentsFeedSDK) με το δικό του view.

Φόρτωση και Εμφάνιση της Ροής

struct FeedPage: View {
    @StateObject private var sdk: FastCommentsFeedSDK = {
        let config = FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "my-feed",
            sso: ssoToken
        )
        return FastCommentsFeedSDK(config: config)
    }()

    @State private var commentsPost: FeedPost?

    var body: some View {
        FastCommentsFeedView(sdk: sdk)
            .onPostSelected { post in
                commentsPost = post
            }
            .onCommentsRequested { post in
                commentsPost = post
            }
            .onSharePost { post in
                // Present share sheet
            }
            .onUserClick { context, userInfo, source in
                // Navigate to user profile
            }
            .onMediaClick { mediaItem, index in
                // Present full-screen image viewer
            }
            .task {
                try? await sdk.load()
            }
    }
}

Το view της ροής περιλαμβάνει αυτόματα λειτουργία pull-to-refresh και infinite scroll.

Δημιουργία Δημοσιεύσεων

Χρησιμοποιήστε το FeedPostCreateView για να εμφανίσετε μια φόρμα δημιουργίας δημοσίευσης:

@State private var showCreatePost = false

// In your view body:
.sheet(isPresented: $showCreatePost) {
    FeedPostCreateView(
        sdk: sdk,
        onPostCreated: { post in
            showCreatePost = false
            Task { try? await sdk.refresh() }
        },
        onCancelled: {
            showCreatePost = false
        }
    )
}

Αντίδραση σε Δημοσιεύσεις

Το SDK διαχειρίζεται τις αντιδράσεις με οπτιμιστικές ενημερώσεις:

try await sdk.reactPost(postId: post.id, reactionType: "l")

// Check reaction state
let hasLiked = sdk.hasUserReacted(postId: post.id, reactType: "l")
let likeCount = sdk.getLikeCount(postId: post.id)

Άνοιγμα σχολίων σε μια δημοσίευση

Χρησιμοποιήστε το CommentsSheet για να εμφανίσετε τα σχόλια μιας δημοσίευσης στη ροή. Δημιουργεί εσωτερικά ένα στιγμιότυπο FastCommentsSDK χρησιμοποιώντας τη διαμόρφωση (config) του feed SDK:

.sheet(item: $commentsPost) { post in
    CommentsSheet(post: post, feedSDK: sdk, onUserClick: { context, userInfo, source in
        // Handle user click
    })
}

Σημείωση: FeedPost πρέπει να συμμορφώνεται με Identifiable για .sheet(item:). Προσθέστε αυτήν την επέκταση:

extension FeedPost: @retroactive Identifiable {}

Φιλτράρισμα ροής με βάση τις ετικέτες

Υλοποιήστε το πρωτόκολλο TagSupplier για να φιλτράρετε τις δημοσιεύσεις της ροής κατά ετικέτες:

struct TeamTagSupplier: TagSupplier {
    func getTags(currentUser: UserSessionInfo?) -> [String]? {
        guard let user = currentUser else { return nil }
        return ["team:\(user.id ?? "")", "public"]
    }
}

sdk.tagSupplier = TeamTagSupplier()

Επιστρέψτε nil για μια παγκόσμια ροή χωρίς φίλτρο.

Αποθήκευση και Επαναφορά Κατάστασης της Ροής

Διατηρήστε την κατάσταση σελιδοποίησης (pagination) ανάμεσα σε συμβάντα κύκλου ζωής του view:

let state = sdk.savePaginationState()
// Later...
sdk.restorePaginationState(state)

Διαγραφή Δημοσιεύσεων

sdk.onPostDeleted = { postId in
    print("Post \(postId) was deleted")
}


Θεματοποίηση Internal Link

Προεπιλογές Θέματος

Διατίθενται τέσσερις ενσωματωμένες προεπιλογές:

// Προεπιλογές συστήματος
sdk.theme = FastCommentsTheme.default

// Κάρτες με σκιές και μεγάλες στρογγυλεμένες γωνίες
sdk.theme = FastCommentsTheme.modern

// Επίπεδο, χωρίς σκιές, μικρή ακτίνα γωνίας, χωρίς γραμμές νήματος
sdk.theme = FastCommentsTheme.minimal

// Ορισμός όλων των χρωμάτων ενεργειών σε ένα μόνο χρώμα μάρκας
sdk.theme = FastCommentsTheme.allPrimary(.indigo)

Στυλ Εμφάνισης Σχολίων

var theme = FastCommentsTheme()
theme.commentStyle = .flat    // Επίπεδη λίστα με διαχωριστικά (προεπιλεγμένο)
theme.commentStyle = .card    // Στρογγυλεμένες κάρτες με σκιές
theme.commentStyle = .bubble  // Στυλ φυσαλίδας συνομιλίας

Χρώματα

Όλες οι ιδιότητες χρωμάτων είναι προαιρετικές. Οι μη ορισμένες τιμές επανέρχονται στις λογικές προεπιλογές του συστήματος.

var theme = FastCommentsTheme()

// Χρώματα μάρκας
theme.primaryColor = .indigo
theme.primaryLightColor = .indigo.opacity(0.6)
theme.primaryDarkColor = Color(red: 0.2, green: 0.1, blue: 0.5)

// Φόντα
theme.commentBackgroundColor = Color(.secondarySystemGroupedBackground)
theme.containerBackgroundColor = Color(.systemGroupedBackground)

// Κουμπιά ενεργειών
theme.actionButtonColor = .indigo
theme.replyButtonColor = .indigo
theme.toggleRepliesButtonColor = .indigo.opacity(0.8)
theme.loadMoreButtonTextColor = .indigo

// Ψηφοφορίες
theme.voteActiveColor = .red
theme.voteCountColor = .primary
theme.voteCountZeroColor = .secondary
theme.voteDividerColor = Color(.separator)

// Σύνδεσμοι
theme.linkColor = .indigo
theme.linkColorPressed = .indigo.opacity(0.5)

// Διάλογοι
theme.dialogHeaderBackgroundColor = .indigo
theme.dialogHeaderTextColor = .white

// Γραμμή εισαγωγής
theme.inputBarBackgroundColor = Color(.systemBackground)
theme.inputBarBorderColor = Color(.separator)

// Άλλα
theme.onlineIndicatorColor = .green
theme.separatorColor = Color(.separator)
theme.badgeBackgroundColor = .gray.opacity(0.2)
theme.threadLineColor = .indigo.opacity(0.15)

Τυπογραφία

theme.commenterNameFont = .subheadline.weight(.bold)
theme.bodyFont = .body
theme.captionFont = .caption
theme.actionFont = .caption.weight(.medium)

Διάταξη και Διάκενα

theme.cornerRadius = .large       // .none, .small, .medium, .large
theme.commentSpacing = 4          // Μονάδες μεταξύ σειρών σχολίων
theme.nestingIndent = 20          // Μονάδες εσοχής ανά επίπεδο εμφώλευσης
theme.avatarSize = 36             // Διάμετρος avatar για κύρια σχόλια
theme.replyAvatarSize = 28        // Διάμετρος avatar για εμφωλευμένες απαντήσεις

Οπτικά Εφέ

theme.showShadows = true          // Διακριτικές σκιές στις κάρτες
theme.showThreadLine = true       // Κάθετη γραμμή που συνδέει εμφωλευμένες απαντήσεις
theme.animateVotes = true         // Ελαστική κινούμενη μεταβολή στις αλλαγές ψήφων

Εφαρμογή Θεμάτων

Δύο τρόποι:

// Μέσω περιβάλλοντος SwiftUI (συνιστάται για την ιεραρχία προβολών)
FastCommentsView(sdk: sdk)
    .fastCommentsTheme(theme)

// Άμεσα στο SDK
sdk.theme = theme

Προσαρμοσμένα κουμπιά γραμμής εργαλείων Internal Link


Κουμπιά γραμμής εργαλείων σχολίων

Υλοποιήστε το CustomToolbarButton πρωτόκολλο για να προσθέσετε κουμπιά στη γραμμή εργαλείων εισαγωγής σχολίων:

struct EmojiButton: CustomToolbarButton {
    let id = "emoji"
    let iconSystemName = "face.smiling"       // Όνομα SF Symbol
    let contentDescription = "Add Emoji"
    let badgeText: String? = nil              // Προαιρετικός αριθμός ένδειξης

    func onClick(text: Binding<String>) {
        text.wrappedValue += "\u{1F44D}"
    }

    // Προαιρετικά (προεπιλεγμένο true)
    func isEnabled() -> Bool { true }
    func isVisible() -> Bool { true }
}

Περνάτε τα προσαρμοσμένα κουμπιά κατά τη δημιουργία της προβολής:

FastCommentsView(
    sdk: sdk,
    customToolbarButtons: [EmojiButton(), CodeBlockButton()]
)

Ή προσθέστε τα παγκοσμίως στο SDK (ισχύει για όλες τις περιπτώσεις):

sdk.addGlobalCustomToolbarButton(EmojiButton())
sdk.removeGlobalCustomToolbarButton(id: "emoji")
sdk.clearGlobalCustomToolbarButtons()

Κουμπιά γραμμής εργαλείων ροής

Υλοποιήστε το FeedCustomToolbarButton για τη φόρμα δημιουργίας δημοσίευσης:

struct HashtagButton: FeedCustomToolbarButton {
    let id = "hashtag"
    let iconSystemName = "number"
    let contentDescription = "Add Hashtag"

    func onClick(content: Binding<String>) {
        content.wrappedValue += "#"
    }
}

Περάστε τα στην προβολή δημιουργίας:

FeedPostCreateView(
    sdk: sdk,
    customToolbarButtons: [HashtagButton()],
    onPostCreated: { _ in },
    onCancelled: { }
)

Ή ορίστε τα παγκοσμίως στο SDK της ροής:

sdk.globalFeedToolbarButtons = [HashtagButton()]


Διαχείριση Internal Link

Ενέργειες Διαθέσιμες σε Όλους τους Χρήστες

  • Επισήμανση/Αφαίρεση επισήμανσης -- αναφέρετε ένα σχόλιο για επανεξέταση
try await sdk.flagComment(commentId: commentId)
try await sdk.unflagComment(commentId: commentId)
  • Αποκλεισμός/Κατάργηση αποκλεισμού -- απόκρυψη όλων των σχολίων από έναν χρήστη (ανά θεατή)
try await sdk.blockUser(commentId: commentId)
try await sdk.unblockUser(commentId: commentId)

Ενέργειες Μόνο για Διαχειριστές

  • Καρφίτσωμα/Αποκαρφίτσωμα -- καρφώστε ένα σχόλιο στην κορυφή του νήματος
try await sdk.pinComment(commentId: commentId)
try await sdk.unpinComment(commentId: commentId)
  • Κλείδωμα/Ξεκλείδωμα -- αποτρέψτε νέες απαντήσεις σε ένα σχόλιο
try await sdk.lockComment(commentId: commentId)
try await sdk.unlockComment(commentId: commentId)

Όλες οι ενέργειες διαχείρισης είναι επίσης διαθέσιμες μέσω του μενού περιβάλλοντος σχολίου στο UI. Οι ενέργειες για διαχειριστές εμφανίζονται μόνο όταν ο τρέχων χρήστης είναι διαχειριστής του ιστότοπου (ορίζεται μέσω του SSO isAdmin flag ή μέσω ρυθμίσεων του πίνακα ελέγχου).



Ενημερώσεις σε πραγματικό χρόνο Internal Link

Μετά την κλήση του sdk.load(), το SDK συνδρομείται αυτόματα σε WebSocket γεγονότα για το ρυθμισμένο urlId. Τα ακόλουθα συμβάντα διαχειρίζονται:

  • Νέα σχόλια, επεξεργασίες και διαγραφές
  • Ψηφοφορίες (νέες και αφαιρεθείσες)
  • Αλλαγές κατάστασης καρφίτσας, κλειδώματος, αναφοράς και αποκλεισμού
  • Παρουσία χρήστη (είσοδος/έξοδος)
  • Άνοιγμα/κλείσιμο νήματος
  • Απονομές διακριτικών
  • Ενημερώσεις διαμόρφωσης εξυπηρετητή

Έλεγχος ζωντανής εμφάνισης

Κατά προεπιλογή, τα νέα σχόλια από άλλους χρήστες εμφανίζονται αμέσως:

sdk.showLiveRightAway = true   // Προεπιλογή: εμφανίζεται αμέσως

Ορίστε αυτό σε false για να συγκρατηθούν τα νέα σχόλια πίσω από ένα κουμπί «N νέα σχόλια», επιτρέποντας στον χρήστη να επιλέξει πότε θα τα εμφανίσει:

sdk.showLiveRightAway = false

Παρουσία χρήστη

Ενδείξεις σύνδεσης/αποσύνδεσης εμφανίζονται αυτόματα στα avatar των χρηστών όταν ο διακομιστής ενεργοποιήσει την παρακολούθηση παρουσίας. Δεν απαιτείται πρόσθετη ρύθμιση στην πλευρά του πελάτη.

Σελιδοποίηση Internal Link

Μέγεθος Σελίδας

// Σχόλια: προεπιλογή 30
sdk.pageSize = 50

// Ροή: προεπιλογή 10
feedSDK.pageSize = 20

Φόρτωση Περισσότερων Σχολίων

Η διεπαφή χρήστη εμφανίζει αυτόματα στοιχεία ελέγχου σελιδοποίησης. Μπορείτε επίσης να ενεργοποιήσετε τη σελιδοποίηση προγραμματιστικά:

// Φόρτωση επόμενης σελίδας
try await sdk.loadMore()

// Φόρτωση όλων των υπολοίπων (απενεργοποιείται εάν >2000 σχόλια για λόγους απόδοσης)
try await sdk.loadAll()

// Έλεγχος κατάστασης
sdk.hasMore            // Εάν υπάρχουν περισσότερες σελίδες
sdk.shouldShowLoadAll()
sdk.getCountRemainingToShow()

Σελιδοποίηση Παιδικών Σχολίων

Οι εμφωλευμένες απαντήσεις φορτώνονται κατά απαίτηση. Όταν ένας χρήστης επεκτείνει ένα νήμα, φορτώνονται τα πρώτα 5 παιδικά σχόλια. Εμφανίζεται ένα στοιχείο ελέγχου "load more replies" εάν υπάρχουν κι άλλες. Αυτό γίνεται αυτόματα από το UI.



Κατάσταση και παρατηρησιμότητα Internal Link


Both FastCommentsSDK and FastCommentsFeedSDK are ObservableObject classes with @Published properties. You can observe these in your SwiftUI views for reactive UI updates.

FastCommentsSDK Published Properties

Property Type Description
commentCountOnServer Int Συνολικός αριθμός σχολίων στον διακομιστή
newRootCommentCount Int Προσωρινά αποθηκευμένα νέα σχόλια (όταν το showLiveRightAway είναι false)
currentUser UserSessionInfo? Τρέχων αυθεντικοποιημένος χρήστης
isSiteAdmin Bool Εάν ο τρέχων χρήστης είναι διαχειριστής του ιστότοπου
isClosed Bool Εάν το νήμα σχολίων είναι κλειστό
hasBillingIssue Bool Εάν υπάρχει πρόβλημα με τη χρέωση
isLoading Bool Εάν εκτελείται αίτημα δικτύου
hasMore Bool Εάν υπάρχουν περισσότερες σελίδες σχολίων
blockingErrorMessage String? Σφάλμα που εμποδίζει τη λειτουργία του UI
warningMessage String? Μήνυμα προειδοποίησης που δεν εμποδίζει τη λειτουργία
isDemo Bool Εάν εκτελείται σε λειτουργία επίδειξης
commentsVisible Bool Εναλλαγή για την ορατότητα των σχολίων
toolbarEnabled Bool Εάν η γραμμή εργαλείων μορφοποίησης εμφανίζεται

FastCommentsFeedSDK Published Properties

Property Type Description
feedPosts [FeedPost] Τρέχουσες φορτωμένες αναρτήσεις ροής
hasMore Bool Εάν υπάρχουν περισσότερες σελίδες
currentUser UserSessionInfo? Τρέχων αυθεντικοποιημένος χρήστης
blockingErrorMessage String? Σφάλμα που εμποδίζει τη λειτουργία
isLoading Bool Εάν εκτελείται αίτημα δικτύου
newPostsCount Int Αριθμός νέων αναρτήσεων από την τελευταία φόρτωση

Comment Tree

The comment tree is accessible via sdk.commentsTree:

// Επίπεδη λίστα ορατών κόμβων για απόδοση
sdk.commentsTree.visibleNodes

// Αναζήτηση σχολίου με βάση το αναγνωριστικό
sdk.commentsTree.commentsById["comment-id"]

Περιοχή ΕΕ Internal Link

Για να χρησιμοποιήσετε το κέντρο δεδομένων της ΕΕ, ορίστε το πεδίο region στη ρύθμισή σας:

let config = FastCommentsWidgetConfig(
    tenantId: "YOUR_TENANT_ID",
    urlId: "my-page",
    region: "eu"
)

Αυτό δρομολογεί όλα τα αιτήματα API και τις συνδέσεις WebSocket στο eu.fastcomments.com.



Καθαρισμός Internal Link


Όταν τελειώσετε με ένα instance του SDK (π.χ., όταν η προβολή απορρίπτεται), καλέστε τη cleanup() για να κλείσετε τη σύνδεση WebSocket και να ακυρώσετε εργασίες στο παρασκήνιο:

sdk.cleanup()

Για προβολές που διαχειρίζεται το SwiftUI με @StateObject, αυτό συνήθως καλείται στο .onDisappear ή όταν η προβολή αποδεσμεύεται.


Μεταφορτώσεις εικόνων Internal Link

Σχόλια

let imageUrl = try await sdk.uploadImage(imageData: jpegData, filename: "photo.jpg")

Επιστρέφει τη συμβολοσειρά URL της ανεβασμένης εικόνας.

Αναρτήσεις Feed

let mediaItem = try await feedSDK.uploadImage(imageData: jpegData, filename: "photo.jpg")

// Ανέβασμα πολλαπλών εικόνων παράλληλα
let mediaItems = try await feedSDK.uploadImages(images: [
    (jpegData1, "photo1.jpg"),
    (jpegData2, "photo2.jpg")
])

Αναφορές χρηστών Internal Link


Αναζήτηση χρηστών για υποστήριξη της αυτόματης συμπλήρωσης @mention:

let results = try await sdk.searchUsers(query: "jan")
// Επιστρέφει [UserSearchResult] με userId, username, avatar, κ.λπ.

Το ενσωματωμένο CommentInputBar αναλαμβάνει την αυτόματη συμπλήρωση για @mention.



Επεξεργασία και διαγραφή σχολίων Internal Link

Επεξεργασία

try await sdk.editComment(commentId: commentId, newText: "Updated text")

Ο διακομιστής επανα-αποδίδει το HTML. Το τοπικό σχόλιο ενημερώνεται αυτόματα.

Διαγραφή

try await sdk.deleteComment(commentId: commentId)

Η διαγραφή ενός σχολίου αφαιρεί επίσης τους απογόνους του από το τοπικό δέντρο.

Και οι δύο ενέργειες είναι διαθέσιμες μέσω του μενού περιβάλλοντος σχολίου στο UI όταν ο τρέχων χρήστης είναι ο συγγραφέας του σχολίου (ή διαχειριστής του ιστότοπου).

Διαχείριση σφαλμάτων Internal Link

Οι μέθοδοι του SDK ρίχνουν FastCommentsError, το οποίο συμμορφώνεται με το LocalizedError:

do {
    try await sdk.load()
} catch let error as FastCommentsError {
    print(error.translatedError ?? error.reason ?? "Unknown error")
} catch {
    print(error.localizedDescription)
}

FastCommentsError properties:

  • code -- κωδικός σφάλματος από το API
  • reason -- περιγραφή σφάλματος στα Αγγλικά
  • translatedError -- τοπικοποιημένο μήνυμα σφάλματος που παρέχεται από τον διακομιστή

Τα σφάλματα αποκλεισμού προβάλλονται επίσης αυτόματα μέσω του sdk.blockingErrorMessage, το οποίο οι ενσωματωμένες προβολές εμφανίζουν στον χρήστη.



Τοπικοποίηση Internal Link

Καταχωρήστε έναν κωδικό locale στο config για να τοπικοποιήσετε τις συμβολοσειρές που παρέχει ο διακομιστής:

let config = FastCommentsWidgetConfig(
    tenantId: "YOUR_TENANT_ID",
    urlId: "my-page",
    locale: "fr_fr"
)

Οι συμβολοσειρές διεπαφής χρήστη στην πλευρά του πελάτη χρησιμοποιούν τοπικοποίηση βασισμένη σε iOS bundles.

Παράδειγμα εφαρμογής Internal Link


Το αποθετήριο περιλαμβάνει μια πλήρη εφαρμογή παραδείγματος στο ExampleApp/ με επιδείξεις των:

  • Σχόλια σε νήματα με SSO και προσαρμοσμένα θέματα
  • Κοινωνική ροή με δημιουργία αναρτήσεων και φιλτράρισμα με ετικέτες
  • Ζωντανή συνομιλία
  • Απλές και ασφαλείς ροές SSO
  • Προσαρμοσμένα κουμπιά στη γραμμή εργαλείων (σχόλια και ροή)


Χρειάζεστε βοήθεια;

Εάν αντιμετωπίσετε προβλήματα ή έχετε ερωτήσεις σχετικά με τη βιβλιοθήκη iOS, παρακαλούμε:

Συνεισφορά

Οι συνεισφορές είναι ευπρόσδεκτες! Παρακαλούμε επισκεφθείτε το αποθετήριο GitHub για οδηγίες σχετικά με τη συνεισφορά.