You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 5.x iOS14 GameKit匹配出现Peer does not exist错误如何解决?

问题原因及修复方案

核心问题

  • 未持有GKMatch实例,实例被自动释放后导致GameKit无法识别对等节点,触发Peer does not exist报错
  • 收到邀请接受的回调后,没有调用GKMatchmaker的匹配方法完成连接流程
  • 未实现GKMatchDelegate的连接状态监听方法,无法判断对等节点是否完成接入
  • 匹配成功后未等待所有玩家连接完成就直接进入后续流程,此时对等节点还未完成注册

修复步骤

1. 新增属性持有匹配实例

在SimpleViewController中新增属性,避免匹配对象被释放:

class SimpleViewController: UIViewController {
    let minPlayers = 2
    let maxPlayers = 4
    // 新增以下两个属性
    var currentMatch: GKMatch?
    var expectedPlayerCount: Int = 0

    // 原有viewDidLoad代码保持不变
    override func viewDidLoad() {
      super.viewDidLoad()
      // 原有逻辑不变
      ...
    }
}

2. 完善邀请接受回调

修改player(_:didAccept:)方法,收到邀请后主动发起匹配:

func player(_ player: GKPlayer, didAccept invite: GKInvite)   {
    self.dismiss(animated: true, completion: {
        GKMatchmaker.shared().match(for: invite) { [weak self] match, error in
            guard let self = self, let match = match, error == nil else {
                print("邀请匹配失败: \(error?.localizedDescription ?? "未知错误")")
                return
            }
            self.currentMatch = match
            match.delegate = self
            self.expectedPlayerCount = self.minPlayers - match.players.count
        }
    })
}

3. 修改匹配成功回调

不要在匹配找到后直接进入游戏,先等待所有玩家接入:

func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFind match: GKMatch) {
    self.dismiss(animated: true)
    currentMatch = match
    match.delegate = self
    expectedPlayerCount = minPlayers - match.players.count
    print("找到匹配,等待剩余\(expectedPlayerCount)个玩家接入")
}

4. 实现GKMatchDelegate的连接状态回调

在扩展中新增连接状态监听方法,所有玩家连接完成后再启动游戏逻辑:

func match(_ match: GKMatch, player: GKPlayer, didChange state: GKPlayerConnectionState) {
    switch state {
    case .connected:
        expectedPlayerCount -= 1
        if expectedPlayerCount == 0 {
            // 所有玩家接入完成,此处调用你的游戏启动逻辑
            print("所有玩家已连接,游戏开始")
        }
    case .disconnected:
        print("玩家\(player.displayName)断开连接")
        // 按需补充断线重连或结束游戏逻辑
    default:
        break
    }
}

func match(_ match: GKMatch, didFailWithError error: Error?) {
    print("匹配出错: \(error?.localizedDescription ?? "未知错误")")
}

附加配置检查

  • 两台测试设备使用的Game Center账号必须都已加入App Store Connect的沙盒测试账号列表
  • 项目配置中已添加Game Center能力
  • 测试包的Bundle ID与App Store Connect中注册的App ID完全一致

内容的提问来源于stack exchange,提问作者user3069232

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:15:00