The lifecycle at a glance
Three calls drive everything above:initialize once at launch, identify when
you know who the user is, and reset when they leave. The SDK owns the rest:
the device key, the local cache, and the realtime connection (Centrifugo by
default, falling back to SSE).
The mental model
The SDK is a thin client that owns four things: a device identity, a local cache, a realtime connection, and (optionally) a set of prebuilt screens. Your app never holds SDK state. You make a few calls in, and reads come back to you as replay-lastAsyncStreams (or closure subscriptions for UIKit). See
Architecture for the full picture.
1. The first launch
ClarioDesk.initialize() runs once at app start — synchronous and
fire-and-forget, so it drops into App.init or your AppDelegate with no
await:
2. Identify your user
Once your own auth knows who the user is, hand that down to ClarioDesk:identify is pure metadata. It does not grant access (the device key already
did that), so it is safe to call often, and it is idempotent: the same values
twice is a no-op.
When to call it
The right moment depends on the user’s state when ClarioDesk first runs. Each row below is a real case worth handling:The existing-user trap
This is the case most integrations get wrong, so it is worth slowing down on. If you only callidentify from your login handler, you label the users who sign
in after you ship and nobody else. Everyone who was already logged in when you
released the update never visits your login screen again, so they stay unlabeled
devices, and your agents see “Unverified device” instead of an email.
The fix is to identify from your persisted session on every launch, not from the
login event:
Skipping
identify entirely is fine for anonymous feedback. Tickets still work;
they just arrive without an email. When the user signs in later, call identify
then and the existing device, and its ticket history, carry forward.3. Live by default
Afterinitialize (and identify, if you have a user), reads are live. You do
not poll. Iterate a stream and the SDK primes it from cache, then pushes updates
as the agent replies.
failed == true means render tap-to-retry via
retryMessage). A send made while offline waits in a durable Keychain outbox
and flushes on reconnect. Watch the realtime link with ClarioDesk.connection
to show an offline banner. See Realtime for the
connection states.
4. Logout and user switching
When the user signs out, callreset before clearing your own session:
reset revokes the device server-side (best effort), wipes the hardware key,
and clears local caches. The next initialize registers a brand-new device. For
a user switch on the same install (A to B without a restart), do the same and
then identify B:
5. Relaunches and reinstalls
The takeaway: identity is anchored to the hardware key on a single install. It is
not a cloud account that follows the user between devices, so always re-
identify
on a fresh device to reattach their email and traits.
Your integration checklist
For an app already in production:-
initializeruns at app start, before any support screen. -
identifyruns on launch from your persisted session, not only on login. -
resetruns on logout and on user switch. - Tickets render from
ClarioDesk.tickets/ClarioDesk.messages(ticketId:)(or the prebuilt UI). - Optional:
ClarioDesk.connectiondrives an offline indicator.
Where to go next
Lifecycle event reference
The same four events as a tight code reference.
API reference
Every method, stream, and type.
Authentication
Why the device key replaces tokens.
Push (no Firebase)
APNs-direct push: one line in your AppDelegate.