2013-09-30 9 views
10

Mam problem z utrzymaniem połączenia za pomocą programu Multipeer Connectivity Framework w iOs7. Obecnie moja aplikacja programowo obsługuje przeglądanie i reklamowanie za pomocą MCNearbyServiceAdvertiser i MCNearbyServiceBrowser. Mam widok alertu, który pyta użytkownika, czy jest przeglądarką, czy reklamodawcą. Po powrocie z tego widoku tworzę instancję odpowiednio MCNearbyServiceAdvertiser lub Browser.Rozłączanie wielu światłowodów

#pragma - Alert Delegate 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0) 
    { 
     _browser = [[MCNearbyServiceBrowser alloc]initWithPeer:_peerID serviceType:@"Context-xl"]; 
     [_browser setDelegate:self]; 
     [self.detailViewController setRemote:YES]; 
     [_browser startBrowsingForPeers]; 
    } else 
    { 
     _advertiser = [[MCNearbyServiceAdvertiser alloc]initWithPeer:_peerID discoveryInfo:nil serviceType:@"Context-xl"]; 
     [_advertiser setDelegate:self]; 
     [self.detailViewController setRemote:NO]; 
     [_advertiser startAdvertisingPeer]; 
    } 
    [self.detailViewController configureView]; 
} 

Moja sesja delegat metoda wzajemnej ... DidChangeState ... jest uzyskiwanie wywołana dwukrotnie, raz na connect i ponownie na wyłączniku. Nie zatrzymuję reklamodawcy ani przeglądarki po rozpoczęciu sesji. Czy powinienem przerwać przeglądanie/reklamę?

+0

Nadal nad tym pracuję. Pomyślałem, że być może ustawienie punktów przerwania powoduje odłączenie urządzeń, co wydaje się być w rzeczywistości. Jednak urządzenia nie pozostają połączone podczas normalnego działania. –

+1

Mam ten sam problem. Urządzenia łączą się nieco, a następnie odłączają i nie pozostaną podłączone lub ponownie się połączą. –

+0

To się zdarzyło, kiedy robiłem przesyłanie plików za pomocą metody sendData: ToPeer MCSession. Odtąd przełączam się do otwierania strumienia przy użyciu metody startStream: withName, a urządzenia pozostają w kontakcie. –

Odpowiedz

6

EDIT Używane zgłoszenie do pomocy technicznej z Apple, a oni potwierdzili, że nazywając sendData zbyt dużo danych lub zbyt często może powodować rozłączenie.

EDYTOWANIE Moja hipoteza jest taka, że ​​Apple ma wątek lub kolejkę, które są odpytywane, aby sprawdzić, czy rówieśnicy są podłączeni. Jeśli ten wątek/kolejka przestanie działać (to znaczy, że punkt przerwania zostanie trafiony lub aplikacja zaczepia procesor lub robi coś, co trwa chwilę w głównym wątku), wydaje się, że powoduje to rozłączenie.

Utworzenie sesji bez szyfrowania prawdopodobnie pomogło w wydajności i przy rozłączeniach, mimo że nadal się zdarzają.

MCPeerID* peerId = [[MCPeerID alloc] initWithDisplayName:self.displayName]; 
self.peer = [[MultiPeerPeer alloc] initWithDisplayName:peerId.displayName andPeer:peerId]; 
self.session = [[MCSession alloc] initWithPeer:peerId securityIdentity:nil encryptionPreference:MCEncryptionNone]; 

Ponadto znalazłem nazywając sendData zbyt często (więcej niż 30-60 razy na sekundę) może spowodować, że ramy dostać w złym stanie i spowodować zamarza i rozłącza.

+0

Właściwie rozmawiałem z inżynierem Apple, który pracował nad łącznością z wieloma urządzeniami równorzędnymi, i potwierdzili, że zbyt częste wywoływanie sendData może powodować problemy. Może iOS 8 to naprawi, zobaczymy ... – jjxtra

+0

Hej, głupku, żeby wiedzieć. Czy masz link do zgłoszenia do pomocy technicznej? – Omer

+0

@Omer niestety e-mail został usunięty. – jjxtra

Powiązane problemy