Offline-first
The durable upload queue, bounded by count, rebuilt rather than fatal, drained when the service is reachable.
A game that cannot upload must still be playable#
Uploads that could not be delivered are recorded in CloudSyncJournal, written atomically beside the saves:
await sync.QueueUploadAsync(slot); // remember to upload later
await sync.DrainQueueAsync(); // on the next session, when the service is reachable
var state = await sync.GetStateAsync(); // what is outstanding, per slot| Setting | Default | Meaning |
|---|---|---|
OfflineQueueEnabled | on | Whether undeliverable uploads are remembered |
MaximumQueuedUploads | 32 | Bounds the queue |
The journal is not a second source of truth#
It is a to-do list, not a copy of your saves. Losing it costs you an upload, not data: the save is already on disk, verified, and will be uploaded the next time a sync runs.
When MaximumQueuedUploads is reached, the oldest entry is dropped with a warning rather than letting the queue grow without limit. A warning is visible; a silently unbounded queue is not.
What "offline" means here#
ICloudTransport.LooksOnline is a hint. A transport that reports offline makes the framework queue instead of hammering a dead connection, and CloudRetryPolicy (4 attempts, 500 ms doubling to a 30 s ceiling, 10 % jitter) applies only to failures that are retryable — never to a refused precondition.
Next#
- Conflict resolution — what happens when a drain meets a divergence.
- Synchronisation — the sync call itself.
- Cloud architecture — where the journal sits.
Something wrong on this page? Every page here describes behaviour that is checked in the repository. If a page and the package disagree, the package wins.
Report a documentation problem · Frequently asked questions · Troubleshooting