MultipeerConnectivity - MCNearbyServiceBrowser不断发现断开连接的对等体

时间:2014-10-27 18:52:14

标签: ios objective-c ios8 multipeer-connectivity

我正在使用 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;
}

所有设备都会出现此问题。

1 个答案:

答案 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];
    }
}