MultipeerConnectivity – MCNearbyServiceBrowser不断寻找断开的对等点

我正在使用MultipeerConnectivity Apple框架。 连接,广告客户和浏览器似乎到目前为止工作得很好,但我注意到,当我的任何会议连接一个对等,然后由于任何原因,我的MCNearbyServiceBrowser仍然find该对等,即使它不再存在断开连接。 显然, MCSession报告与对等体没有连接状态。

有没有人有一个想法,为什么发生这种情况?

我已经覆盖了我的MC处理程序类中的dealloc方法,如下所示:

 - (void)dealloc { [self.session disconnect]; self.peerId = nil; self.session = nil; self.browser = nil; self.advertiser = nil; self.session.delegate = nil; self.browser.delegate = nil; self.advertiser.delegate = nil; } 

我也有一个拆卸方法:

 - (void)teardownService { [self.session disconnect]; self.session = nil; self.advertiser = nil; self.browser = nil; self.session.delegate = nil; self.browser.delegate = nil; self.advertiser.delegate = nil; } 

所有设备都会发生这个问题。

我在苹果开发者论坛发现了一个非常有用的答案。

这里的链接 。

基本上解决这个问题是回收MCPeerID 。 当创build对象时,我将其序列化并存储在NSUserDefaults 。 而且任何时候我都需要它,比如当我拆掉服务并重新启动时,我会去存储的对象,而不是创build一个新的对象。

您可以在上面的附加链接中find下一个示例代码:

 - (MCPeerID *)peerID { if (!_peerID) { _peerID = [MyClassName getRecycledPeerID]; } return _peerID; } + (MCPeerID *)getRecycledPeerID { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // if peer id exists, use that; else create one if ([defaults objectForKey:kRECYCLED_PEER_ID]) { NSData *peerIDData = [defaults dataForKey:kRECYCLED_PEER_ID]; return [NSKeyedUnarchiver unarchiveObjectWithData:peerIDData]; } else { return [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name]; } }