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连接B,B通过蓝牙连接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 中的多点连接会话的主要内容,如果未能解决你的问题,请参考以下文章