ios – 多线连接框架 – 失败的同伴停留在会话中

前端之家收集整理的这篇文章主要介绍了ios – 多线连接框架 – 失败的同伴停留在会话中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道这个Multiper Connectivity框架是否准备好在现实世界中使用,因为社区遇到的所有错误.我想我正在设置它,但我尝试过的所有其他示例项目遇到类似的问题.

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

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

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

由于似乎没有办法手动强制从会话中删除对等体,应该怎么办?我应该尝试重建会话吗?

这个框架似乎有点乱七八糟,但是我试图保留判断!

解决方法

这种类型问题的唯一解决方法是在会话和对等体之间建立1-1关系.广播发送复杂化,但至少允许通过断开/删除会话本身来进行对等级的断开连接和清除.

更新

要详细说明我的原始答案,为了能够将数据发送给连接的对等体,有必要保持对每个对等体创建的会话的引用.我一直在使用一个可变字典.

一旦邀请被发送/接受了一个新的会话,使用MCSession委托方法来更新字典:

- (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;
    }
}
原文链接:https://www.f2er.com/iOS/337286.html

猜你在找的iOS相关文章