2013-11-02 24 views
5

Şu anda MultipeerConnectivityFramework uygulamasında davetleri yakalamaya çalışırken gerçekten sıkışmış durumdayım.MultipeerConnectivity Oturum yönetimi

Şu anda Reklamveren olarak hareket eden bir iPad uygulaması ve Tarayıcı olarak hareket eden bir iphone Uygulaması var. aşağıdaki MultipeerFramework için sharedService uygulanıp yaptılar var:

Reklamveren'i

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

Tarayıcı

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

Ama sonra konsolda geri bildirim olarak alıyorum:

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

Bulunan Reklamverenleri kontrol ettiğimde, her şey yolunda. Reklamverenim ipad bulunmakta. Ama daveti nasıl yönetebilirim?

Bu yüzden şu an anlayamıyorum ... Tarayıcıdan bir davetiye gönderdiğimde hangi oturumu kullanmak zorundayım? IPad'de, "automaticAdvertiseWithName" yönteminde görebileceğiniz gibi oturumu kurdum. ama iphone'da "automaticBrowsingWithName" çağrılırken bunu yapmam ... Bu sorun mu? Ve bunları başarılı bir şekilde bağlamak için aynı seansta olmaları gerekmez mi? Reklamveren ipad'ımı tarayıcıya nasıl başarılı bir şekilde davet edebilirim?

Reklamveren tarafından zaten oluşturulduğunda yeni bir oturum oluşturma fikri ile kafam karıştı.

Temsilci didReceiveInvitation, bağlıPeers'a eşleri ekliyorsa, aslında emin değilim.

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

Ve ben oturumda mülkiyet "connectedPeers" dediğimiz zaman, temsilci bir tane buldum bile, hiç bağlı eş vardır. Orada bir hata yaptım mı?

cevap

3

Sorununuz, invitePeer: toSession: withContext: timeout çağrısı yaptığınız anda oturumunuzun boş olması. Bunu düzeltmek için iki seçeneğiniz var. - onun bütün anda yürütülen bir yerde peerID oluşturma, oturum oluşturma ve seans temsilci atama hareket
Seçenek 1 :

İki seçeneğiniz vardır. Örneğin, viewDidLoad öğesindeki bir UIViewController öğesi olan MultipeerConnectivityService sınıfı için init kodunda.

Seçenek 2 - Eğer aramadan önce aşağıdaki ön bilgi eklemek "invitePeer: toSession: withContext: zaman aşımı:" Bu yardımcı olur

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

Umut ... iyi şanslar!

+0

Teşekkürler! Seçenek 2'ye gittim ve gayet iyi çalışıyor! Oturum konsepti beynimi ilk önce sarmak için biraz zordu. Her zaman için SAME seansını kullanmam gerektiğini düşündüm. – sesc360

+0

Glad seçenek 2 yardımcı oldu! – Beuz

+0

Ben de bununla kafam karıştı. Bir tarayıcının oturumuna meslektaşları eklemek istediğini biliyorum, ancak reklamverenin doğru yapmak istediği şeyden hâlâ emin değilim. Şu anda, yalnızca reklamverenin 'invitationHandler' içinde bir oturum sağladığında, bir şekilde tarayıcının eklediği oturumla birleştirilmiş olduğunu varsayıyorum. @Beuz veya @ISARFAKTOR, bununla ilgili görüşleriniz varsa lütfen paylaşın. – Yazid