我正在使用 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;
}
所有设备都会出现此问题。
我在苹果开发论坛找到了一个非常有用的答案。
这里是链接。
基本上解决这个问题的是回收
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];
}
}