3

4.0 で実行されているゲームキット アプリケーションは、GKSession オブジェクトの削除を適切に処理しません。3.1.3 または 3.2 で実行している場合、ピアが切断され、セッションがクリーンアップされた場合 (Apple のデモのように):

[gkSession disconnectFromAllPeers];
[gkSession setAvailable:NO];
[gkSession setDelegate:nil];
[gkSession setDataReceiveHandler:nil withContext:nil];

次に、他のピアが状態の変更を受信し、ピアのテーブル ビューを更新できます。

私のアプリケーションでは、1 つのピアがサーバーとして起動し、もう 1 つのピアがクライアントとして起動します。クライアントがサーバーへの接続を要求すると、クライアントの名前がサーバーのプレイヤー リストに表示されます。サーバーがリクエストを受け入れることを選択すると、セッション接続が確立され、ゲームをプレイできるようになります。ただし、サーバーが要求を受け入れる前にクライアントが終了した場合、クライアントはセッションをクリーンアップし (上記のように)、それに応じて (状態変更を受信すると) サーバーのピア リストからクライアントが消えます。これは 3.1–3.2 で驚くほど機能します

4.0 で実行されている同じアプリケーションを実行すると、サーバーとクライアントがエラーをスローし、ピアが状態の変更を受信するのに非常に長い時間がかかります。受信すると、アプリケーションはエラーなしでクラッシュします (ビルドで NSZombieEnabled=YES を使用しても)。引数)。サーバーは、クライアントから「状態変更」メッセージを受け取ることはありません。代わりに、次のエラーがスローされます。

Thu Jul  8 23:27:26 unknown com.apple.mDNSResponder[18] <Notice>: BTLocalDeviceRemoveData: 60 byte key, 18 byte value
Thu Jul  8 23:27:26 unknown MobileBluetooth[29] <Notice>: BTLocalDeviceRemoveData - BT_ERROR_INVALID_HANDLE
Thu Jul  8 23:27:26 unknown com.apple.mDNSResponder[18] <Notice>: Call to BTLocalDeviceRemoveData failed with error 7
Thu Jul  8 23:13:39 unknown mDNSResponder[18] <Error>: external_stop_advertising_service:   18 00Z1Tud0A\\.\\.Tonberry\M-b\M^@\M^Ys\\032iPhone._1htnu3uko0uvsp._udp.local. TXT txtvers=1\M-B\M-&state=A
Thu Jul  8 23:13:39 unknown MobileBluetooth[29] <Notice>: BTLocalDeviceRemoveData - BT_ERROR_INVALID_HANDLE

私が思うに、重要なエラーは次のとおりです。

Tue Jul 13 21:04:50 Tonberry com.apple.mDNSResponder[21] <Notice>: Call to BTDiscoveryAgentStopScan failed with error 400

セッションが利用できなくなっていないように見えます (サービスのアドバタイズを停止する際のエラー)。実際のクラッシュ:

Thread 3 Crashed:
0   GameKitServices                 0x06352f90 gckSessionChangeStateCList + 411
1   GameKitServices                 0x0635b49c gckSessionRecvProc + 1474
2   libSystem.B.dylib               0x981c181d _pthread_start + 345
3   libSystem.B.dylib               0x981c16a2 thread_start + 34

進行中の完全なアプリケーションでバグを報告しました。アプリ自体は完成しており、提出する準備がほぼ整っており、3.1.3/3.2 でかなりうまく動作しますが、現在の 4.0 の Gamekit の状態では提出できません。非常に失望したので、このバグレポートが将来役立つことを願っています. 誰かがこのエラーまたは私が間違っている可能性があることを理解していれば、私は非常に感謝しています.

できれば助けてください。私はこのアプリケーションでここにタオルを投げようとしていますが、それはとても近いです.

4

2 に答える 2

1

これに関するヘルプを探している人のために、4.0.x の問題の回避策を見つけました (4.1 はクラッシュを修正しますが、切断時間は修正しません)。すべてを自動承認するだけです。誰かが connectToPeer: を使用して GameKit 接続を要求した場合は、それを受け入れるだけです。ユーザーにそれを選択するオプションを与えないでください。確立された接続からピアを切断すると、すぐにサーバーに通知されます。それらを「使用可能」状態のままにしておくと、接続を離れるときにサーバーがクラッシュします。早めにつながり、頻繁に受け入れましょう!

于 2010-09-07T08:03:17.373 に答える
1

私の提案は、4.1 の究極のプレリリース ビルドを使用し、「新しい」問題を報告することです (既存のバグを未修正として再度開くか、新しいバグを作成します)。それは、最終リリースの前に問題を完全に修正するか、Apple から適切な回避策を講じるための最善の策です。

于 2010-07-20T19:46:01.550 に答える