iOS SDK changelog
All notable changes to the iOS SDK are documented here. This project follows Semantic Versioning.
Versioningโ
Fedo versions are X.Y.Z. The X.Y part is shared across every part of the
product โ Android SDK, iOS SDK, backend, and dashboard all move to the same
X.Y together, so the same X.Y means the same feature set everywhere. The
Z is per platform: each repo bumps its own patch number independently for
fixes and platform-specific work.
That is why the iOS SDK starts at 0.4.0 rather than 0.1.0 โ it is not the
third iOS release, it is the first one, shipping at feature parity with Android
0.4.x on the shared 0.4 line.
0.5.0 โ TBDโ
Threaded replies, with the same feature set as Android 0.5.0.
Breakingโ
FedoConfig(networkTimeout:logLevel:)removed (deprecated since 0.4.0). UseFedoConfig(networkTimeout:logHandler:)and filter onentry.levelin the closureFedoLogLevel.noneremoved. It was only the floor for that initializer; no log entry carries it
Addedโ
- Threaded replies โ Reply button on each comment and a "Replying to @name" strip whose โง cancels the reply and keeps the draft. Unlimited nesting; past the indent cap a reply shows "โณ Replying to @name"
- Paged comments โ comments load in pages as you scroll, ending with "You're all caught up". Each thread shows its first replies inline, the rest behind "Show n more replies"
- Deleted placeholders โ deleting a comment with replies leaves a "Comment deleted" placeholder and keeps the replies; a comment without replies is removed. The delete confirmation says which will happen
- Plan availability โ replying needs a Plus or Pro plan. On Starter there is no Reply button and no strip; existing replies stay visible
- Toasts โ confirm posting, deleting and copying, and explain failures ("This comment was deleted.", "This thread can't take more replies.", "Replies aren't available on this board."). Error toasts stay 4 s so they can be read. A failed reply keeps your text
Changedโ
- Header count ("1 COMMENT" / "N COMMENTS") includes replies and deleted placeholders
- A failed comment delete shows a toast instead of the "Couldn't delete comment" alert
0.4.0 โ 2026-10-17โ
Breakingโ
- Min iOS bumped 16 โ 17
- Public globals DEFAULT_NETWORK_TIMEOUT / DEFAULT_LOG_LEVEL removed. FedoConfig defaults unchanged
- FedoLogEntry initializer now internal. Hosts only receive entries
Addedโ
- FedoConfig.logHandler โ receive SDK logs as FedoLogEntry instead of OSLog
- Discard confirmation โ when leaving feedback editor with unsaved title/details
Changedโ
- FedoConfig.networkTimeout now total per-request limit (hidden 60 s cap removed)
- Character limits counted in Unicode scalars like backend
- SDK strings rendered verbatim, never looked up in host bundle (always English)
- Blank setUserEmail("") now accepted so hosts can clear email
- FedoFeedbackView must be on NavigationStack; NavigationView / fullScreenCover unsupported
Fixed โ user-visibleโ
- Comment timestamps โ "N days ago" up to 7 days (Android parity)
- Failed pull-to-refresh on detail shows error banner, keeps comments
- Feedback details screen โ Pull-to-refresh no longer cancelled mid-flight
- Loaded comments stay visible when background reload fails
- Feedbacks screen โ Pull-to-refresh failure with rows visible shows banner, not silent log
- Comments no longer flash spinner on every detail reload
- Stale refresh/comments errors cleared on successful load/post
- Comment count on list rows updates after post/delete
- Failed comment delete shows "Couldn't delete comment"
- Vote failure banner shows on detail screen, not hidden list
- Empty board shows board empty state + "Suggest a feature", not filter-empty
- Feedback posted before first successful load no longer dropped
- Delete only offered for own feedback in in_review/planned. Else "Can't Delete Feedback"
- Swipe-to-dismiss sheet with unsaved text asks to discard. Edit mode dismisses freely when unchanged
- Watermark bar matches white loading/error/thanks states on iOS
- Friendly "feedback isn't available" placeholder in Release when SDK not initialized
- .tint() now drives vote glyph, send button, comment highlight, avatar fallback
- Malformed feedback/comment item skipped + logged instead of failing whole list
- Unknown feedback status decodes as "Unknown", listed under Closed
Fixed โ session / identityโ
- Session โ app kill mid-write can't mix users' token+id
- Fresh anonymous session when API key changes
- Logout clears core token + cached feedback; drops previous user's in-flight responses
- Late token refresh after logout/user change no longer restores old user
- setUserID no longer replaced by queued anonymous-user creation
- User data no longer printed in logs
0.4.0-beta.3 โ 2026-10-11โ
Addedโ
- iOS 27 support โ the SDK now runs on iOS 27.
Fixedโ
- Internal fixes and stability improvements.
0.4.0-beta.2 โ 2026-10-06โ
Breaking Changesโ
FeedbacksViewrenamed toFedoFeedbackViewโ update your call sites toFedoFeedbackView().
Changedโ
- Status filter moved to a toolbar menu โ the filter tabs above the feedback list are replaced by a menu in the navigation bar showing the current status and its count (e.g. All ยท 63).
- Single initialization โ calling
Fedo.initializeagain now logs an error and does nothing, instead of re-initializing the SDK.
0.4.0-beta.1 โ first iOS releaseโ
Feature parity with the Android SDK 0.4.0.
Addedโ
- Feedback board โ
FeedbacksView(), a SwiftUI view with the full flow: list (All / Mine), details, threaded comments, voting, and the feedback editor. Pushes onto the enclosingNavigationStack. - Feedback sheet โ
.presentCreateFeedback(isPresented:)view modifier, a submission-only sheet (title + details) driven by aBoolbinding. - Setup โ
Fedo.initialize(apiKey:config:)withFedoConfig(networkTimeout,logLevel). - Identity โ
setUserID,setUserDisplayName,setUserEmail,setUserProperty(_:value:),logout. Anonymous users are created automatically and merged into the identified user. - Comment editing โ users can edit their own comments.
- User device properties โ device information collected and attached to the user. See User Management.
- Managed auth โ session tokens stored in the Keychain, refreshed automatically, request retried on expiry.
- Requires iOS 16+, Swift 6.