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

时间:2017-10-17 20:37:13

标签: ios swift multipeer-connectivity

为避免成为XY问题,我先解释一下情况。

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

现在我需要处理一个玩家与所有其他玩家断开连接的情况。除非只剩下一名玩家,否则当玩家断开连接时游戏仍应继续。但是,我希望向所有仍然连接的玩家显示警告,说明" XXX已断开连接"并且"杀死"断开连接的玩家,以及对断开连接的玩家的另一个警告,说明"你断开连接"并解雇了游戏视图控制器。

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

  • 按退出按钮
  • 关闭屏幕(这使应用程序进入后台,显然会停止所有Mutipeer连接)
  • 启用飞行模式
  • 离他人太远

除了第一种方式之外的所有内容都无法以编程方式进行控制。我现在可以像这样实现第一个:

当用户按下退出按钮时,在调用session.disconnect()之后,我可以显示消息"您已断开连接"。在sessionPeerDidChangeState委托方法中,我可以检测到播放器已断开连接,我可以显示" XXX已断开连接"警惕。

但是,我无法弄清楚如何处理其他情况。在我自己的测试过程中,我发现如果用户关闭屏幕,则甚至不会调用sessionPeerDidChangeState委托方法。即使它被调用,我该如何判断设备是否已断开连接?我需要知道这一点,以显示一个适当的信息,并决定是否杀死"断开连接的玩家。

我理解这对于由2个对等体组成的会话是不可能的,因为无法确定谁与谁断开连接"。无论如何,这场比赛只能让一名球员继续比赛,所以我只是要表现出来#34;所有其他球员都离开了#34;如果我看到self.session.connectedPeers为空,则提醒并关闭游戏视图控制器。我只关心有3名球员,其中1人离开的情况。我应该能够知道哪个播放器是断开的,但我不知道如何。

1 个答案:

答案 0 :(得分:2)

假设您已连接3个对等体(对等体1,对等体2和对等体3)。让我们说对等3打开飞机模式。对等体1和对等体2将获得对等体3已断开连接的委托呼叫sessionPeerDidChangeState。但同伴1和2之间仍然有联系(所以两者都有self.session.connectedPeers == 1)。

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

如问题中所述,如果按下主页按钮,则可以在applicationDidEnterBackground中与会话断开连接。