MultipeerConnectivity - MCNearbyServiceBrowser 不断寻找断开连接的对等点

问题描述 投票:0回答:1

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

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

ios objective-c ios8 multipeer-connectivity
1个回答
4
投票

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

这里是链接

基本上解决这个问题的是回收

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];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.