【问题标题】:Multipeer connectivity framework: Stability and Recommendations多点连接框架:稳定性和建议
【发布时间】:2016-04-08 10:06:15
【问题描述】:

我正在开发一个使用 MC 框架作为通信渠道的项目,经过一些测试后,我认为这个渠道在某种程度上是不稳定的。

为了正确使用该框架,我一直在关注 Apple 的文档和视频,但碰巧:

  • 配对后,同伴经常会断开连接,如果我配对多个同伴,这种情况会更频繁。
  • 部分数据包有混合数据

是否有任何使用该框架的建议? 即:

  • 具体项目设置? (即:功能部分中是否有需要启用的功能?)
  • 多线程限制? (即:总是从同一个线程调用 mc 方法)
  • 关于发送数据量的限制?

我发现this 链接提到了框架在压力下表现不佳的一些内容。这就是我正在寻找的建议:)。

记录在案:

  • 我正在使用基于 this 帖子的实现,因为 Apple's project 不适合我。
  • 我只使用一个 MCSession 用于我尝试配对的所有同伴
  • 加密首选项设置为MCEncryptionNone
  • 使用sendData:sendResourceAtURL: 与同行通信。

【问题讨论】:

  • 鉴于 AirDrop 的性能如此糟糕,而且我几乎无法让它工作,即使是在全新的 MacBook Pro 和 iPhone 6S Plus 上......我认为这只是废话,Apple 应该羞愧。就像 iCloud 刚推出时,我们中的任何一个尝试使用该文档同步垃圾的人,都像是先跳进了削木机的腿。
  • 我在某处读到,当浏览/广告对等点不在同一设备上同时进行时,它会增加稳定性。在我的应用程序中,只有我的主设备浏览对等设备,我的从设备做广告,它似乎减少了一点连接延迟,并降低了断开连接。希望对您有所帮助。
  • "只使用 PubNub" :/
  • 我曾经参加过由 Apple 主办的一个特殊的 iOS 会议,并有机会与他们的一位工程师谈论 AirDrop。因为它不“Just Work”,我开玩笑地对他说:“说实话,AirDrop不是你们自己开发的,你肯定是从微软那里得到的!”。他尴尬地否认了。
  • @CommaToast 空投速度非常慢 - 我认为他们正在通过限制连接来解决数据过多导致连接中断的问题。

标签: ios multipeer-connectivity


【解决方案1】:

我在游戏中使用了 MC 框架,并发现了一些解决方法来解决其明显的不稳定性:

1) 我使用每 15 秒发送一次的“保持活动”事务来保持链接上的活动。我发现这几乎可以解决我遇到的所有连接丢失问题。

2) 我将所有由数据接收触发的处理分派给主线程,并且从不在线程之间携带任何 MCPeer 或 MCSession 对象(初始连接协议除外)。我也这样做是为了尽量减少花费在数据接收代码中的时间,以便 MC 使用的线程尽快重新获得控制权(我还发现这是一些断开连接的原因)。我不将此规则应用于发送数据(仅在接收时)

3) 我还没有找到一个干净的解决方案来解决尝试建立连接时出现的对等点重复(使用标准 UI 和我自己的 UI)。到目前为止,比较 MCPeer ID 以避免重复似乎只是消除了一些重复。此外,似乎使用相同的 MCSession 进行广告 (MCAdvertiserAssistant) 并连接到对等点会导致一些冲突,所以我每次启动助手时都使用一个新的、单独的 MCSession 实例。

【讨论】:

  • 嘿,谢谢。关于线程,这是真的,文档上有提示。关于 2 & 3 我会试试看它是否能提高稳定性。干杯
【解决方案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
}

这将在连接的另一端打开它的输出流时被调用。

现在您已经准备好用于双向通信的两个流。

【讨论】:

  • 感谢您抽出宝贵的时间,有几点: • 如何正确使用NSStream 与MC 的任何链接?我目前有一个实现,但不确定它是否正确。 • “发生意外错误”是什么意思?如何识别会话损坏的场景?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多