多点连接框架:稳定性和建议

18

我正在开发一个项目,使用 MC 框架作为通信渠道,在一些测试之后,我感觉这个渠道不太稳定。

我一直在遵循苹果的文档和视频,以便正确地使用该框架,但是发现:

  • 设备连接后经常会断开,如果配对多个设备则更容易断开。
  • 有些数据包中混合了不同类型的数据。

有没有任何建议来使用这个框架? 例如:

  • 特定的项目设置?(例如:capabilities 部分需要启用某些选项吗?)
  • 多线程限制?(例如:始终从相同线程调用 mc 方法)
  • 发送数据量方面的限制?

我在 这里 找到了一篇提到该框架在负载情况下表现不佳的文章。这就是我正在寻求的建议 :)。

记录如下:

  • 我使用基于这篇文章的实现,因为苹果的项目对我来说不起作用。
  • 我仅使用一个 MCSession 来与所有设备配对。
  • 加密偏好设置为 MCEncryptionNone
  • 使用 sendData:sendResourceAtURL: 与其他设备通信。

3
考虑到AirDrop的表现有多么糟糕,以及我几乎无法在全新的MacBook Pro和iPhone 6S Plus上使用它......我认为这只是一堆烂摊子,苹果应该感到羞耻。这就像当iCloud首次推出时,我们中任何尝试使用那个文档同步垃圾桶的人,就像头朝下跳进了木屑机器。 - CommaToast
我曾经在某个地方读到,当浏览/广告同行对等方不同时在同一设备上进行时,它会增加稳定性。在我的应用中,只有我的主设备浏览对等方,而我的从设备则进行广告,似乎减少了一些连接延迟并降低了断开连接的可能性。希望这可以帮到你。 - Thibaud David
只需使用PubNub。 - Fattie
我曾经参加过由苹果主办的一次特别的iOS会议,并有机会与他们的一位工程师谈论AirDrop。由于它的“Just Work”方式,我开玩笑地对他说:“告诉我实话:你们不是自己开发的AirDrop,肯定是从微软那里收购来的!”他尴尬地否认了。 - Nicolas Miari
@CommaToast 空投非常缓慢 - 我认为他们正在通过限制速度来解决过多数据导致连接中断的问题。 - DavidA
2个回答

3

我在游戏中使用MC框架,并针对其不稳定性找到了一些解决方法:

1) 我每隔15秒发送一次“保持活动”的事务以保持链接的活跃状态。我发现这几乎解决了我遇到的所有连接问题。

2) 所有由数据接收触发的处理均分派到主线程上,从不在线程之间传递任何MCPeer或MCSession对象(除了初始连接协议)。我还这样做是为了尽可能减少数据接收代码的执行时间,让MC使用的线程尽快恢复控制权(我也发现这是一些断开连接的根源)。我仅在接收数据时应用此规则(发送数据时除外)。

3) 对于尝试建立连接时出现的同行重复问题(无论是使用标准UI还是自己的UI),我没有找到完美的解决方案。到目前为止,仅通过比较MCPeer ID以避免重复似乎只能消除部分重复。另外,使用相同的MCSession进行广告(MCAdvertiserAssistant)和连接同行会引起一些冲突,因此我每次启动助手时都使用一个新的、独立的MCSession实例。


嘿,谢谢你。关于线程,文档中确实有提示。至于2和3,我会尝试一下看看是否能提高稳定性。干杯! - Omer
嗨,有点晚了,但是“保持活动”交易是什么意思呢?这是否意味着您每15秒发送和接收一些数据以保持会话活动状态?还是其他什么意思? - Ammar Mujeeb
是的。基于这样一个假设,即不活动的连接最终会自行关闭(或以某种方式被取消),发送到链接上的字符串在接收端不执行任何操作,但通过“模拟”活动来防止连接关闭。 - Alain T.

2

我在一个定期传输大量数据的应用程序中使用它。以下几种解决方法有所帮助:

  • 一旦与对等方建立连接,设置NSOutputStream/NSInputStream对进行通信。不要使用多点连接框架中的发送数据或发送资源方法。

  • 如果发生意外断开连接,则无法信任MCSession对象的状态 - 将其拆除并从头开始。更新:此处的意外断开连接是指另一端关闭其中一个流。

  • 提示用户检查所有设备是否在同一个WiFi接入点上。如果对等方在同一网络段上但不在同一个Wifi上,则浏览器将看到广告并能够连接,但几秒钟后将断开连接。

更新:

建立输出流的方法如下:

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
{
    switch(state)
    {
        // ...

        case MCSessionStateConnected:
            outputStream = [session startStreamWithName:@"Stream" toPeer:peerID error:&error];
            // Setup a stream handler for the stream and open it
            break;
        // ...
    }
}

要建立输入流,请实现MCSessionDelegate中的此方法:
-(void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID
{
    // Setup a stream handler for the stream and open it
}

当连接的另一端打开其输出流时,将调用此方法。

现在,您有两个准备好进行双向通信的流。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Omer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接