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ì?
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
La felice opzione 2 ha aiutato! – Beuz
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