私はピアツーピアのiPhoneゲームがかなりうまく機能している。利用可能なピアを表示するテーブルを作成しました。(これまでのところ)最大4つのデバイスを接続して、ゲームの最初から最後までフルラウンドでプレイできます。
しかし、ここに私の問題があります...
GKSession
を使用して一方のデバイスで作成し、を使用してもう一方のデバイスを作成GKSessionModeClient
しGKSessionModeServer
ます。クライアントはサーバーを確認し、接続を選択してから、サーバーが承認します。すべてのピアが接続されたら、サーバーは「ゲームの開始」をタップできます。
サーバーがゲームを開始する前に、クライアントが「戻る」ボタンをタップして前の画面に移動した場合、カスタムピアピッカーの表示がビューからポップされ、セッションが「破棄」されます...
[_gkSession disconnectFromAllPeers];
[_gkSession setAvailable:NO];
[_gkSession setDelegate:nil];
[_gkSession setDataReceiveHandler:nil withContext:nil];
ここで、クライアントがピアピッカーに戻ってサーバーに再度参加すると、GKSessionStateConnected
状態が再び取得されsendDataToAllPeers:
ますが、クライアントに何も到達しない場合。1つのデバイスがゲームを開始し、3つのデバイスが参加してから、サーバーが「ゲームの開始」をタップすると、問題なく動作します。ただし、ゲームが開始する前に誰かが終了した場合、セッションの再作成と参加は失敗します。
何か案は?この時点で考えられる唯一のハックは、ユーザーがサーバーに接続したときに「戻る」をタップできないようにすることですが、そのようなことはやっかいです...気が変わったらアプリを完全に終了する必要があります。この接続の問題を除いて、アプリが実行されているので、私はこれで終わりです。一種のエッジケースですが、セッションをクリアするためにアプリケーションを再起動せずにゲームを開始できない場合、ユーザーがイライラしているのを見ることができます。
できればこれを賞金にします。助けてください!
@byteclubを編集
- ゲームが始まる前にクライアントが離れた場合、サーバーは関連するすべてのデータ構造を正しくクリーンアップしますか?
サーバーが接続を受け入れた後にクライアントがゲームロビーを離れると、クライアントのセッションは破棄されます。
- (void)destroySession
{
trace(@"destroySession");
self.gameDelegate = nil;
self.lobbyDelegate = nil;
[_gkSession disconnectFromAllPeers];
[_gkSession setAvailable:NO];
[_gkSession setDelegate:nil];
[_gkSession setDataReceiveHandler:nil withContext:nil];
[_peerList removeAllObjects];
}
ただし、サーバーデバイスでdisconnectFromPeersメソッドを呼び出すことはありません。
* Is the client-disconnect-cleanup procedure different for cases when the
ゲームはもう始まっていますか?
少しだけ、クライアントが切断すると、全員が「ピア終了」通知を受け取り、ゲームが終了します。この場合、再接続の心配はありません。これは主に、クライアントが「キャンセル」して問題のあるホーム画面に戻ることができるゲームロビーにあります。この場合、クライアントのセッションは破棄されます。その後、ロビーに戻って新しいGKSessionが割り当てられた場合でも、サーバーに接続できますが、接続するとsendDataToAllPeersは機能しなくなります。
* Do you still have a problem if, before reconnecting, you restart the
クライアントですが、サーバーはそのまま実行しますか?
クライアントはどのような場合でも再接続できます。終了して戻ってアプリを再起動し、問題なく再接続できます。サーバーとクライアントの両方を再起動しない限り、sendDataToPeersは失敗します。
* Do you completely destroy GKSession object on the client side
ユーザーが「戻る」をタップすると?
はい。(上記のコードを参照)
これはおそらく遠くからデバッグするのは非常識だと思いますが、私が調べられることについて何か提案があれば、それをいただければ幸いです。