Highlight
iOS 15 为 Game Center 带来 Friends API(隐私友好的好友列表访问)、Fast Start 多人游戏模式(达到最少人数即可开局,后续玩家动态加入),以及两个系统级小组件(Friends Are Playing 和 Continue Playing),全部零代码接入。
核心内容
Game Center 是 Apple 的游戏社交网络,玩家用一个 ID 就能参与排行榜、追踪成就、玩多人游戏。但长期以来,开发者想利用好友关系做社交功能,基本无从下手。iOS 15 从发现、社交、多人游戏三个维度做了实质性改进。
游戏发现:自动曝光
(01:04)
Apple 把 Game Center 深度整合进 App Store。在 Games 和 Arcade 标签页,玩家能看到好友正在玩的游戏。进入某个游戏的产品页,还能看到具体哪些好友在玩,点击好友头像能查看对方的 Game Center 资料,直接下载对方玩过的游戏。
这些功能对所有支持 Game Center 的游戏自动生效,不需要额外代码。
Game Center 小组件
(02:37)
iOS 15 新增两个 Game Center 小组件:
- Friends Are Playing:显示好友最近在玩的游戏,点击直接跳转
- Continue Playing:显示玩家最近玩过且支持 Game Center 的游戏,方便快速回到游戏
两个小组件都支持 iPad 的大尺寸格式。同样零代码接入,只要游戏支持 Game Center 就会自动出现在小组件中。
好友系统改进
(03:26)
好友请求继续通过 Messages 发送,但新增了 Friend Requests inbox,统一管理所有待处理请求。macOS 也支持收发好友请求。
Friends API
(03:55)
这是今年最重要的开发者-facing 功能。通过 Friends API,你可以在获得玩家授权后访问其 Game Center 好友列表。列表只包含双向好友(即对方也授权了你的游戏),Apple 会自动跨设备同步授权状态。
在游戏内发送好友请求:
let error = GKLocalPlayer.local
.presentFriendRequestCreatorFromViewController(using: navigationController)
if error != nil {
print("Fail to send friend request with error: \(error!.localizedDescription).")
}
关键点:
- 调用后弹出 Messages 好友请求界面
- 用户完成后自动 dismiss,返回可选的 error
- 建议用 SF Symbols 作为按钮图标
检查好友列表授权状态:
GKLocalPlayer.local.loadFriendsAuthorizationStatus { (authorizationStatus, error) in
guard error == nil else {
print("Fail to load friends list with error: \(error!.localizedDescription).")
return
}
switch authorizationStatus {
case .notDetermined:
// 玩家尚未做出选择
case .denied:
// 玩家拒绝了访问请求
case .restricted:
// 应该删除已收集的玩家数据
case .authorized:
// 玩家已授权,可以加载好友列表
@unknown default:
break
}
}
关键点:
- 需要在 Info.plist 中添加
NSGKFriendListUsageDescription .restricted状态下必须删除已收集的数据- 建议在
applicationDidFinishLaunching时检查状态,延迟到合适时机再弹授权提示
加载好友并在进度地图上显示:
func loadFriendsOnProgressionMap() async {
do {
let friends = try await GKLocalPlayer.local.loadFriends()
if friends.count > 0 {
let leaderboards = try await GKLeaderboard.loadLeaderboards(IDs: ["progress"])
if let leaderboard = leaderboards.first {
let entries = try await leaderboard.loadEntries(for: friends, timeScope: .allTime)
for entry in entries.1 {
let avatar = try await entry.player.loadPhoto(for: .normal)
let name = entry.player.displayName
let friendLevel = entry.score
// 在进度地图上显示好友位置
}
}
}
} catch {
print("Error: \(error.localizedDescription).")
}
}
关键点:
loadFriends()返回[GKPlayer],只包含已双向授权的好友- 结合
GKLeaderboard.loadEntries(for:timeScope:)获取好友在特定排行榜上的分数 - 用 Swift async/await 简化异步调用链
多人游戏匹配改进
(05:26)
匹配界面新增 Suggestions Shelf,智能推荐可能想邀请的人:
- 附近的玩家(Nearby Players)
- 最近一起玩过的 Game Center 群组
- 经常聊天的 Messages 群组
Game Center 群组是今年新概念:最近一起玩过实时或回合制对战的玩家会自动组成一个群组,一键邀请整组人。
邀请发送后,可以在大厅里动态增删玩家。还没接受的玩家可以点击 X 移除,已接受后离开的玩家也可以被移除。
Fast Start 模式
(17:44)
Fast Start 是今年多人游戏的核心新 API。开启后,达到最少人数即可立即开局,其他玩家在后台继续连接,连上后动态加入游戏。
开启 Fast Start:
let request = GKMatchRequest()
request.minPlayers = 2
request.maxPlayers = 6
request.playerGroup = 2021
let vc = GKMatchmakerViewController(matchRequest: request)
vc.canStartWithMinimumPlayers = true
vc.delegate = self
self.present(vc, animated: true, completion: nil)
关键点:
canStartWithMinimumPlayers = true开启 Fast StartminPlayers是游戏能进行的最少人数- 达到 minPlayers 后,主持者可以选择立即开始或继续等待
处理后续加入的玩家:
func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFind match: GKMatch) {
viewController.dismiss(animated: true, completion: nil)
let gameVC = GameSceneViewController()
gameVC.match = match
match.delegate = gameVC
self.present(gameVC, animated: true, completion: nil)
}
func match(_ match: GKMatch, player: GKPlayer, didChange state: GKPlayerConnectionState) {
if state == .connected {
self.addPlayer(player)
}
}
关键点:
didFindMatch中设置match.delegate监听玩家连接状态didChangeState中处理.connected状态,将新玩家加入游戏- 被邀请方通过
GKMatchmakerViewController(invite:)接受邀请
func player(_ player: GKPlayer, didAccept invite: GKInvite) {
if let vc = GKMatchmakerViewController(invite: invite) {
vc.matchmakerDelegate = self
self.present(vc, animated: true, completion: nil)
}
}
手柄支持
(06:04)
所有 Game Center UI 现在支持手柄导航。按手柄 Home 键直接呼出 Game Center dashboard,再按一次回到游戏。零代码接入,不需要 Xcode 版本升级。你自己的 UI 需要单独添加手柄支持。
详细内容
游戏接入 Game Center 的完整流程
要让游戏支持 Game Center,需要在 App Store Connect 中开启 Game Center 功能,然后在代码中认证本地玩家:
GKLocalPlayer.local.authenticateHandler = { viewController, error in
if let viewController = viewController {
// 需要显示登录界面
self.present(viewController, animated: true)
} else if GKLocalPlayer.local.isAuthenticated {
// 认证成功,可以调用 Game Center API
self.loadGameCenterData()
} else {
// 认证失败或用户取消
print("Game Center authentication failed: \(error?.localizedDescription ?? "unknown")")
}
}
排行榜与成就
Game Center 的核心功能还包括:
- 排行榜(Leaderboard):玩家提交分数,全球或好友间排名
- 成就(Achievement):追踪玩家在游戏中的里程碑
- 挑战(Challenge):向好友发起分数挑战
这些功能在 iOS 14 已经做了 UI 刷新,iOS 15 通过 Access Point API 让玩家随时呼出 dashboard 查看。
自定义 UI 与原生 UI 的混合
你可以在自定义游戏 UI 中嵌入 Game Center 数据。比如在关卡选择界面显示当前关卡的最高分,或在游戏过程中显示实时排名指示器。同时通过 Access Point 给玩家提供完整的 Game Center 入口。
核心启发
-
在进度地图中显示好友位置
- 做什么:在关卡选择或世界地图界面,标注每个好友当前所在的关卡
- 为什么值得做:社交对比是最强的游戏动机之一。看到好友比自己靠前,玩家会有强烈的追赶欲望
- 怎么开始:接入 Friends API,用排行榜分数映射到关卡,在地图上渲染好友头像
-
做好友专属排行榜
- 做什么:在游戏内展示「好友排名」视图,只显示好友之间的分数对比
- 为什么值得做:全球排行榜对普通玩家来说太遥远,好友榜更有竞争感和可达性
- 怎么开始:
loadFriends()获取好友列表,然后用loadEntries(for:timeScope:)加载好友分数
-
接入 Fast Start 减少等待时间
- 做什么:多人对战游戏开启 Fast Start,2 人即可开局,其他人陆续加入
- 为什么值得做:等待所有玩家就位是对战游戏最大的流失点。Fast Start 让玩家立刻进入游戏,后台处理剩余连接
- 怎么开始:
canStartWithMinimumPlayers = true+ 在didChangeState中处理动态加入
-
利用 Game Center 群组做快速重开
- 做什么:在匹配界面展示「最近一起玩」的群组,一键邀请上次队友
- 为什么值得做:熟人局比随机匹配留存率高得多。Game Center 自动维护群组,你不需要自己建社交图谱
- 怎么开始:使用系统
GKMatchmakerViewController,Suggestions Shelf 会自动显示最近群组
-
添加 Continue Playing 深度链接
- 做什么:确保游戏支持通过 URL scheme 或 Universal Link 直接进入最近关卡
- 为什么值得做:Continue Playing 小组件点击后直接进入游戏,但如果游戏总是从主菜单开始,体验就断了
- 怎么开始:用
NSUserActivity或自定义 URL scheme 保存游戏状态,启动时恢复
关联 Session
- Support real-time and turn-based multiplayer with Game Center — Game Center 多人游戏技术详解,包含实时和回合制匹配
- Tap into virtual and physical game controllers — 游戏手柄支持,配合 Game Center 的手柄导航功能
- What’s new in Game Center: Widgets, friends, and multiplayer improvements — 本场 Session 的完整内容
评论
GitHub Issues · utterances