如何从当前设备的MCSession中检测到非程序化的断开连接?

为了避免出现XY问题,我会先解释一下情况。

我正在开发一个游戏,其中多个设备可以连接到一个多人游戏。 我正在使用Multipeer连接。 游戏支持2-4名玩家。

现在我需要处理一名玩家与所有其他玩家断开的情况。 除非只有一个玩家离开,否则当游戏者断开连接时游戏仍然应该继续。 但是,我希望向所有仍然连接的玩家显示一条提示,告知“XXX已断开连接”并“杀死”断开连接的玩家,另一个提醒断开连接的玩家说“断开连接”并解散游戏视图控制器。

玩家可以通过以下方式断开连接:

  • 按下退出button
  • closures屏幕(这使得应用程序进入显然停止所有Mutipeer连接的背景)
  • 打开飞行模式
  • 离别人太远了

除了第一种方式之外的任何东西都不能通过编程来控制。 我目前可以执行这样的第一个:

当用户按下“退出”button时,在调用session.disconnect()之后,我可以显示消息“您已断开连接”。 在sessionPeerDidChangeState委托方法中,我可以检测到一个玩家已经断开连接,我可以在那里显示“XXX已断开连接”警报。

但是,我不知道如何处理其他情况。 在我自己的testing过程中,我发现如果用户closures屏幕, sessionPeerDidChangeState委托方法甚至不会被调用。 即使被调用,我该如何判断设备是否被断开? 我需要知道这一点,以显示适当的信息,并决定是否“杀死”断开的玩家。

我明白,这是不可能的,由两个同行组成的会议,因为不可能确定“谁与谁断开”。 游戏无法继续只有一个球员,所以我只是要显示“所有其他球员已经离开”警惕,并解雇游戏视图控制器,如果我看到self.session.connectedPeers是空的。 我只关心有3名选手和1名选手离开的情况。 我应该能够知道哪个玩家是断开连接的,但我不知道如何。

可以说你有3个对等连接(对等1,对等2和对等3)。 假设对等3打开飞行模式。 对等体1和对等体2将得到一个sessionPeerDidChangeState呼叫sessionPeerDidChangeState ,其中对等体3已经断开连接。 但同龄人1和2之间仍然有联系(所以两者都会有self.session.connectedPeers == 1 )。

另一方面,对等体3将看到对等体1和对等体2一个接一个地断开,并且self.session.connectedPeers == 0 ,因此对等体3可以认为是失去连接的那个。

正如在问题中指出,如果主页button被按下,你可以从applicationDidEnterBackground的会话断开连接。