Game Center fetchSavedGames sometimes returns empty list of games, although it works correctly on the next tries

I have implemented the Game Center for authentication and saving player's game data. Both authentication and saving player's data works correctly all the time, but there is a problem with fetching and loading the data.

The game works like this:

  1. At the startup, I start the authentication
  2. After the player successfully logs in, I start loading the player's data by calling fetchSavedGames method
  3. If a game data exists for the player, I receive a list of SavedGame object containing the player's data

The problem is that after I uninstall the game and install it again, sometimes the SavedGame list is empty(step 3). But if I don't uninstall the game and reopen the game, this process works fine.

Here's the complete code of Game Center implementation:

class GameCenterHandler {
    public func signIn() {
        GKLocalPlayer.local.authenticateHandler = { viewController, error in
            if let viewController = viewController {
                viewController.present(viewController, animated: false)
                return
            }
            if error != nil {
                // Player could not be authenticated.
                // Disable Game Center in the game.
                return
            }
            
            // Auth successfull
            self.load(filename: "TestFileName")
        }
    }

    public func save(filename: String, data: String) {
        if GKLocalPlayer.local.isAuthenticated {
            GKLocalPlayer.local.saveGameData(Data(data.utf8), withName: filename) { savedGame, error in
                if savedGame != nil {
                    // Data saved successfully
                }
                if error != nil {
                    // Error in saving game data!
                }
            }
        } else {
            // Error in saving game data! User is not authenticated"
        }
    }

    public func load(filename: String) {
        if GKLocalPlayer.local.isAuthenticated {
            GKLocalPlayer.local.fetchSavedGames { games, error in
            
                if let game = games?.first(where: {$0.name == filename}){
                    game.loadData { data, error in
                        if data != nil {
                            // Data loaded successfully
                        }
                        if error != nil {
                            // Error in loading game data!
                        }
                    }
                } else {
                    // Error in loading game data! Filename not found
                }
            }
        } else {
            // Error in loading game data! User is not authenticated
        }
    }
}

I have also added Game Center and iCloud capabilities in xcode. Also in the iCloud section, I selected the iCloud Documents and added a container.

I found a simillar question here but it doesn't make things clearer.

I have the same issue. What I do is just call fetchSavedGames twice if the first call returns an empty list, and that seems to work pretty reliably.

Game Center fetchSavedGames sometimes returns empty list of games, although it works correctly on the next tries
 
 
Q