ios - Multipeer Connectivity Framework - Lost Peer 留在 session 中

标签 ios session multipeer-connectivity

考虑到社区遇到的所有错误,我想知道这个 Multipeer Connectivity 框架是否已准备好在现实世界中使用。我认为我设置正确,但我尝试过的所有其他示例项目都遇到了类似的问题。

我遇到的问题可能与 Bonjour 固有的某些问题有关,我无法弄清楚,但基本上问题如下:

  • 我有一个活跃的MCSession,有很多同伴。
  • 现在,如果设备在 session 中,然后强制退出,则该“对端”会无限期保持连接。
  • 我无法强制该用户退出,即使 browser:lostPeer: 方法已为该对等点调用并且甚至不再在浏览器中显示为 “附近”。
  • session:peer:didChangeState: 方法不会为该点调用。
  • 当强制退出的对等点返回到应用程序时,它们会被 browser:foundPeer:withDiscoveryInfo: 再次“找到”,但它们仍然存在于 session.connectedPeers NSArray。显然,他们仍然没有收到有关 session 的任何数据或更新,并且实际上没有连接。
  • 将原始对等点作为 MCSessionStateNotConnected 注册到 session 中似乎唯一可行的方法是将该对等点重新连接到原始 session 。然后重复调用 session:peer:didChangeState:,其中 peerID 的新实例是 MCSessionStateConnected,并且在 peerID 的旧实例调用 后不久MCSessionStateNotConnected.

示例聊天应用程序很好地演示了这个问题:https://developer.apple.com/library/ios/samplecode/MultipeerGroupChat/Introduction/Intro.html

由于似乎没有任何方法可以手动强制从 session 中删除一个对等点,我该怎么办?我应该尝试以某种方式重建 session 吗?

这个框架看起来有点乱,但我试图保留判断力!

最佳答案

我对此类问题的唯一解决方法是在 session 和对等点之间建立 1-1 关系。它使广播的发送变得复杂,但至少允许通过断开连接/删除 session 本身来进行对等级断开连接和清理。

更新

详细说明我的原始答案,为了能够将数据发送到连接的对等点,有必要维护对为每个对等点创建的 session 的引用。为此,我一直在使用可变字典。

在新 session 中发送/接受邀请后,使用 MCSession 委托(delegate)方法更新字典:

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

    if (state==MCSessionStateConnected){

        _myPeerSessions[peerID.displayName] = session;

    }
    else if (state==MCSessionStateNotConnected){

        //This is where the session can be disconnected without
        //affecting other peers
        [session disconnect];            

        [_myPeerSessions removeObjectForKey:peerID.displayName];
    }
}

可以使用返回字典所有值的方法访问所有对等点,然后返回每个 MCSession 的所有 connectedPeers(在本例中为一个):

- (NSArray *)allConnectedPeers {

   return [[_myPeerSessions allValues] valueForKey:@"connectedPeers"];

}

可以使用如下方法将数据发送到特定节点或通过广播:

- (void)sendData:(NSData *)data toPeerIDs:(NSArray *)remotePeers reliable:(BOOL)reliable error:(NSError *__autoreleasing *)error {

    MCSessionSendDataMode mode = (reliable) ? MCSessionSendDataReliable : MCSessionSendDataUnreliable;

    for (MCPeerID *peer in remotePeers){

       NSError __autoreleasing *currentError = nil;

       MCSession *session = _myPeerSessions[peer.displayName];
       [session sendData:data toPeers:session.connectedPeers withMode:mode error:currentError];

       if (currentError && !error)
        *error = *currentError;
    }
}

关于ios - Multipeer Connectivity Framework - Lost Peer 留在 session 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23014523/

相关文章:

ios - 跨 View Controller 发送 UITableViewCell

ios - UIPageViewController 点不显示

PHP session_id 在页面之间或刷新页面时发生变化

java - session - servlet,在 sevlet 中,我将静态变量设置为某些内容,并且这对于所有 session 都保持不变

ios - 多点连接自动静默连接

objective-c - iPhone应用程序中的didReceiveMemoryWarning中的消息

ios - 表情符号未显示,取而代之的是奇怪的字符

session - 由于 session 存储,很可能无法在本地扩展 socket.io

ios - 将音频流式传输到其他 iOS 设备(使用 multipeer)并通过本地设备播放音频

connection - webRTC 多点连接(3 个客户端及以上)