如何检测Multipeer Connectivity邀请的下降?

时间:2017-10-16 07:24:09

标签: ios swift multipeer-connectivity

TLDR:

当其他设备收到邀请后呼叫invitationHandler时,我希望发送邀请的设备知道哪些设备接受了邀请,哪些设备拒绝了邀请。

为了避免成为XY问题,这就是我正在做的事情:

我正在使用Multipeer Connectivity进行2-4人游戏。

我的应用程序的流程将是这样的:

  • 设备可以通过按下按钮
  • 来设置其他人的可见性
  • 游戏的2-4名玩家之一,让我们称他为玩家A,按下按钮,他/她将看到附近玩家的列表
  • 玩家A将从列表中选择他想要添加到游戏中的1-3名玩家
  • 其他设备使用一些逻辑来确定是接受邀请还是拒绝邀请。
  • 在玩家A发送的所有邀请都被响应后,将启用一个按钮,玩家A可以按下该按钮开始游戏。
  • 我这样做是因为我不想在比赛开始后加入新球员。例如,如果玩家A邀请玩家B而玩家B接受它。然后玩家A邀请玩家C但在玩家C收到邀请之前,玩家A开始游戏。游戏将开始,但由于只连接了2个玩家,因此将创建一个2人游戏。之后邀请到达玩家C并且他接受了它,现在突然在2人游戏中有3个人!这就是为什么我需要确保在开始游戏之前响应所有邀请。

这也是我需要知道设备是否拒绝邀请的原因。我已经知道如何检测设备是否接受了邀请,就像这样:

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
    switch state {
    case .connected:
        print("peerID accepted the invitation!")
    default: 
        break
    }
}

我认为MCNearbyServiceBrowserDelegate中会有一个处理此问题的委托方法。我会想象它会被称为browser(_:peerDidDeclineInvitation:),但我没有找到类似的东西。

1 个答案:

答案 0 :(得分:2)

当用户拒绝邀请时,发起邀请的设备将获得状态= MCSessionStateNotConnected的委托状态更改。

据我所知,如果用户由于某种原因无法连接,也会发生这种状态,但是你可以区分这两个流,因为当连接失败时,你也会先将状态更改发送到MCSessionStateConnecting然后再转到{ {1}}。

简而言之:

  1. 状态从MCSessionStateNotConnected更改为MCSessionStateConnecting表示设备无法连接但邀请已被接受
  2. 状态仅转到MCSessionStateNotConnected,表示用户点击拒绝
  3. 鉴于您在游戏启动时需要高级逻辑,您将无法依赖内置的MCSessionStateConnecting,因为只要其中一个对等方启用此按钮就会启用MCBrowserViewController按钮coonected。

    您必须使用Done,然后使用MCNearbyServiceBrowser发起每个邀请,这样您就可以了解被邀请的人,并根据已连接的代理电话,未能连接的人或谁下降。

    希望这会有所帮助......