为你的游戏添加循环排行榜
Bring Recurring Leaderboards to your game
2021年6月10日
一句话判断
循环排行榜(Recurring Leaderboards)让每周/每月自动重置的排行榜成为原生能力,终于不用自己搞定时任务清数据了 —— 但前提是你得接受苹果的排行榜 UI 设计。
这场 Session 讲了什么
这次更新给 Game Center 的排行榜系统引入了”循环”概念。以前的排行榜是永久的,分数只会被不断覆盖,排行榜永远被早期玩家霸占。现在你可以设置排行榜按固定周期重置:每天、每周或每月。每个周期结束后,新一轮排行榜自动开始,旧的排行榜成绩归档为历史记录。
这个功能在 App Store Connect 中配置,不需要写任何代码来管理周期。玩家可以看到当前周期的排名,也能查看历史周期的冠军。游戏内通过 GKLeaderboard API 获取数据,和普通排行榜的调用方式一致。
Session 还讲解了如何在 App Store Connect 中设置 recurring leaderboard:选择时间间隔、设置开始日期、配置玩家范围。一切配好之后,系统自动处理重置逻辑。
值得深挖的点
循环排行榜的时区处理是个隐性坑。重置时间基于太平洋时间(PT),如果你的玩家主要在亚太地区,“每周重置”可能发生在当地周五而非周一。目前没有办法自定义时区,需要在游戏内做文案说明。
历史排行榜的数据访问。每个完成的周期会生成一个 GKLeaderboardEntry 的归档,通过设置 leaderboard 的 playerScope 和 timeScope 可以检索特定周期的数据。这为”名人堂”或”历史冠军展示”功能提供了数据基础,但 API 没有直接按周期 ID 查询的能力,只能按时间范围筛选。
代码片段
加载当前周期的排行榜:
import GameKit
func loadWeeklyLeaderboard() {
let leaderboard = GKLeaderboard()
leaderboard.playerScope = .global
leaderboard.timeScope = .week // 获取本周循环排行榜
leaderboard.identifier = "weekly_score"
leaderboard.loadScores { scores, error in
guard let scores = scores else { return }
for score in scores {
print("玩家: \(score.player.alias), 分数: \(score.value)")
}
}
}
提交分数到循环排行榜:
import GameKit
func submitScore(_ score: Int) {
// 向指定循环排行榜提交分数
GKLeaderboard.submitScore(
score,
context: 0,
player: GKLocalPlayer.local,
leaderboardIDs: ["weekly_score"]
) { error in
if let error = error {
print("提交分数失败: \(error.localizedDescription)")
}
}
}
展示排行榜 UI:
import GameKit
func showLeaderboard() {
let viewController = GKGameCenterViewController(
leaderboardID: "weekly_score",
playerScope: .global,
timeScope: .week
)
viewController.gameCenterDelegate = self
present(viewController, animated: true)
}
最佳实践
- 为不同玩家规模选择不同的重置周期。日活 10 万以上的游戏适合每日重置,中小体量用每周重置更合理,否则每个周期只有几个人参与,排行榜缺乏竞争感。
- 循环排行榜适合”赛季”概念。配合成就系统和奖励机制,每个周期结束时给冠军发限定道具或称号,形成循环激励。
- 不要完全依赖系统 UI。
GKGameCenterViewController的样式你控制不了,如果游戏有强品牌调性,建议用GKLeaderboardAPI 拉数据后自绘 UI。
还有什么值得关注
- 循环排行榜最多支持同时激活 100 个,足够覆盖不同游戏模式。
- 经典(Classic)排行榜仍然可用,不会被废弃,两种类型可以共存。
- 排行榜数据在 App Store Connect 中有更详细的统计面板,能看到每个周期的参与人数趋势。