iOS7 中的多点连接会话

Posted

技术标签:

【中文标题】iOS7 中的多点连接会话【英文标题】:Multipeer Connectivity Session in iOS7 【发布时间】:2014-03-31 02:25:42 【问题描述】:

我查看了 Apple 的文档,但仍然不清楚一件事,即会话。

    当 - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context inviteHandler:(void (^)(BOOL, MCSession *))invitationHandler 被调用时,我们需要将一个会话传递给invitationHandler。本届会议会发生什么? 当 A 邀请 B 加入 A 创建的会话时,B 是否也向 A 提供新会话? B的会话里面是什么?它只是 A 一个人,还是包括当前在 A 会话中的所有对等方? B 是否应该跟踪用于接受 A 邀请的会话? 在这篇文章http://nshipster.com/multipeer-connectivity/ 中,教程会即时创建一个新会话并使用它来接受邀请,一旦功能结束,您不会丢失会话吗?从而将信息丢失给连接的对等方?

    假设B、C、D都被A邀请了,现在B要给C发东西,是要求B先发信息给A还是B可以直接发给A C?

    根据 Apple 的文档,单个会话最多只能容纳 8 个对等点。是否可以进行一系列会话,以便您可以邀请超过 8 人加入您的设备?如果是这种情况,客户端是否还需要响应一个数组,以便它的列表中可以携带超过 8 个对等点?

    假设 A 和 B 现在已连接,A 现在邀请 C 加入。 B 怎么知道 C 现在在会话中?

感谢您阅读这么长的帖子。

【问题讨论】:

【参考方案1】:

关于 Multipeer Connectivity 的文档并不多,所以这些答案是基于我自己的实验:

    这个问题中有很多问题,但简而言之,A 的会话管理 A 已发送或接受的邀请。因此,如果 B 邀请并且 A 接受,则 A 在接受时通过的会话将在 MCSessionDelegate session: peer: didChangeState: 回调中用于说明连接是否发生。此时,A 会话的connectedPeers 属性将包含 B(如果连接成功)。一旦 A 接受,B 用来发送邀请的会话也将获得相同的回调,并将在 connectedPeers 中包含 A。 A 和 B 都不会拥有管理它们之间的此连接的另一方会话的任何信息。是的,如果您想向新连接的对等方发送任何数据,您需要保留对处理连接的会话的引用。我还没有看到为每个邀请创建新会话有什么真正的优势。

    基于上述,B 没有关于 A 连接到谁的信息。因此,如果 A 连接到 B、C 和 D,则 B 唯一知道的对等点是它连接到的对等点 - A。Multipeer Connectivity 在这里提供的是 B 通过 A 发现 C 或 D 的能力。所以如果 A-B通过WiFi建立连接,A-C通过蓝牙建立连接,但是B没有启用蓝牙,并且C与B在不同的WiFi网络上,B和C仍然可以通过A发现彼此。邀请和接受的过程仍在进行中交给 B 和 C 来处理。

    我在这里回答了一个关于会话管理的问题,这可能会有所帮助Best option for streaming data between iPhones

    B 对 A 连接到 C 的事一无所知。B 所能做的就是自己发现 C 并将 C 添加到它自己的会话中。

【讨论】:

谢谢!很有帮助!【参考方案2】:

    从快速查看 Chris 的答案来看,我在工作中所做的工作似乎是准确的。

    我目前正在开发一款使用多人连接的游戏,并发现:

    (假设每个人都在使用 wifi)如果 A 连接到 B 并且 A 连接到 C,那么 B 将连接到 C 并且能够向C发送消息。

    Multipeer Framework 是一个 P2P 框架,自动将所有人连接在一起

    即使(如在我当前的项目中)您将其设置为服务器-客户端模型,所有对等点仍将连接,并且您可以在 B 和 C 之间发送消息而无需通过 A。取决于您正在做什么你的应用程序。

    听克里斯的回答

    在 #2 中解决

我建议查看 Apple Docs 中的示例项目,并仔细观察连接时调试区域中发生的情况。

另外,作为旁注:

Scenario:(A is only on wifi),(B is on wifi and bluetooth),(C is on bluetooth only)

如果A通过wifi连接BB通过蓝牙连接C A 仍将连接到 C,但您将无法从 A 直接向 C 发送消息,因为他们位于不同的网络上。

【讨论】:

如果您至少有 3 台设备要测试,那么可以更轻松地查看所有设备之间发生的情况。 谢谢!很有帮助!【参考方案3】:

@SirCharlesWatson:

(假设每个人都在使用 wifi)如果 A 连接到 B 并且 A 连接到 C,那么 B 将连接到 C 并且能够向 C 发送消息。

Multipeer Framework 是一个 P2P 框架,自动将所有人连接在一起

我的问题是:当B自动连接到C时,B&C会收到已经存在会话的状态变化通知吗?

A: session:peer:B didChangeState(MCSessionStateConnected) B: session:peer:A didChangeState(MCSessionStateConnected)

【讨论】:

以上是关于iOS7 中的多点连接会话的主要内容,如果未能解决你的问题,请参考以下文章

多点连接:列出所有附近的会话

多点连接终止会话

切换 VC 后多点连接会话断开

xcode 8 swift 3 中多点连接框架中对成员“会话(_:peer:didChange)”错误的模糊引用

后台模式下的多点连接

强制多人连接关闭