A player cleared 40 levels on iPhone, moved the game to iPad – progress reset. According to several mobile studios, losing progress on reinstall is among the top 3 reasons for negative reviews and player churn (about 28% of users abandon after such an incident). iCloud or Google Play Games Services solve this – but correct integration requires more than calling a single method. We offer professional integration of cloud saves and achievements with data integrity guarantees and robust architecture that won't fail across thousands of devices.
Hidden Production Pitfalls
Save Merge Conflicts
A user played offline on two devices. When both come online – you get two incompatible progress snapshots. Apple Game Center and Google Play Games don't resolve conflicts for you: they return both snapshots and wait for the client to pick the winner. According to statistics, about 30% of users face such conflicts when actively using multiple devices. Without a properly implemented conflict resolution with a clear UI ("Your progress on this device: 43 levels / In the cloud: 38 levels – which to keep?") the user will lose data – and this is a major source of negative reviews.
Snapshot Size and Write Frequency
Google Play Saved Games limits each snapshot to 3 MB, and total saves per account to 10 MB (default). If a save includes inventory data with thousands of entries – you need to serialize only the delta or optimize the format. Frequent autosaves (after every action) create a write queue that, under poor connectivity, builds up and causes GooglePlayGames.SavedGame.ISavedGameClient timeouts. In practice, this leads to intermittent sync and player frustration.
Apple iCloud Keychain vs CloudKit
For simple games, NSUbiquitousKeyValueStore is enough – it syncs up to 1 MB of key-value pairs. For complex progress you need CloudKit with CKContainer and CKRecord. Unity has no native CloudKit binding – integrating requires writing an Objective-C/Swift plugin or using a third-party solution like CloudSave from Unity Gaming Services. We've built such plugins for projects with over a million users – we can share that experience.
How to Properly Handle Save Conflicts
Algorithm: on load, compare updatedAt of local and cloud snapshots. If they differ, save both locally and show a selection screen. After selection, write the winner to cloud. For automatic resolution you can use last-write-wins, but it's risky with offline sessions – progress is lost while the player is disconnected. The best approach is manual resolution with a UI that gives the player control. According to our data, this reduces data loss complaints by 4x.
Why Size Limits Matter
Exceeding limits causes CloudSaveValidationException errors and blocks writes. Recommended: serialize only changed fields and compress data. In Unity Cloud Save, max document size is 1 MB – for larger volumes split into multiple documents. We use binary serialization with protobuf to save space – it reduces snapshot size by 40-60% compared to JSON.
Unity Gaming Services Cloud Save
For cross-platform projects (iOS + Android + PC) the optimal path is Unity Cloud Save from package com.unity.services.cloudsave. It stores JSON documents up to 1 MB, works via Unity Authentication (anonymous accounts or federated identity), and supports server-side validation via Cloud Code.
Key point: CloudSaveService.Instance.Data.Player.SaveAsync() is asynchronous, throws CloudSaveValidationException on quota exceed and CloudSaveException on network errors. Handling these exceptions in production is mandatory – without it, a lost connection during save breaks the local cache without diagnostic.
Architecture: local save (PlayerPrefs or a custom JSON file in Application.persistentDataPath) + cloud save as a mirror with a version tag. On load – compare updatedAt from cloud snapshot metadata with local timestamp. If mismatch – initiate conflict resolution flow.
Cloud Platform Comparison
| Platform | Max Size | Conflict Resolution | Platforms |
|---|---|---|---|
| iCloud (KVStore) | 1 MB | Last-write-wins | iOS, macOS |
| Google Play Games | 3 MB per snapshot | Manual (two snapshots) | Android, iOS |
| Unity Cloud Save | 1 MB per document | Manual (via code) | iOS, Android, PC, Web |
Common Integration Mistakes
- Ignoring CloudSaveException handling.
- No fallback to local save when cloud is unavailable.
- Using last-write-wins without a conflict UI.
- Exceeding snapshot size limits without compression.
- Not accounting for asynchronous save operations.
Achievements
Google Play Games Achievements and Apple Game Center Achievements – different APIs, different limits, different unlock logic. Proper abstraction: IAchievementService with methods Unlock(achievementId), Increment(achievementId, steps), Report(achievementId, percent) – platform-specific implementation hidden behind the interface.
Important: incremental achievements in Google Play require setting totalSteps in Play Console upfront. If steps change (e.g., achievement "kill 100 enemies" reworked to "kill 50") – you cannot change total steps without resetting all existing users' progress. This is an architectural decision to make before release. We help design achievements to avoid such issues.
For Game Center on iOS – handle GKLocalPlayer.localPlayer.authenticateHandler with branching for: authentication succeeded, user declined, Game Center unavailable. The last scenario is often ignored – but it occurs for users with restrictive Family Sharing settings. In our implementation we always provide a fallback to local save when cloud sync is unavailable.
What's Included
- Audit of current save and achievement architecture.
- Selection of optimal provider (iCloud, Google Play, Unity Cloud Save).
- Implementation of conflict resolution UI and exception handling.
- Testing on real devices with simulated network errors.
- Documentation for maintenance and extension.
Timelines
| Platform/Scenario | Duration |
|---|---|
| Google Play Games (achievements + saves), single platform | 4–7 days |
| Apple Game Center (achievements + iCloud KVStore) | 4–7 days |
| Unity Cloud Save (cross-platform) + conflict resolution UI | 1.5–2 weeks |
| Full integration iOS + Android + PC with custom backend | 3–5 weeks |
Pricing is determined individually after an audit of your game's architecture and sync requirements. Contact us for a consultation and preliminary estimate – we'll discuss your project and find the best solution. Get a guarantee of quality integration backed by our expertise.





