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

How do I detect the decline of a Multipeer Connectivity invitation?

TLDR:

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

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

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

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

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

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

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

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

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

简而言之:

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

鉴于您在游戏开始时需要高级逻辑,您将无法依赖内置的 MCBrowserViewController,因为一旦其中一个按钮启用,就会启用 Done 按钮同行是coonected。

你必须使用 MCNearbyServiceBrowser 然后你用 -invitePeer:toSession:withContext:timeout: 发起每个邀请,这样你就有办法知道谁被邀请了,并且基于连接的代表电话,谁连接失败或者谁拒绝了。

希望这对您有所帮助...