Skip to main content

Cloud Saves for Android and iOS Games: A Practical Guide

Design reliable mobile game cloud saves with versioned data, account linking, conflict resolution, offline queues and tested recovery procedures.

R
Written by Reiko

Level 18 on a phone and level 12 on a tablet indicate two different versions of the same progress. The problem may be a delayed upload, the wrong account or a conflict between two valid saves. A reliable cloud-save system needs to distinguish these cases before deciding which data to load.

Cloud storage transports and preserves data; the game defines what that data means. Google Play Games Services Saved Games, Apple platform services and a custom backend have different integration and identity models. Supporting Android and iOS does not automatically create a shared cross-platform account.

Define the account and the source of truth

Use a stable internal player identifier for backend-owned progress. Associate external sign-in methods with that identifier through a verified linking flow. A display name or email string is unsuitable as the sole key because names can change and identity claims need validation.

Separate the ownership of different data. A local puzzle checkpoint can be client-authored; a purchased item or competitive reward should follow the server's verified records. Uploading a save file must not let a player replace the server's purchase ledger or invent an inventory balance.

Google's cloud-save documentation explicitly calls for conflict handling and warns against silently overwriting substantial progress when linking a guest account. Cross-platform progression needs a deliberate mapping between game identities, plus a policy for purchases that may have platform-specific restrictions.

What a save record should contain

Field

Purpose

Implementation detail

player_id

Identifies the owner

Authorise access on the server

schema_version

Identifies the data structure

Use it to select a migration path

revision

Detects concurrent updates

Compare against the current server revision

operation_id

Recognises a repeated write

Return the recorded result for a retry

payload

Contains the actual progress

Validate structure, size and allowed values

server_updated_at

Records server acceptance time

Use for history and support, not as the only merge rule

The names above describe a proposed custom-backend design, not mandatory fields of a platform API. Keep the save schema separate from the current screen layout so an interface redesign does not require rewriting every player's data.

At the time of checking, Google documents a 3 MB limit for each Saved Games binary file and an 800 KB cover-image limit. Those are service-specific limits. Leave room for future fields, measure the serialized payload and avoid putting screenshots or complete downloaded levels inside the progress file.

A concrete conflict: revision 42 on two devices

Suppose both devices download revision 42. Device A completes a level and successfully writes revision 43. Device B has been offline; it still believes revision 42 is current. If B uploads its whole file without a precondition, it may erase A's new progress.

With optimistic concurrency, B submits its expected base revision of 42. The backend sees that revision 43 already exists and rejects the overwrite with a defined conflict response. B then retrieves the current record and applies the game's resolution policy. The revision check and write must be atomic, or two requests could both pass the check.

Do not add two inventory balances to resolve the conflict. If both saves started with 100 coins, A spent 20 and B spent 30, adding the resulting balances of 80 and 70 creates 150 coins. Choosing the maximum also loses a spending action. Valuable currency needs a validated transaction history and an explicit policy for offline spending.

Choose a merge rule for each kind of progress

A set of permanently completed levels may be merged by union if completion is monotonic under the game's rules. Preferences such as music volume can use a simpler last-write policy. A branching story may require the player to choose one version because two narrative decisions cannot both be active.

Show meaningful differences when asking for a choice: chapter, completed levels, play time and an identifiable device label. Device timestamps can be wrong, so avoid treating the latest local clock value as proof of the newest progress. Preserve a recoverable copy before an irreversible replacement.

Handle offline saves without claiming they are synced

Write progress locally at durable checkpoints and keep pending cloud operations in a persistent queue. The interface should distinguish “saved on this device” from “synced to your account.” A successful local write is not evidence that another device can retrieve it.

Retry transient failures using a bounded backoff strategy with jitter, adjusted to the game's needs. Reuse the same operation identifier for the same logical write. A request may have succeeded even when its response was lost, so retries must not create another reward or duplicate record.

Guest linking deserves its own screen. If the cloud account already has progress, explain the alternatives before replacing either version. After sign-out, clear account-scoped caches and prevent a queued write from the previous profile being sent under the next profile's identity.

Protect the local file from interrupted writes

Writing directly over the only valid save can leave a truncated file if the process stops midway. A safer pattern is to write a new temporary file, validate its structure, complete the required flush operations and replace the previous file using the platform's supported atomic mechanism. The exact durability guarantees depend on the filesystem and storage API, so test forced termination at each stage.

Keep a bounded previous version where the storage design permits. A checksum can help detect accidental corruption; it does not establish authenticity when a player can edit both the payload and its checksum. Server-owned rewards still need server validation.

Do not wait until the application is closing to save everything. Mobile processes may be terminated without a final callback that completes lengthy work. Persist at meaningful checkpoints, such as a completed level, and keep network upload separate from the local commit. After relaunch, the queue should know what remains unsynced without requiring the old process to finish.

Make updates compatible with old saves

A schema migration changes the representation of progress. For example, version 2 may store one difficulty value while version 3 stores separate combat and puzzle settings. Define the conversion, validate the output and keep a copy that allows diagnosis if migration fails.

Test an older client against a newer backend as well as a newer client against old data. A player can keep an earlier app build installed while the server changes. If an old client cannot safely interpret a new save, require an update with a clear explanation rather than letting it overwrite unfamiliar fields.

Calculate the request load before choosing a save frequency

Consider an illustrative design with 10,000 simultaneous players, each sending one save every 60 seconds. That produces approximately 166.7 writes per second before retries and bursts. At 20,000 bytes per payload, the payload traffic alone is about 3.33 MB per second, excluding protocol overhead and responses.

This is a capacity calculation, not a recommended autosave interval. Important actions may need immediate persistence; frequent changes may be grouped. Randomise periodic work so every device does not upload at the same second. Include retry traffic and session-end bursts in load tests.

Prove that recovery works

  • Interrupt the app during a local write and load the last valid checkpoint.

  • Lose the response after a server commit and retry the same operation.

  • Edit the same base revision on two devices and resolve the conflict.

  • Link a guest to an account that already contains progress.

  • Restore a backup into an isolated environment and verify the correct player owns it.

Define a recovery point objective, meaning acceptable data loss, and a recovery time objective, meaning acceptable restoration time. Set both from product needs and operational evidence. A backup schedule does not prove either objective until a restore exercise measures the result.

Did this answer your question?