What's new in Game Center: Widgets, friends, and multiplayer improvements
Graphics & Games 进阶 26m

Game Center 新变化:小组件、好友系统与多人游戏增强

What's new in Game Center: Widgets, friends, and multiplayer improvements

2021年6月8日

在 Apple 官方观看视频

一句话判断

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 后台常驻刷新。接入方式是通过 GKLeaderboardGKAchievement 的现有 API,把数据喂给 WidgetKit 的 Timeline Provider 就行。

多人匹配 API 的 GKMatchmakerViewController 改版。新 API 把匹配请求、邀请好友、自动匹配三个流程合并到一个界面。以前你需要分别处理 GKMatchRequestrecipientsmaxPlayersplayerGroup 等属性,现在直接用 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)
            }
        }
    }
}

最佳实践

  1. 优先接入小组件。排行榜和成就组件能零成本提升留存,玩家看到自己排名变化就有动力打开游戏。建议用中等尺寸组件,同时展示排名和最近成就解锁。
  2. 好友邀请流程要内嵌到游戏内 UI,而不是依赖系统弹窗。在游戏大厅中直接展示 GKMatchmakerViewController,让玩家在匹配的同时拉好友入局,降低跳出率。
  3. 匹配分组(playerGroup)要合理设置。用 ELO 或类似评分系统给玩家分级,让 playerGroup 对应技能等级,避免新手匹配到老玩家导致流失。

还有什么值得关注

  • App Store Connect 中 Game Center dashboard 增加了玩家参与度的可视化报告,能看到成就解锁率和排行榜活跃度趋势。
  • GKLocalPlayer 新增了 loadFriends() 方法,可以获取好友列表用于游戏内社交功能。
  • 回合制游戏支持了新的超时设置,可以自定义每回合的最大等待时间。
WWDC 2021