grantiva.feedback. FeedbackService is an actor, so every call needs await — including the non-throwing cache helpers.
Feedback endpoints authenticate with the attestation JWT. Call
validateAttestation() once before using them (in the Simulator, initialize the SDK with an API key — see Simulator Setup).Feature requests
List feature requests
sort: "votes", page: 1, perPage: 20 — is cached, for 2 minutes. Any other combination always hits the network. Force a refresh of the cached query:
Get a single feature request
Submit a feature request
Vote
Each user/device can vote once per feature request.Comments
FeatureRequest model
FeatureRequest is Identifiable, so it drops straight into a SwiftUI List or ForEach.
FeatureRequestStatus
AString-backed enum: .pending, .open, .planned, .inProgress (raw value in_progress), .shipped, .declined, .duplicate.
Vote and FeatureComment
Support tickets
Submit a ticket
List user’s tickets
grantiva.identify() has been called, returns tickets for that user across all devices. Otherwise returns device-only tickets.
Get ticket with messages
Reply to a ticket
SupportTicket model
TicketMessage model
SupportTicket and TicketMessage are Identifiable.
Cache control
Feature requests and tickets are cached separately.grantiva.identify(_:) and grantiva.clearIdentity() clear the whole cache.
Push notifications for replies
If you register the device’s APNs token with the SDK, it is attached to feature request submissions and comments. The backend then subscribes the device to that thread and pushes it when an admin replies.PushEnvironment.detected reads aps-environment out of the bundled provisioning profile, and falls back to the build configuration (DEBUG → .sandbox, release → .production) when no profile is present. Pass an explicit value if your build pipeline doesn’t fit those heuristics.
Registering a token is a no-op unless your organization has a linked push app. See Push notifications.