我创建了一个会话,将其分享给另一个玩家,现在我想开始一个游戏。 我可以在两台设备上看到两个玩家的会话。所以,看起来我们已准备好进行游戏,但我需要在游戏之前更改连接状态,我可以在两个设备上执行此操作。
但是......当我在设备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.
在两台真实设备上获得此功能。
答案 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及相关主题,如果您仍然尝试使用它的人之一,请在我的推特上发送一条说明(链接在我的简历中)。