1

GKSession を使用してゲームをセットアップしています。これは 2 つのデバイスでうまく機能します。1 つのデバイスは GKSessionModeServer でセットアップされ、もう 1 つのデバイスは GKSessionModeClient でセットアップされます。

ただし、2 つ以上のクライアント (3 つのデバイス、1 つのホストと 2 つのクライアント) があるとすぐに、いずれかのクライアントがランダムに切断されます。エラー ハンドラー (didFailWithError または connectionWithPeerFailed) は呼び出されず、サーバーとクライアントの両方で didChangeState のみが呼び出されます。通常、切断は 1 分以内に発生しますが、それよりも短い場合もあります。

すべてのデバイス (2 つの iPhone と 1 つのシミュレーター) が同じワイヤレス ネットワーク上にあります。1 つの物理デバイスは iOS6.0.1 を実行し、もう 1 つの物理デバイスは 5.1.1 を実行し、シミュレーターへの接続時に両方とも接続を維持できます。問題が発生するのは、3 つのデバイス (2 つの実機、1 つのシミュレート) のみです。

どんな助けでも大歓迎です。

4

1 に答える 1

3

私は同じ問題を抱えていますが、私のアプリでは、3番目または4番目のクライアントを(ランダムに)接続するとこの問題が発生します。サーバーは切断イベントを取得しますが、クライアントはフリーズします。最後に接続したクライアントが常に数秒後に切断されることに気付きました。問題の解決方法がわかりません。ゲームキットを介してクライアント/サーバー接続を管理し、最大 15 のクライアントを管理できる idea flight というアプリを見つけました (GameKit のドキュメントで指定されています)。テストしたところ、動作しました。コードに頭を悩ませて3日目、標準ソケット通信への切り替えを考えているが、Bluetoothのサポートがなくなる。

編集:問題の理由が見つかりました。この問題は、iOS 6 と以前の iOS バージョンの両方を実行しているデバイスが混在してネットワークが構成されている場合に発生します。ネットワークが iOS6 を実行しているデバイスのみ、または以前のバージョンのみで構成されている場合は、すべて問題ありません。より正確には、これはクラッシュではありませんが、スタックしたクライアントにはミューテックスを待機しているスレッドがいくつかあります。つまり、GameKit がアプリをデッドロックに導きます。Apple Developer's Forum を読んでいると、一部のユーザーがこのバグを Apple に直接報告していることがわかりましたが、Apple は回答しませんでした。したがって、現時点では、GKSession ベースのアプリを安全に実行する唯一の方法は、iOS 6 のみをサポートするか、Bonjour、ソケット、および低レベルの BlueTooth API を使用してネットワーク通信システムをゼロから作成することです。

于 2012-12-12T19:22:41.240 に答える