1

P2P アプリケーションを実装しようとしています。私がやろうとしているのは、デバイス間でカスタム NSObject クラスのデータを転送することです。「receivedData」メソッドが GKSession によって呼び出されるタイミングを把握できません。

これが私がやったことです

  1. 通常の接続とピアとのダイアログ ボックスの表示

  2. アプリがピアの状態変更を受信し、状態が Connected の場合、NSCoding メソッドを使用してすべてのピアにデータを送信します (理想的には、各ピアが接続を受け入れるときにこれを呼び出す必要があります)。

  3. receivedData では、NSData をデコードして NSObject インスタンスを取得しています

問題は、両方のデバイスでsession:peer:didChangeState:メソッドが呼び出されないことです。PeerPicker アラートで「接続」ボタンをタップしたデバイスで呼び出されるだけです。

質問

  1. didChangeState はいつ、誰のために呼び出されますか? ピアが接続されているときにピアごとに呼び出されるべきではありませんか?

  2. receivedData: メソッドはいつ、誰のために呼び出されますか? メッセージの受信 (ハンドシェイク) を確認するために呼び出されるのか、それとも他のピアから送信されたデータを送信するために呼び出されるのか?

助けてくれてありがとう。

4

1 に答える 1

4

「ピアツーピア」ではなく「マスター/スレーブ」と考えてください。おそらく、両方の側が GameKit でセットアップされ、デリゲートが割り当てられています。接続を開始する一方の側は、GKPeerStateConnected状態変更値を介して、受信者が招待を受け入れ、接続が確立されたことを通知され、送信を開始できます。

ただし、受信側は、誰かがdidReceiveConnectionRequestFromPeerデリゲート メソッドを介して通信したいという最初の通知を受け取ります。acceptConnectionFromPeer後で使用するためにセッションを保存し、向きを変えてそれを受け入れるように呼び出します。それ以降は、メソッドを介して送信されたものをすべて取得しreceiveDataます。

これを行う最善の方法は、それぞれの側の状態を管理する小さなステート マシンを用意することです。送信者は、イベントを取得した場合にのみ送信しますGKPeerStateConnected。受信側はconnected、接続要求を受け入れると状態になり、データの取得を開始する前に必要な設定を行うことができます。

ネットワークの抽象化はGKSession受信者であるため、受信者は向きを変えて、入ったのと同じセッションインスタンスを使用し、それを使用して送信者に書き戻すことができます(送信者は受信者からの応答で呼び出されるdidReceiveConnectionRequestFromPeer独自のメソッドを持つ必要があります)。receiveData

覚えておくべき 1 つのことは、GameKit を介して送信できるバッファーには暗黙的なデータ サイズの制限があるということです。それがあなたのシステムに合うものを見つけるために実験したいと思うかもしれません (私は 5K から 10K の間の何かを得ます - 何らかの理由でそれは異なります)。NSData をチャンクに分割し、データのパケット化/非パケット化を管理するコードが必要になる場合があります。

于 2009-07-05T21:50:36.317 に答える