MultipeerConnectivity - MCNearbyServiceBrowser постоянно находит отключенных партнеров

Я работаю с MultipeerConnectivity Apple Framework. Соединение, рекламодатель и браузер, кажется, работают очень хорошо до сих пор, но я замечаю, что, когда моя любая сессия соединяется с партнером, тогда он отключается по любой причине. MCNearbyServiceBrowser все еще находя этого пира, даже если его больше не существует. очевидно MCSession сообщает о не связанном состоянии со сверстником.

У кого-нибудь есть представление о том, почему это происходит?

Я переопределил метод dealloc в моем классе обработчика mc следующим образом:

- (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 ответ

Решение

Я нашел действительно полезный ответ на форумах Apple Dev.

Здесь ссылка.

В основном это решило проблему утилизации 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];
    }
}
Другие вопросы по тегам