2014-11-04 5 views
0

Я знаю, что этот вопрос задавался много раз, но после прочтения каждого из них более нескольких раз, я до сих пор не могу заставить мой Multipeer Connectivity работать. Я отправляю, но не получаю приглашение. Вот код:iOS Multipeer Connectivity didReceiveInvitationFromPeer не

@implementation MPCManager 

- (id)init { 
    self = [super init]; 

    if (self) { 
    _myPeerID = nil; 
    _session = nil; 
    _browser = nil; 
    _advertiser = nil; 
    } 

    return self; 
} 

- (void)automaticBrowseAndAdvertiseWithName:(NSString *)displayName { 
    _myPeerID = [[MCPeerID alloc] initWithDisplayName:displayName]; 
    _session = [[MCSession alloc] initWithPeer:_myPeerID]; 
    _session.delegate = self; 

    _advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:_myPeerID 
                discoveryInfo:nil 
                serviceType:@"trm-s"]; 
    _advertiser.delegate = self; 
    [_advertiser startAdvertisingPeer]; 

    _browser = [[MCNearbyServiceBrowser alloc] initWithPeer:_myPeerID 
               serviceType:@"trm-s"]; 
    _browser.delegate = self; 
    [_browser startBrowsingForPeers]; 
} 

- (void)session:(MCSession *)session 
    didReceiveCertificate:(NSArray *)certificate 
       fromPeer:(MCPeerID *)peerID 
     certificateHandler:(void (^)(BOOL accept))certificateHandler { 
    certificateHandler(YES); 
} 

- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser 
    didReceiveInvitationFromPeer:(MCPeerID *)peerID 
        withContext:(NSData *)context 
       invitationHandler:(void (^)(BOOL, 
              MCSession *))invitationHandler { 
    NSLog(@"This is NOT getting called"); 
} 

- (void)browser:(MCNearbyServiceBrowser *)browser 
    didNotStartBrowsingForPeers:(NSError *)error { 
    NSLog(@"%@", [error localizedDescription]); 
} 
- (void)browser:(MCNearbyServiceBrowser *)browser 
      foundPeer:(MCPeerID *)peerID 
    withDiscoveryInfo:(NSDictionary *)info { 
    NSLog(@"This IS getting called"); 
} 

- (void)invitePeer:(MCPeerID *)peerID { 
    NSLog(@"This IS getting called"); 
    [_browser invitePeer:peerID toSession:_session withContext:nil timeout:30]; 
} 

Я бегу это на двух тренажерах, и он работал в течение некоторого времени, но вдруг остановился. Любые идеи о том, как и где искать проблему?

+1

С какой ОС и версией вы работаете здесь? Я обнаружил, что вы должны сериализовать объекты MCPeerID и повторно использовать их, если имя устройства не изменилось. В противном случае процесс просмотра может быть загрязнен дубликатами. Это работает, если вы запускаете его на реальном оборудовании? – macshome

+0

I _Product/Clean_-ed мой проект и сбрасывает симулятор с помощью _iOS Simulator/Reset Content and Settings ..._, и он снова работает, поэтому я думаю, проблема была в том, что вы упомянули. Не могли бы вы преобразовать его, чтобы ответить, чтобы я мог принять его? –

+1

Я добавил свой ответ. В сеансе, который я связал, есть код для обработки сериализации объектов MCPeerID. Только один совет внес большой вклад в мой код мультиплеера. – macshome

ответ

3

Убедитесь, что вы, по возможности, сериализуете и повторно используете объекты MCPeerID. Каждый раз, когда вы вызываете - (instancetype)initWithDisplayName:(NSString *)myDisplayName, он возвращает уникальный экземпляр.

Что часто случается в среде разработчиков, так это то, что вы получаете поток рекламодателей и браузеров и тонну дубликатов призраков в рекламном пространстве Bonjour. Это может привести к тому, что все пойдет не так.

Если вы используете тренажеры, то их сброс может помочь. На аппаратном уровне вы можете перезапустить или переключить режим самолета.

Посмотрите на this year's WWDC session на Multipeer под названием «Кросс-платформенная сеть». У этого есть некоторые хорошие лучшие практики, чтобы следовать, это поможет очень.

+0

, когда вы говорите 'serialize', я думаю, что хранить как двоичный файл, но это означает, что это означает, что переменная класса указывает на объект PeerID? Я не уверен, как явно сериализовать что-то другое, кроме того, что это данные, принадлежащие определенному классу, и хотел убедиться, что это все, что вы имели в виду для людей, которые могли бы сделать в ваших советах. – ecoe

+0

Да, сериализуйте и сохраните его, чтобы объект не запускался для запуска вашего приложения. Проверьте, что сессия WWDC с 22:30 и далее. – eddybox

Смежные вопросы