Frage

Ich versuche, eine P2P Anwendung zu implementieren. Was ich versuche zu tun ist, eine benutzerdefinierte NSObject Klasse Daten zwischen den Geräten zu übertragen. Ich bin nicht in der Lage, herauszufinden, wenn die „receivedData“ -Methode von GKSession aufgerufen wird.

Hier ist, was ich getan habe,

  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, ich bin die Daten an alle Peers zu senden (im Idealfall sollten diese aufgerufen werden, wenn jeder Peer die Verbindung akzeptiert) mit NSCoding Methoden

  3. In receivedData ich die NSData bin Decodierung und die NSObject Instanz immer wieder

Das Problem ist die Sitzung: Peer: didChangeState: Methode ist nicht auf beiden Geräten immer genannt. Es wird nur auf dem Gerät aufgerufen, die die Schaltfläche „Verbinden“ in der PeerPicker Alarm abgegriffen wird.

Fragen

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

  2. Wenn das receivedData: Methode aufgerufen und für wen? Ist es den Empfang einer Nachricht (Handshake), um zu bestätigen genannt oder nur die Daten, die von anderen Peers gesendet zu übertragen?

Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Denken Sie daran, mehr als 'Master / Slave' anstelle von 'Peer-to-Peer'. Vermutlich beide Seiten wurden mit GameKit eingerichtet und hatte ihre Delegierten zugewiesen. Die eine Seite, die die Verbindung initiiert wird über den GKPeerStateConnected Zustandsänderung Wert darüber informiert, dass der Empfänger die Einladung angenommen hat und eine Verbindung hergestellt wurde, so dass es Sachen Senden über beginnen.

Die Empfangsseite jedoch bekommt seinen ersten Hinweis, dass jemand will, um es durch die didReceiveConnectionRequestFromPeer Delegatmethode sprechen. Es speichert die Sitzung für eine spätere Verwendung dann dreht sich um und Anrufe acceptConnectionFromPeer es zu akzeptieren. Von da an wird es, was durch die receiveData Methode geschickt wird.

Der beste Weg, dies zu tun, ist eine wenig state-Maschine zu haben, was jede Seite Staat verwaltet, ist in. Der Sender sendet nur, wenn es das GKPeerStateConnected Ereignis bekommen hat. Der Empfänger wird in connected Zustand versetzt, sobald er eine Verbindungsanfrage akzeptiert, so dass es jede Einrichtung kann es tun muss, bevor es beginnt, Daten zu bekommen.

Da das Netzwerk Abstraktion des Empfängers GKSession kann dann umdrehen und verwenden 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).

Das einzige, was im Auge zu behalten ist, dass es eine implizite Datengrößenbeschränkung für den Puffer ist man durch GameKit senden kann. Sie können experimentieren möchten, zu finden, was das für Ihr System (ich etwas zwischen 5K und 10K - aus irgendeinem Grund variiert). Möglicherweise möchten Sie Code, um Ihre NSData in Stücke zu zerlegen und verwalten Paketierung / die Daten Depaketierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top