2013-11-02 8 views
5

Sono davvero bloccato al momento cercando di ottenere la conoscenza degli inviti in MultipeerConnectivityFramework.MultipeerConnectivity Gestione sessione

In questo momento ho un'app ipad che funge da inserzionista e un'applicazione iphone che funge da browser. Ho implementato uno sharedService per la MultipeerFramework e ha fatto la seguente:

inserzionista

@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; 
} 

Ma poi io sono sempre come feedback nella console:

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

Quando controllo gli Advertiser trovati, tutto è OK. L'ipad dell'inserzionista è stato trovato. Ma come posso gestire l'invito?

Quindi non capisco subito ... Quando invio un invito dal browser, quale sessione devo usare? Sull'iPad ho impostato la sessione come puoi vedere nel metodo "automaticAdvertiseWithName". ma su iphone non lo faccio quando chiami "automaticBrowsingWithName" ... È questo il problema? E non devono essere la stessa sessione per collegarli con successo? E come posso invitare con successo l'ipad dell'inserzionista al browser?

Sono confuso dalla nozione di creare una nuova sessione quando ne è già stata creata una dall'inserzionista.

In realtà non sono sicuro, se il delegato ha fattoReceiveInvitation sta aggiungendo il peer ai connectedPeers.

- (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); 
} 

E quando io chiamo la proprietà "connectedPeers" sulla mia sessione, non ci sono peer connessi a tutti, anche se il delegato trovato uno. Ho fatto un errore lì?

risposta

3

tuo problema è che la sessione è nullo al momento si chiama invitePeer: toSession: withContext: timeout ... In ogni caso ci sono due opzioni per risolvere questo problema.

Sono disponibili due opzioni:
Opzione 1 - spostare la creazione peerID, creazione della sessione e assegnazione sessione delegato in un luogo dove la sua eseguito in tutti i tempi. Ad esempio nel codice init per la classe MultipeerConnectivityService se è un UIViewController in viewDidLoad.

Opzione 2 - aggiungere il seguente frammento di codice prima di chiamare "invitePeer: toSession: withContext: timeout:"

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

Spero che questo aiuti ... buona fortuna!

+0

Grazie !! Sono andato per l'opzione 2 e funziona perfettamente bene! All'inizio il concetto di sessione era un po 'difficile da avvolgere il mio cervello. Ho sempre pensato che avrei dovuto usare la sessione SAME per entrambi .... – sesc360

+0

La felice opzione 2 ha aiutato! – Beuz

+0

Mi confondo anche con questo. So che un browser è pensato per aggiungere peer alla sua sessione, ma non sono ancora sicuro di ciò che l'inserzionista intende fare di diritto. Al momento sto solo supponendo che quando l'inserzionista fornisce una sessione in "invitationHandler", che in qualche modo si "fonde" con la sessione a cui il browser la sta aggiungendo. @ Beuz o @ ISARFAKTOR, se hai approfondimenti su questo, per favore condividi. – Yazid