2016-01-04 14 views
14

sto lavorando su un progetto che utilizza quadro MC come un canale di comunicazione, e dopo alcuni test che ho la percezione che questo canale è in qualche modo instabile su cui contare.Multipeer quadro connettività: Stabilità e raccomandazioni

Ho seguito documentazioni e video di Apple al fine di utilizzare il quadro corretto, ma accade che:

  • coetanei disconnessi un po' spesso dopo appaiati, e ancora di più aver visto spesso se ho più di una coppia -peer.
  • alcuni pacchetti di dati hanno mescolato dati

C'è qualche tipo di raccomandazione per lavorare con il quadro? cioè:

  • Impostazioni specifiche di progetto? (Vale a dire: c'è qualcosa nella sezione di capacità che deve essere abilitato?)
  • restrizioni Multithreading? (Cioè: sempre chiamare metodi mc dallo stesso thread)
  • limitazioni in termini di quantità di dati da inviare?

Ho trovato il collegamento this che menziona qualcosa sul framework che non funziona bene sotto stress. Questo è il tipo di consiglio che sto cercando :).

Per la cronaca:

  • sto usando un'implementazione basata su this carica dal Apple's project non funziona per me.
  • sto utilizzando un solo MCSession per tutti i peer cerco di abbinare con
  • preferenza crittografia è impostato su MCEncryptionNone
  • Utilizzando sendData: e sendResourceAtURL: per comunicare con i coetanei.
+3

Dato quanto AirDrop è scadente, e come riesco a malapena a farlo funzionare, anche su un nuovo MacBook Pro e iPhone 6S Plus ... Penso che sia solo una cacca rotta e Apple dovrebbe vergognarsi. È come quando iCloud è uscito per la prima volta, nessuno di noi che ha provato a usare quel documento per la sincronizzazione della spazzatura, è stato come saltare prima nelle gambe di un cippatore di legno. – CommaToast

+0

Ho letto da qualche parte che durante la navigazione/i peer pubblicitari non vengono eseguiti sullo stesso dispositivo allo stesso tempo, aumenta la stabilità. Nella mia app, solo il mio dispositivo master cerca i peer, e i miei Slave fanno pubblicità, e sembra ridurre il ritardo della connessione bit e le disconnessioni abbassate. Spero possa aiutare. –

+0

"usa solo PubNub":/ – Fattie

risposta

2

che sto utilizzando il framework MC in un gioco e hanno trovato un paio di soluzioni alternative per la sua apparente instabilità:

1) Io uso un "tenere in vita" transazione inviata ogni 15 secondi per mantenere l'attività sul collegamenti. Ho scoperto che questo risolve quasi tutte le perdite di connessione che stavo vivendo.

2) Invio tutta la processazione avviata dalla ricezione dati al thread principale e non porto mai oggetti MCPeer né MCSession tra thread (tranne il protocollo di connessione iniziale). Ho anche fatto che per minimizzare il tempo trascorso nel codice di ricezione dati in modo che il filo utilizzato per MC riprende il controllo più velocemente possibile (che ho anche trovato era una fonte di alcuni disconnette). Non applicare questa regola per l'invio di dati (solo quando si riceve)

3) non ho trovato una soluzione pulita per la ripetizione di coetanei che appare quando si cerca di stabilire una connessione (sia utilizzando lo standard di interfaccia utente e la mia) . Finora il confronto tra gli ID MCPeer per evitare duplicati sembra solo rimuovere parte della duplicazione. Inoltre, sembrava che utilizzando lo stesso MCSession per la pubblicità (MCAdvertiserAssistant) e la connessione a coetanei causato alcuni conflitti in modo che io sto usando una nuova istanza MCSession separata ogni volta che mi metto l'assistente.

+0

Ehi, grazie. Riguardo i thread, è vero, c'è un suggerimento sulla documentazione. Circa 2 e 3 proverò a vedere se migliora la stabilità. Cheers – Omer

0

Lo sto utilizzando in un'app che trasferisce una grande quantità di dati regolarmente. Un paio di soluzioni alternative hanno contribuito:

  • Non appena viene stabilita la connessione a un peer, impostare una coppia NSOutputStream/NSInputStream utilizzare per la comunicazione. Non utilizzare affatto i dati di invio o inviare metodi di risorse nel framework di connettività multipeer.

  • Se si verifica una disconnessione imprevista, non è possibile attendersi lo stato dell'oggetto MCSession, strapparlo e ricominciare da capo. AGGIORNAMENTO: una disconnessione inattesa qui è uno dei flussi chiusi dall'altra parte della connessione.

  • Chiedi all'utente di verificare che tutti i dispositivi si trovino sullo stesso punto di accesso Wi-Fi. Se i peer si trovano sullo stesso segmento di rete, ma un Wifi diverso, i browser vedranno gli inserzionisti e saranno in grado di connettersi, ma si disconnetteranno pochi secondi dopo.

Aggiornamento:

Per stabilire un flusso di output:

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state 
{ 
    switch(state) 
    { 
     // ... 

     case MCSessionStateConnected: 
      outputStream = [session startStreamWithName:@"Stream" toPeer:peerID error:&error]; 
      // Setup a stream handler for the stream and open it 
      break; 
     // ... 
    } 
} 

Per stabilire un flusso di input, implementare questo metodo è MCSessionDelegate:

-(void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID 
{ 
    // Setup a stream handler for the stream and open it 
} 

Questo verrà chiamato come l'altra estremità della connessione si apre è il flusso di output.

Ora avete due flussi pronti all'uso per la comunicazione bidirezionale.

+0

Grazie per il tuo tempo, un paio di punti: • Qualche link su come usare 'NSStream' con MC nel modo giusto? Attualmente ho un'implementazione, ma non sono sicuro che sia corretta. • Cosa intendi per "errore imprevisto"? come identificare lo scenario in cui una sessione è corrotta? – Omer

Problemi correlati