2013-09-30 172 views
10

我在使用io7中的Multipeer连接框架保持连接时遇到问题。目前我的应用程序使用MCNearbyServiceAdvertiser和MCNearbyServiceBrowser以编程方式处理浏览和广告。我有一个警告视图,询问用户他是浏览器还是广告客户。在从该视图返回时,我相应地实例化了MCNearbyServiceAdvertiser或Browser。多路连接断开连接

#pragma - Alert Delegate 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0) 
    { 
     _browser = [[MCNearbyServiceBrowser alloc]initWithPeer:_peerID serviceType:@"Context-xl"]; 
     [_browser setDelegate:self]; 
     [self.detailViewController setRemote:YES]; 
     [_browser startBrowsingForPeers]; 
    } else 
    { 
     _advertiser = [[MCNearbyServiceAdvertiser alloc]initWithPeer:_peerID discoveryInfo:nil serviceType:@"Context-xl"]; 
     [_advertiser setDelegate:self]; 
     [self.detailViewController setRemote:NO]; 
     [_advertiser startAdvertisingPeer]; 
    } 
    [self.detailViewController configureView]; 
} 

我的会话委托方法peer:... DidChangeState ...被调用两次,一次用于连接,一次用于断开连接。会议开始后,我根本没有停止广告客户或浏览器。我应该停止浏览/广告吗?

+0

我一直在努力。我认为设置断点可能导致设备断开连接,实际情况似乎如此。但是,正常运行时,设备不会保持连接状态。 –

+1

我遇到同样的问题。设备连接一会然后断开连接,不会保持连接或重新连接。 –

+0

当我使用MCSession的sendData:ToPeer方法进行文件传输时,发生了很多事情。自从使用startStream:withName方法切换到打开流之后,设备一直处于连接状态。 –

回答

6

编辑与Apple一起使用支持票证,他们确认使用太多数据调用sendData或者经常会导致断开连接。

编辑我的假设是,苹果有一个线程或队列轮询检查对端是否连接。如果此线程/队列停顿(即命中断点或应用程序挂住CPU或在主线程上执行某些操作需要一段时间),看起来会导致断开连接。

在没有加密的情况下创建我的会话似乎帮助了性能和断开连接,虽然它们仍然发生。

MCPeerID* peerId = [[MCPeerID alloc] initWithDisplayName:self.displayName]; 
self.peer = [[MultiPeerPeer alloc] initWithDisplayName:peerId.displayName andPeer:peerId]; 
self.session = [[MCSession alloc] initWithPeer:peerId securityIdentity:nil encryptionPreference:MCEncryptionNone]; 

另外,我发现打电话送出数据过于频繁(超过30-60次),可能会导致该框架在一个糟糕的状态得到,并导致冻结和断开。

+0

我实际上是跟从事多对等连接的Apple工程师交谈过的,他们证实,经常调用sendData可能会导致问题。也许iOS 8会解决这个问题,我们将会看到... – jjxtra

+0

嘿,一定要知道。你有支持票的链接吗? – Omer

+0

@Omer不用担心电子邮件已被删除。 – jjxtra