Game Center 新变化:小组件、好友系统与多人游戏增强
What's new in Game Center: Widgets, friends, and multiplayer improvements
2021年6月8日
一句话判断
Game Center 终于有了 WidgetKit 支持,但真正有杀伤力的是多人匹配 API 的简化 —— 以前要写一整屏的 matchmaker 代码,现在几行就能搞定实时和回合制匹配。
这场 Session 讲了什么
Apple 在 iOS 15 里给 Game Center 做了一次实用性升级。最大亮点是引入了 Game Center 小组件,玩家可以在主屏幕直接看到成就进度、排行榜排名和好友动态。这对游戏开发者来说是免费的留存利器 —— 不用玩家打开游戏就能维持存在感。
好友系统方面,新增了好友邀请的 UI 改进和多人游戏场景下的好友推荐。过去 Game Center 的好友功能基本形同虚设,这次苹果试图让它真正融入游戏社交流程。
多人游戏匹配(Multiplayer)的 API 得到了大幅简化。GKMatchmaker 的使用方式被重新设计,支持了实时匹配(Real-time)和回合制(Turn-based)两种模式的快速接入。此外,Game Center dashboard 在 App Store Connect 中也做了改版,开发者能更直观地查看玩家参与度数据。
值得深挖的点
小组件的实现细节值得关注。Game Center Widget 基于 WidgetKit,提供三种尺寸的模板:小部件显示单个成就或排行榜、中部件可以组合多个元素、大部件支持好友活动流。数据由系统缓存,不需要 app 后台常驻刷新。接入方式是通过 GKLeaderboard 和 GKAchievement 的现有 API,把数据喂给 WidgetKit 的 Timeline Provider 就行。
多人匹配 API 的 GKMatchmakerViewController 改版。新 API 把匹配请求、邀请好友、自动匹配三个流程合并到一个界面。以前你需要分别处理 GKMatchRequest 的 recipients、maxPlayers、playerGroup 等属性,现在直接用 GKMatchmakerViewController(matchRequest:) 一把梭,系统帮你处理邀请和等待逻辑。对于回合制游戏,GKTurnBasedMatch 的创建方式也更简洁了。
代码片段
创建排行榜小组件:
import WidgetKit
import GameKit
struct GameCenterWidgetProvider: TimelineProvider {
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
// 获取当前玩家的排行榜排名
let leaderboard = GKLeaderboard()
leaderboard.loadScores { scores, error in
let entry = SimpleEntry(date: Date(), rank: leaderboard.localPlayerScore?.rank ?? 0)
completion(Timeline(entries: [entry], policy: .atEnd))
}
}
}
简化的多人匹配请求:
import GameKit
func startMatchmaking() {
let request = GKMatchRequest()
request.minPlayers = 2
request.maxPlayers = 4
// 设置玩家分组,便于匹配同水平对手
request.playerGroup = getPlayerSkillTier()
let matchmakingVC = GKMatchmakerViewController(matchRequest: request)!
matchmakingVC.matchmakerDelegate = self
present(matchmakingVC, animated: true)
}
回合制匹配创建:
import GameKit
func createTurnBasedMatch() {
let request = GKMatchRequest()
request.minPlayers = 2
request.maxPlayers = 4
// 使用新的便捷方法创建回合制比赛
GKTurnBasedMatch.find(for: request) { matches, error in
if let match = matches?.first {
joinExistingMatch(match)
} else {
GKTurnBasedMatch.create(for: request) { newMatch, error in
guard let newMatch = newMatch else { return }
setupNewMatch(newMatch)
}
}
}
}
最佳实践
- 优先接入小组件。排行榜和成就组件能零成本提升留存,玩家看到自己排名变化就有动力打开游戏。建议用中等尺寸组件,同时展示排名和最近成就解锁。
- 好友邀请流程要内嵌到游戏内 UI,而不是依赖系统弹窗。在游戏大厅中直接展示
GKMatchmakerViewController,让玩家在匹配的同时拉好友入局,降低跳出率。 - 匹配分组(playerGroup)要合理设置。用 ELO 或类似评分系统给玩家分级,让
playerGroup对应技能等级,避免新手匹配到老玩家导致流失。
还有什么值得关注
- App Store Connect 中 Game Center dashboard 增加了玩家参与度的可视化报告,能看到成就解锁率和排行榜活跃度趋势。
GKLocalPlayer新增了loadFriends()方法,可以获取好友列表用于游戏内社交功能。- 回合制游戏支持了新的超时设置,可以自定义每回合的最大等待时间。