【问题标题】:How do I detect a non-programmatic disconnection from the MCSession of the current device?如何检测与当前设备的 MCSession 的非编程断开连接?
【发布时间】:2017-10-17 20:37:13
【问题描述】:

为了避免成为XY问题,我先说明情况。

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

现在我需要处理一个玩家与所有其他玩家断开连接的情况。当玩家断开连接时,游戏仍应继续,除非只剩下一个玩家。但是,我希望向所有仍然连接的玩家显示“XXX 已断开连接”并“杀死”断开连接的玩家的警报,并向断开连接的玩家显示“您已断开连接”并关闭游戏视图控制器的另一个警报.

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

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

除了第一种方式之外的所有东西都不能以编程方式控制。我目前可以像这样实现第一个:

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

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

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

【问题讨论】:

  • 第二个你不能用applicationDidEnterBackground吗?要检查飞行模式,请在此处查看此线程 stackoverflow.com/questions/4804398/detect-airplane-mode-on-ios 并使用代表检查他们是否将其关闭或打开。至于离别人太远,你是指身体上的吗?还是在游戏中?如果是前者,那么除了不断听别人的位置外,我不太确定
  • @TNguyen 我知道存在但断开连接的方法列表不限于我在问题中的内容。我认为我不可能处理所有案件。我正在寻找一种方法来检测断开连接,不管是什么原因。
  • 您能否告诉我们您是如何连接玩家的,例如,如果您有 3 位玩家,是否一位玩家充当Browser (MCNearbyServiceBrowser) 而其他玩家充当Advertisers (MCNearbyServiceAdvertiser)?还是你用其他方式来做
  • @Ladislav 是的,这正是我连接玩家的方式,但这有关系吗?游戏开始后,我扔掉所有的广告商和浏览器,因为你不能加入正在进行的游戏。
  • 当我进行测试时,如果其中一个已连接的对等体打开飞行模式,我总是接到一个对等体已断开连接的委托呼叫,尽管这需要一些时间 - 通常在我放置后 5-8 秒在飞行模式...

标签: ios swift multipeer-connectivity


【解决方案1】:

假设您连接了 3 个对等点(对等点 1、对等点 2 和对等点 3)。假设对等点 3 打开了飞行模式。对等点 1 和对等点 2 将收到对等点 3 已断开连接的委托呼叫 sessionPeerDidChangeState。但是对等点 1 和 2 之间仍然有连接(所以两者都有self.session.connectedPeers == 1)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多