2009-07-05 6 views
1

Ich versuche eine P2P-Anwendung zu implementieren. Ich versuche, die Daten einer benutzerdefinierten NSObject-Klasse zwischen den Geräten zu übertragen. Ich bin nicht in der Lage herauszufinden, wann die Methode "receivedData" von GKSession aufgerufen wird.iPhone - wie werden Daten in P2P übertragen

Hier ist, was ich

  1. Die übliche Verbindung und zeigt ein Dialogfeld mit Gleichaltrigen

  2. Wenn der App erhält eine Zustandsänderung für einen Peer und der Staat verbunden ist, getan habe, ich bin Senden der Daten an alle Peers (idealerweise sollte dies aufgerufen werden, wenn jeder Peer die Verbindung annimmt) unter Verwendung von NSCoding-Methoden

  3. In receivedData dekodiere ich die NSData und zurück die NSObject-Instanz

Das Problem ist die Sitzung: Peer: didChangeState: Methode ist nicht auf beiden Geräten immer genannt. Es wird nur auf dem Gerät aufgerufen, das in der PeerPicker-Warnung auf die Schaltfläche "Verbinden" geklickt hat.

Fragen

  1. Wenn didChangeState und für wen genannt wird? Sollte es nicht für jeden Peer aufgerufen werden, wenn sie verbunden sind?

  2. Wann wird die receivedData: -Methode aufgerufen und für wen? Wird es aufgerufen, um den Empfang einer Nachricht (Handshake) zu bestätigen oder nur die von anderen Peers gesendeten Daten zu übertragen?

Danke für jede Hilfe.

Antwort

4

Denken Sie eher an 'Master/Slave' als an 'Peer to Peer'. Vermutlich wurden beide Seiten mit GameKit eingerichtet und ihre Delegierten zugewiesen. Die eine Seite, die die Verbindung initiiert, wird über den GKPeerStateConnected Statusänderungswert benachrichtigt, dass der Empfänger die Einladung angenommen hat und eine Verbindung hergestellt wurde, so dass mit dem Senden von Daten begonnen werden kann.

Die empfangende Seite bekommt jedoch ihre erste Nachricht, dass jemand mit ihm durch die didReceiveConnectionRequestFromPeer Delegiertenmethode sprechen möchte. Es speichert die Sitzung für die spätere Verwendung, dreht sich dann um und ruft acceptConnectionFromPeer an, um es zu akzeptieren. Von da an bekommt es alles, was über die receiveData-Methode gesendet wird.

Der beste Weg, dies zu tun, ist eine kleine State-Maschine, die verwaltet, welcher Zustand jeder Seite ist. Der Absender sendet nur, wenn es das GKPeerStateConnected Ereignis bekommen hat. Der Empfänger wird in den Status connected versetzt, sobald er eine Verbindungsanforderung akzeptiert, damit er alle erforderlichen Einstellungen vornehmen kann, bevor er mit dem Datenempfang beginnt.

Da das Netzwerk Abstraktion GKSession kann der Empfänger dann umdrehen und verwendet die gleiche Sitzung Instanz es in didReceiveConnectionRequestFromPeer bekam und verwenden Sie es an den Absender zurück zu schreiben (der seine eigene receiveData Methode mit Antworten vom Empfänger genannt haben sollte) .

Die eine Sache zu beachten ist, dass es eine implizite Datengrößenbeschränkung für den Puffer gibt, den Sie über GameKit senden können. Vielleicht möchten Sie experimentieren, um herauszufinden, was das für Ihr System ist (ich bekomme etwas zwischen 5K und 10K - aus irgendeinem Grund variiert es).Sie möchten vielleicht Code haben, um Ihre NSData in Chunks aufzuteilen und das Paketieren/Entpaketieren der Daten zu verwalten.

+0

Vielen Dank. Das klärt Dinge .. – lostInTransit

+0

Ich hoffe, dass Sie bereits für Apple arbeiten. Diese Erklärung sollte die offizielle Dokumentation sein. – typeoneerror