GameKit,GKGameSession如何将玩家添加到会话并发送数据?

时间:2017-07-04 14:02:32

标签: ios swift game-center gamekit gkgamesession

我创建了一个会话,将其分享给另一个玩家,现在我想开始一个游戏。 我可以在两台设备上看到两个玩家的会话。所以,看起来我们已准备好进行游戏,但我需要在游戏之前更改连接状态,我可以在两个设备上执行此操作。

但是......当我在设备A上执行此操作时,我看到用户A已连接且用户B未连接。之后,当我在设备B上重复该过程时,我看到相反的情况。 B连接而A不连接。

以下是连接播放器并发送数据的代码:

session.setConnectionState(.connected) { (error) in
   if let err = error {
      assertionFailure(err.localizedDescription)
   }
   else {

      print("NC:",session.players(with: .notConnected))
      print(" C:",session.players(with: .connected))

      let m = MoveTransfer(move:1) // test struct to send/receive data

      session.send(m.data(), with: .reliable) { (error) in
         if let err = error {
            assertionFailure(err.localizedDescription)
         }
      }
   }
}

我收到错误:

The requested operation could not be completed because there are no recipients connected to the session

顺便说一句,我无法在模拟器上更改连接状态(iCloud已登录)。

我忘了提及,我正在开发一款基于回合制的游戏。

修改

再次尝试,经过几次迭代,我得到了这个:

我让两个玩家都连接到了会话。但是发送数据仍然不起作用。

这是控制台输出:

NC: [] // not connected array and connected array below
C: [<GKCloudPlayer: 0x17402e700>, id: playerID1, name: Player1,<GKCloudPlayer: 0x17402e900>, id: playerID2, name: Player2]

fatal error: The requested operation could not be completed because there are no recipients connected to the session.

在两台真实设备上获得此功能。

1 个答案:

答案 0 :(得分:1)

我能够发送数据并在其他设备上接收数据。我使用loadSessions函数来加载所有会话(我认为id的loadSession也可以做到这一点)。 我做了以下,D1是设备1和D2设备2:

1. D1: load all sessions and set player state to connected
2. D2: load all sessions and set player state to connected
3. D1: load all sessions again and set player state to connected
4. D1 || D2: send data
5. D2 || D1: data 256 bytes from player: <GKCloudPlayer: 0x1c022b380>, id: playerID, name: (null)

虽然,我无法在两台设备上来回传输数据,因为如果我们添加从刚收到它的设备发送数据的第6步,我们就会收到错误:The requested operation could not be completed because there are no recipients connected to the session

我不确定是什么原因,但我在这个阶段停止了我的努力,因为我现在想,我不需要连接到会话来玩回合制游戏。

我发现了这个&#34;新的&#34; iOS 10 API被放弃了。由苹果和开发人员因此。如果您想讨论GKGameSession及相关主题,如果您仍然尝试使用它的人之一,请在我的推特上发送一条说明(链接在我的简历中)。