Skip to main content
The feedback service lets your users submit feature requests, vote on ideas, and open support tickets — all from within your app. Access it via 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

Only the default query — no status filter, 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

A String-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

If 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

Both SupportTicket and TicketMessage are Identifiable.

Cache control

Feature requests and tickets are cached separately.
Submitting, voting, commenting, and replying invalidate the relevant cache for you. 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.
There is also a string overload if you have already hex-encoded the token, plus accessors for reading and clearing it:
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.