我遇到的问题可能与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
由于似乎没有办法手动强制从会话中删除对等体,应该怎么办?我应该尝试重建会话吗?
这个框架似乎有点乱七八糟,但是我试图保留判断!
解决方法
更新
要详细说明我的原始答案,为了能够将数据发送给连接的对等体,有必要保持对每个对等体创建的会话的引用.我一直在使用一个可变字典.
一旦邀请被发送/接受了一个新的会话,使用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; } }