如何检测 Multipeer Connectivity 邀请的拒绝?
How do I detect the decline of a Multipeer Connectivity invitation?
TLDR:
当其他设备收到邀请后调用invitationHandler
时,我希望发送邀请的设备知道哪些设备接受了邀请,哪些设备拒绝了。
为了避免成为 XY 问题,这就是我正在做的事情:
我正在使用 Multipeer Connectivity 进行 2-4 人游戏。
我的应用程序的流程将是这样的:
- 设备可以通过按下按钮来设置对其他人的可见性
- 游戏的 2-4 位玩家中的一位,我们称他为玩家 A,将按下一个按钮,he/she 将看到附近玩家的列表
- 玩家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:)
,但我没有找到类似的东西。
当用户拒绝邀请时,发起邀请的设备将获得委托状态更改,状态 = MCSessionStateNotConnected
。
据我所知,如果用户由于某种原因无法连接,也会出现这种状态,但您可以区分这两种流程,因为当连接失败时,您也会先将状态更改为 MCSessionStateConnecting
,然后至 MCSessionStateNotConnected
.
简而言之:
- 状态从
MCSessionStateConnecting
更改为 MCSessionStateNotConnected
表示设备连接失败但已接受邀请
- 状态仅转到
MCSessionStateConnecting
,表示用户点击拒绝
鉴于您在游戏开始时需要高级逻辑,您将无法依赖内置的 MCBrowserViewController
,因为一旦其中一个按钮启用,就会启用 Done
按钮同行是coonected。
你必须使用 MCNearbyServiceBrowser
然后你用 -invitePeer:toSession:withContext:timeout:
发起每个邀请,这样你就有办法知道谁被邀请了,并且基于连接的代表电话,谁连接失败或者谁拒绝了。
希望这对您有所帮助...
TLDR:
当其他设备收到邀请后调用invitationHandler
时,我希望发送邀请的设备知道哪些设备接受了邀请,哪些设备拒绝了。
为了避免成为 XY 问题,这就是我正在做的事情:
我正在使用 Multipeer Connectivity 进行 2-4 人游戏。
我的应用程序的流程将是这样的:
- 设备可以通过按下按钮来设置对其他人的可见性
- 游戏的 2-4 位玩家中的一位,我们称他为玩家 A,将按下一个按钮,he/she 将看到附近玩家的列表
- 玩家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:)
,但我没有找到类似的东西。
当用户拒绝邀请时,发起邀请的设备将获得委托状态更改,状态 = MCSessionStateNotConnected
。
据我所知,如果用户由于某种原因无法连接,也会出现这种状态,但您可以区分这两种流程,因为当连接失败时,您也会先将状态更改为 MCSessionStateConnecting
,然后至 MCSessionStateNotConnected
.
简而言之:
- 状态从
MCSessionStateConnecting
更改为MCSessionStateNotConnected
表示设备连接失败但已接受邀请 - 状态仅转到
MCSessionStateConnecting
,表示用户点击拒绝
鉴于您在游戏开始时需要高级逻辑,您将无法依赖内置的 MCBrowserViewController
,因为一旦其中一个按钮启用,就会启用 Done
按钮同行是coonected。
你必须使用 MCNearbyServiceBrowser
然后你用 -invitePeer:toSession:withContext:timeout:
发起每个邀请,这样你就有办法知道谁被邀请了,并且基于连接的代表电话,谁连接失败或者谁拒绝了。
希望这对您有所帮助...