2012-04-27 6 views
2

同期ゲーム用のGameKitとGKMatchで2つのiOSデバイス間の接続を確立します。 1人のプレーヤーがバックグラウンドに入ると、接続は切断されます。どうすればこの問題を回避できますか? 1人のユーザーがアプリをバックグラウンドで中断している間に、GKMatch経由で接続を維持することは可能ですか?バックグラウンド入力時にゲームキットを続行する

答えて

2

は、Appleのドキュメントによると:

とすぐにあなたのゲームがバックグラウンドに移動すると、ローカルプレーヤーオブジェクトの認証されたプロパティの値となると、あなたのゲームが戻ってフォアグラウンドに移動するまで無効のままです。値を読み取って、Game Kitがプレーヤーを再認証して認証ハンドラを呼び出すまで、プレーヤがまだ認証されているかどうかを判断することはできません。完了ハンドラが呼び出されるまでは、認証されたプレーヤが存在しないかのようにゲームを動作させる必要があります。ハンドラが呼び出されると、認証済みプロパティに格納された値が再び有効になります。

出典:Game Center Programming Guide, pg. 39

あなたのアプリケーションはVOIPを採用したり、特別な事情が適用されない限り、あなたは本当にバックグラウンドで開いてネットワーク接続を維持するべきではありません。 (もしあなたが興味があれば、そのことについては、ハッカーの方法についてはthis SO questionをチェックしてください)。 バックグラウンド入力時にプレイヤー認証が無効になるため、別のデバイス(バックグラウンドアプリからネットワークデータを受け取っている場合)は、どのGKPlayerが情報を送信したかを(確実に)認識しません。

だから、Appleが出てくると、すべてのゲームセンターの機能が正常に一度プレイヤーがリニューアル時に再認証されたアプリケーションがバックグラウンドに入ったときに解除され、再開されなければならない、明示的にそれを言うことはありませんが。アプリケーションは、それが(バックグラウンドタスクに応じて、通常)である背景に引き出す側ノートとして

は、「サスペンションの対象」と見なさ。これは、マルチタスクの実行にこのような制限がある理由の1つです。あなたのアプリケーションはいつでもメモリを解放するために殺される可能性があります。 ネットワークとマルチタスクの詳細については、TN227を参照してください。

EDIT:代替方法:

生きGKMatchを維持することはできませんがアプリケーションをバックグラウンドで実行されている間、この動作をエミュレートする別の方法は、あなたにゲームの状態を保存することです自分のサーバー。あなたが自分のサーバーに現在のゲームの状態を保存し、あなたがゲームを離れようとしていることを他のプレイヤーに知らせるために、ゲームを離れる前にUIを操作して(ボタンを押してください)再起動時にサーバーに照会して、保存されているゲームがあるかどうか確認し、そうであれば、ゲームの状態を読み込んで、他のプレイヤーに通知します。これは厳密に同じゲームを維持するものではありませんが、あなたが行っている動作を近似する1つの方法です。

1

この一人のプレイヤーは、このイベント で背景

に入力するときは次のように行うことができます

ことはできません - (無効)applicationDidEnterBackground:(のUIApplication *)アプリケーション{} は、第二にメッセージを送信します最初のプレーヤーがバックグラウンドで行っているパケットデータのプレーヤー

次に - (void)receiveData:(NSData *)fromPeer:(NSString *)peer inSession:(GKSession *)セッションコンテキスト:(void *)context; { } そのデータがアプリケーションを停止して前のビューにポップアップするとき

関連する問題