我正在使用 MultipeerConnectivity Apple框架。连接,广告客户和浏览器似乎一直运行到现在,但我注意到,当我的任何会话连接一个对等端时,它会因任何原因而断开连接,即使它不存在,我MCNearbyServiceBrowser
仍然找到该对等端。显然,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;
}
所有设备都会出现此问题。
答案 0 :(得分:4)
我在Apple Dev论坛上找到了一个非常有用的答案。
这里是link。
基本上解决了这个问题的是回收MCPeerID
。创建对象后,我将其序列化并存储在NSUserDefaults
中。无论什么时候我需要它,比如当我拆掉服务并再次启动它时,我会转到存储的对象并使用它而不是创建一个新的。
您可以在上面附带的链接中找到下一个示例代码:
- (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];
}
}