如何从排行榜中获取用户的分数? - Swift

How to get the user's score from leaderboard? - Swift

我正在开发一款扰乱排行榜和最佳玩家得分的游戏。我希望当他进入应用程序时,它会与他在排行榜中保存的分数同步,但我没有找到任何东西 returns 对我来说很有价值。

我知道怎么定义:

public func setHighScore(score:Int) ->Void {
    if (self.localUser.isAuthenticated) {
        GKLeaderboard.submitScore(score, context: 0, player: self.localUser, leaderboardIDs: ["lbHighScore"], completionHandler: {error in} )
    }
}

我想要的是这样的:

public func getHighScore() ->Int{
    if (self.localUser.isAuthenticated) {
        return GKLeaderboardScore      // <- this is the score svaed on leaderboard as integer
    }
    return 0
}

经过一番努力,我终于找到了!1

让我们开始吧:

访问游戏中心的方式是异步的,即并行的。为了避免在接收和保存信息时出现错误和“延迟”,我建议保存在 UserDefault。 因此,当您获取数据时,它将保存在一个全局变量中。一旦你得到它,你不能只 return 值,因为它在 completionHandler 中,其中 return 是 Void.

要访问用户信息,您需要访问 GKLeaderboard.Entry class,其中有 .score 方法可以保存排行榜上显示的分数。但是访问此方法的唯一方法是使用标准函数,当用户通过参数传递时,这些函数将 return 此信息。

.

第一步:使用GKLeaderboard.loadLeaderboards函数访问排行榜。在这个函数中,作为参数:

  • 包含将要访问的排行榜 ID 的列表

除了completionHandler这将return两个实例:

  • 排行榜列表
  • 错误处理变量(Error
class func loadLeaderboards(
    IDs leaderboardIDs: [String]?, 
    completionHandler: @escaping ([GKLeaderboard]?, Error?) -> Void
)

.

第二步:访问排行榜数据。为此,我们将使用 GKLeaderboard.loadEntries 方法。在其中我们将作为参数传递:

  • 我们将访问的用户列表
  • 将在排行榜的哪个时期访问

除了completionHandler这将return两个实例:

  • 本地用户的.Entryclass(正是我想要的)
  • 包含 .Entry class 的列表(如果有多个用户
  • 错误处理变量(Error
func loadEntries(
    for players: [GKPlayer], 
    timeScope: GKLeaderboard.TimeScope, 
    completionHandler: @escaping (GKLeaderboard.Entry?,[GKLeaderboard.Entry]?, Error?) -> Void
)

.

因此,将这两个 classes 混合在一起,获取用户在给定排行榜中的分数的函数是:

// Function that takes information and saves it to UserDefault
func getHighScoreFromLeadboard() ->Void {
    // Check if the user is authenticated
    if (GKLocalPlayer.local.isAuthenticated) {
        // Load the leaderboards that will be accessed
        GKLeaderboard.loadLeaderboards(
                        IDs: ["idLeaderboard"]          // Leaderboards'id  that will be accessed
                        ) { leaderboards, _ in          // completionHandler 01: .loadLeaderboards 
                        
            // Access the first leaderboard
            leaderboards?[0].loadEntries(
                                for: [GKLocalPlayer.local], // User who will be accessed within the leaderboard, in this case the local user
                                timeScope: .allTime)        // Choose which period of the leaderboard you will access (all time, weekly, daily...)
                                { player, _, _ in           // completionHandler 02: .loadEntries
                                
                // Save on UserDefault
                UserDefaults.standard.set(player?.score, forKey: "score")
            }
        }
    }
}