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

时间:2016-01-04 18:09:07

标签: ios multipeer-connectivity

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

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

  • 同伴经常在配对后断开连接,如果我配对一个以上的同伴,那就更多了。
  • 某些数据包具有混合数据

是否有任何建议与框架一起使用? 即:

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

我找到this链接,提到有关框架在压力下无法正常运行的内容。这是我正在寻找的那种建议:)。

记录:

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

2 个答案:

答案 0 :(得分:2)

我在游戏中使用MC框架并找到了一些明显不稳定的解决方法:

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

2)我将由数据接收触发的所有处理发送到主线程,并且从不在线程之间携带任何MCPeer或MCSession对象(初始连接协议除外)。我也这样做是为了最大限度地减少在数据接收代码中花费的时间,以便MC使用的线程尽快恢复控制(我也发现这是一些断开连接的来源)。我不会将此规则应用于发送数据(仅在接收时)

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

答案 1 :(得分:0)

我在定期传输大量数据的应用中使用它。一些解决方法有所帮助:

  • 建立与对等方的连接后,请设置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
}

当连接的另一端打开它的输出流时,将调用它。

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