如何检测 Multipeer Connectivity 邀请的拒绝?

Posted

技术标签:

【中文标题】如何检测 Multipeer Connectivity 邀请的拒绝?【英文标题】:How do I detect the decline of a Multipeer Connectivity invitation? 【发布时间】:2017-10-16 07:24:08 【问题描述】:

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 并且他接受了它,现在突然有 3 个人在 2 人游戏中!这就是为什么我需要确保在开始游戏之前响应所有邀请。

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

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】:

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

据我所知,如果用户由于某种原因无法连接,也会出现这种状态,但是您可以区分这两个流程,因为当连接失败时,您还将首先将状态更改为 MCSessionStateConnecting,然后再更改为 MCSessionStateNotConnected .

简而言之:

    状态从MCSessionStateConnecting 更改为MCSessionStateNotConnected 表示设备无法连接但已接受邀请 状态仅转到MCSessionStateConnecting,表示用户点击拒绝

鉴于您在启动游戏时需要高级逻辑,您将无法依赖内置的MCBrowserViewController,因为一旦连接其中一个对等点,就会启用Done 按钮。

您必须使用MCNearbyServiceBrowser,然后使用-invitePeer:toSession:withContext:timeout: 发起每个邀请,这样您就可以知道谁被邀请,并根据代表呼叫谁连接、谁连接失败或谁拒绝。

希望这会有所帮助...

【讨论】:

那么我如何区分“收到邀请但'忽略'它的人,即没有调用invitationHandler(Bool,MCSession?)关闭的人”和“拒绝邀请的人”?对于这两种人,国家都会去.connecting并留在那里,对吗? 我使用了MCBrowserViewController,为此我知道.connecting 状态只会在用户点击接受/拒绝警​​报上的接受时调用,如果按下拒绝,代表将不会转到.connecting但直接发给.notConnected 当用户都没有点击时会发生什么?不会调用状态改变的委托方法? 如果用户刚刚打开警报并决定不做任何事情,那么您无法知道...您可能会超时,因为您知道何时使用 -invitePeer:toSession:withContext:timeout: 邀请了对等方,然后如果您在一段时间内没有得到响应,请在没有该用户的情况下继续... 所以我可以假设如果状态更改为.connected,则接受邀请,如果状态更改为.notConnected,则拒绝邀请。因此,我可以保留我向其发送邀请的对等点列表,如果对等点的状态更改为已连接或未连接,我会从列表中删除该对等点。如果该列表为空且session.connectPeers 不为空,我知道我可以开始游戏了。对吗?

以上是关于如何检测 Multipeer Connectivity 邀请的拒绝?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用swift 4查看Multipeer Connectivity框架中的MCBrowserViewController

如何使用 Multipeer Connectivity 安全地停止发送图像

MultiPeer 框架避免使用 MCBrowserView?

如何使用 Multipeer Connectivity 框架邀请用户加入我的会话?

如何在 Objective C Multipeer Connectivity 框架中传输对象数据

如何从 Multipeer Connectivity Session 更改视图 UILabel、UIButtons、UIViews 等?