2013-11-02 5 views
5

Ich bin im Moment wirklich fest, versucht zu bekommen, die Einladungen in das MultipeerConnectivityFramework zu erfassen.MultipeerConnectivity Sitzungsverwaltung

Im Moment habe ich eine iPad-App als Werbetreibender und eine iPhone-App als Browser. Ich habe eine sharedService für die MultipeerFramework implementiert und hat die folgenden:

Advertiser

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

Aber dann als Feedback in die Konsole Ich erhalte:

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

Wenn ich nach den gefundenen Werbetreibenden suche, ist alles in Ordnung. Mein Werbetreibenden-iPad wird gefunden. Aber wie kann ich die Einladung verwalten?

So bekomme ich es jetzt nicht ... Wenn ich eine Einladung vom Browser senden, welche Sitzung muss ich verwenden? Auf dem iPad habe ich die Sitzung so eingerichtet, wie Sie es in der Methode "automaticAdvertiseWithName" sehen können. aber auf dem iphone mache ich das nicht wenn ich "automaticBrowsingWithName" anrufe ... Ist das das Problem? Und müssen sie nicht dieselbe Sitzung sein, um sie erfolgreich zu verbinden? Und wie kann ich mein Werbetreibenden-ipad erfolgreich zum Browser einladen?

Ich bin verwirrt von der Idee, eine neue Sitzung zu erstellen, wenn eine bereits vom Werbetreibenden erstellt wurde.

Ich bin eigentlich nicht sicher, ob der Delegat didReceiveInvitation überhaupt den Peer zu den angeschlossenen Peers hinzufügt.

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

Und wenn ich die Eigenschaft „connectedPeers“ auf meine Session nennen, gibt es keine verbundenen Peers überhaupt, obwohl die Delegierten einen gefunden. Habe ich da einen Fehler gemacht?

Antwort

3

Ihr Problem ist, dass Ihre Sitzung zum Zeitpunkt des Aufrufs von invitePeer null ist: toSession: withContext: timeout ... Wie auch immer, Sie haben zwei Möglichkeiten, dies zu beheben.

Sie haben zwei Möglichkeiten:
Option 1 - bewegen Sie die peerID Schöpfung, seine Sitzung Schaffung und Sitzung Delegiertenzuweisung in einem Ort, wo zu jeder Zeit ausgeführt. Zum Beispiel im Init-Code für die MultipeerConnectivityService-Klasse, wenn es ein UIViewController in der ViewDidLoad ist.

Option 2 - das folgende Snippet hinzufügen, bevor Sie rufen "invitePeer: toSession: withContext: Timeout:"

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

Hoffnung!

+0

Danke !! Ich ging für Option 2 und es funktioniert perfekt! Das Sitzungskonzept war ein bisschen schwierig, zuerst mein Gehirn zu wickeln. Ich dachte immer, ich müsste die gleiche Sitzung für beide verwenden .... – sesc360

+0

Froh Option 2 geholfen! – Beuz

+0

Ich bin damit auch verwirrt. Ich weiß, dass ein Browser seiner Sitzung Peers hinzufügen soll, aber ich bin mir immer noch nicht sicher, was der Werbetreibende richtig machen soll. Im Moment gehe ich davon aus, dass, wenn der Werbetreibende eine Sitzung in "invitationHandler" anbietet, diese irgendwie mit der Sitzung "verschmolzen" wird, zu der der Browser sie hinzufügt. @Beuz oder @ISARFAKTOR, falls du Einsichten hast, teile bitte. – Yazid