提交GKLeaderboard分数后如何获取排名及榜首分数?解决API废弃问题
关于GKLeaderboard的两个问题解答
1. GKLeaderboard是否仅存储玩家的最高分?
你的理解完全正确。Game Center的排行榜机制默认只保留每个玩家的最高分:
- 提交新分数时,系统会自动对比该玩家在对应排行榜中的现有最高分
- 只有新分数高于已存储的分数时,才会更新玩家记录并重新计算排名
- 低于现有最高分的新分数不会被保存,也不会改变玩家当前的排名(比如你提到的300分排第2,提交200分后,玩家排名依然是第2,200分不会被存储)
2. 获取指定排行榜的榜首分数(iOS 14+ 非废弃方案)
iOS 14及以后旧的scores属性已被废弃,需要使用新的异步API实现。以下是简洁的写法(基于Swift async/await语法):
实现代码
func fetchTopScore(for leaderboardID: String) async throws -> Int? { let leaderboard = GKLeaderboard(leaderboardIDs: [leaderboardID]) // 仅请求榜首1条记录 leaderboard.range = NSRange(location: 1, length: 1) let scores = try await leaderboard.loadScores() return scores?.first?.value } // 使用示例 Task { do { if let topScore = try await fetchTopScore(for: "Easy") { print("榜首分数:\(topScore)") // 可在此计算与玩家当前分数的差值 // let gap = topScore - userCurrentScore } } catch { print("获取榜首分数失败:\(error.localizedDescription)") } }
说明
- 通过
range参数限定只加载榜首1条数据,避免不必要的网络请求 loadScores()的async/await版本适配iOS 15+,若需兼容iOS 14可改用闭包回调形式- 若排行榜无数据,返回值为
nil,需做好空值处理
如果需要同时获取玩家自身的排名与分数,可通过playerScope参数指定.global或.friendsOnly,结合loadScores()拿到玩家当前记录后再与榜首分数计算差值。
内容的提问来源于stack exchange,提问作者Nathanael Tse
相关产品推荐
相关产品推荐

