代码之家  ›  专栏  ›  技术社区  ›  Sweeper

如何检测当前设备的MCSession的非编程断开?

  •  1
  • Sweeper  · 技术社区  · 7 年前

    为了避免成为XY问题,我将首先解释情况。

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

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

    • 按下退出按钮
    • 关闭屏幕(这会使应用程序进入后台,从而明显停止所有多对等连接)
    • 打开飞行模式
    • 离其他人太远了

    除第一种方式外,其他一切都无法通过编程进行控制。我目前可以实现第一个,如下所示:

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

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

    我理解,对于由2个对等方组成的会话,这是不可能的,因为不可能确定“谁与谁断开连接”。无论如何,游戏不能只在一个玩家的情况下继续,所以我要显示“所有其他玩家都离开了”警报,如果我看到了,请关闭游戏视图控制器 self.session.connectedPeers

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ladislav    7 年前

    假设您连接了3个对等点(对等点1、对等点2和对等点3)。假设对等3打开飞行模式。对等1和对等2将收到一个代表呼叫 sessionPeerDidChangeState 对等3已断开连接。但是对等点1和2之间仍然有联系(因此两者都有联系) self.session.connectedPeers == 1 ).

    self.session.connectedPeers == 0 因此,对等3可以假设是谁失去了连接。

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