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

问题描述:

为了避免出现XY问题,我会先解释一下情况。如何从当前设备的MCSession中检测非程序化断开连接?

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

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

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

  • 按下退出键
  • 关闭屏幕(这使得应用进入背景,停止所有Mutipeer连接显然)
  • 打开飞行模式
  • 过于远离他人

一切APAR t从第一种方式不能通过编程控制。我目前可以执行如下第一个:

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

但是,我不知道如何处理其他案件。在我自己的测试中,我发现如果用户关闭他们的屏幕,甚至不会调用sessionPeerDidChangeState委托方法。即使它被调用,我该如何确定设备是否被断开连接?我需要知道这一点以显示适当的信息,并决定是否“杀死”断开连接的玩家。

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

+0

第二个你不能只使用'applicationDidEnterBackground'?为了检查飞机模式,请在这里查看此线程https://*.com/questions/4804398/detect-airplane-mode-on-ios,并利用代表来检查它们是否关闭或打开。至于离得太远,你的意思是身体吗?或在游戏中?如果它是前者,那么我不太确定,除了不断地倾听其他人的位置 – TNguyen

+0

@Tguien我知道存在,但断开连接方式的列表并不局限于我在问题中的含义。我认为我不可能处理所有情况。无论出于何种原因,我正在寻找一种检测断开连接的方法。 – Sweeper

+0

你能让我们知道你如何连接玩家,例如,如果你有3名玩家,一名玩家扮演“浏览器(MCNearbyServiceBrowser)”,而其他玩家扮演“广告商(MCNearbyServiceAdvertiser)”的角色吗?或者你以其他方式做 – Ladislav

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

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

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