2013-11-02 4 views
5

Я действительно застрял в данный момент, пытаясь понять суть приглашений в MultipeerConnectivityFramework.MultipeerConnectivity Управление сеансом

Прямо сейчас у меня есть приложение ipad, действующее как рекламодатель и приложение iphone, действующее как браузер. я реализовал sharedService для MultipeerFramework и сделал следующее:

рекламодатель

@implementation MultipeerConnectivityService { 
    MCNearbyServiceAdvertiser *_advertiser; 
    MCSession *_session; 
    MCNearbyServiceBrowser *_browser;   
} 

- (void)automaticAdvertiseWithName:(NSString *)name { 
    MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name]; 
    _session = [[MCSession alloc] initWithPeer:peerID]; 
    _session.delegate = self; 

    _advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID discoveryInfo:nil serviceType:kServiceType]; 
    _advertiser.delegate = self; 
    [_advertiser startAdvertisingPeer]; 
} 

- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler { 
    invitationHandler([@YES boolValue], _session); 
    NSLog(@"Invitation accepted"); 
} 

Browser

- (void)automaticBrowsingWithName:(NSString *)name { 
    MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name]; 
    _browser = [[MCNearbyServiceBrowser alloc] initWithPeer:peerID serviceType:kServiceType]; 
    _browser.delegate = self; 
    [_browser startBrowsingForPeers]; 
} 

- (void)browser:(MCNearbyServiceBrowser *)browser didNotStartBrowsingForPeers:(NSError *)error { 
    if ([_delegate respondsToSelector:@selector(browser:didNotStartBrowsingForPeers:)]) { 
     [_delegate browserDidNotStartBrowsingForPeers]; 
    } 
} 
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info { 
    [browser invitePeer:peerID toSession:[self getMCSession] withContext:nil timeout:10]; 
    if ([_delegate respondsToSelector:@selector(browser:foundPeer:)]) { 
     [_delegate browser:browser foundPeer:peerID]; 
    } 
} 
- (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID { 
    if ([_delegate respondsToSelector:@selector(browserLostPeer:)]) { 
     [_delegate browserLostPeer:peerID]; 
    } 
} 

- (MCSession *) getMCSession { 
    return _session; 
} 

Но тогда я получаю в качестве обратной связи в консоли:

-[MCNearbyServiceBrowser invitePeer:toSession:withContext:timeout:] Bad argument session=nil 

Когда я проверяю найденных рекламодателей, все в порядке. Мой рекламодатель ipad находится. Но как я могу управлять приглашением?

Так что я не понимаю это сейчас ... Когда я отправляю приглашение браузером, какую сессию мне нужно использовать? На iPad я настроил сеанс, как вы можете видеть в методе autoAdvertiseWithName. но на iphone я не делаю этого при вызове «automaticBrowsingWithName» ... Это проблема? И разве они не должны быть тем же самым сеансом, чтобы успешно их соединить? И как я могу успешно пригласить своего рекламодателя ipad в браузер?

Меня смущает понятие создания нового сеанса, когда он уже был создан рекламодателем.

На самом деле я не уверен, если делегат didReceiveInvitation добавляет одноранговый узел к подключенным серверам вообще.

- (void)automaticAdvertiseWithName:(NSString *)name { 
    MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name]; 
    self.session = [[MCSession alloc] initWithPeer:peerID]; 
    self.session.delegate = self; 
    _advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID discoveryInfo:nil serviceType:kServiceType]; 
    _advertiser.delegate = self; 
    [_advertiser startAdvertisingPeer]; 
} 
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler { 
    BOOL accept = YES; 
    invitationHandler(accept, self.session); 
    NSLog(@"Invitation accepted: %@", self.session); 
} 

И когда я называю свойство «connectedPeers» на моей сессии, нет подключенных сверстники на всех, даже если делегат нашел. Я сделал ошибку там?

ответ

3

Ваша проблема в том, что ваш сеанс имеет значение null при вызове метода приглашения: toSession: withContext: timeout ... В любом случае у вас есть два варианта исправить это.

У вас есть два варианта:
Вариант 1 - двигают создание peerID, создания сеанса и назначения сессии делегата в месте, где его выполненном в любое время. Например, в коде инициализации для класса MultipeerConnectivityService, если его UIViewController в viewDidLoad.

Вариант 2 - добавьте следующий фрагмент код перед вызовом "invitePeer: toSession: withContext: тайм-аут:"

if (!_session) { 
     MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:@"Browser"]; // you can customize the name here 
    _session = [[MCSession alloc] initWithPeer:peerID]; 
    _session.delegate = self; 
} 

Надеется, что это помогает ... удаче!

+0

Спасибо! Я пошел на вариант 2, и он отлично работает! Концепция сеанса была немного сложна, чтобы сначала обернуть мой мозг. Я всегда думал, что мне придется использовать сеанс SAME для обоих. – sesc360

+0

Рад вариант 2 помог! – Beuz

+0

Я тоже смущен этим. Я знаю, что браузер предназначен для добавления сверстников на его сеанс, но я все еще не уверен, что рекламодатель должен делать по праву. На данный момент я просто предполагаю, что, когда рекламодатель предоставляет сеанс в 'приглашенииHandler', это как-то« сливается »с сеансом, к которому его добавляет браузер. @Beuz или @ISARFAKTOR, если у вас есть идеи, пожалуйста, разделите. – Yazid

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