同期ゲーム用にGameKitとGKMatchを使用して2つのiOSデバイス間の接続を確立します。1人のプレイヤーがバックグラウンドに入ると、接続が切断されます。この動作を回避するにはどうすればよいですか?1人のユーザーがアプリをバックグラウンドで一時停止している間、GKMatchを介した接続を維持することは可能ですか?
2 に答える
Appleのドキュメントによると:
ゲームがバックグラウンドに移動するとすぐに、ローカルプレーヤーオブジェクトの認証済みプロパティの値が無効になり、ゲームがフォアグラウンドに戻るまで無効のままになります。Game Kitがプレーヤーを再認証し、認証ハンドラーを呼び出すまで、値を読み取ってプレーヤーがまだ認証されているかどうかを判断することはできません。ゲームは、完了ハンドラーが呼び出されるまで、認証されたプレーヤーがいないかのように動作する必要があります。ハンドラーが呼び出されると、認証されたプロパティに格納されている値が再び有効になります。
アプリがVOIPを採用しているか、特別な状況が適用されない限り、ネットワーク接続をバックグラウンドで開いたままにしておくべきではありません。(ただし、興味がある場合は、このSOの質問をチェックして、ハッカーっぽい方法でそれを実行してください)。バックグラウンドに入るとプレーヤー認証が無効になるため、別のデバイス(バックグラウンドアプリからネットワークデータを受信できた場合)は、どのGKPlayerが情報を送信したかを(確実に)認識しません。
したがって、Appleが出てきて明示的に言うことはありませんが、通常、アプリケーションがバックグラウンドに入ると、Game Centerのすべての機能がキャンセルされ、再起動時にプレーヤーが再認証されると再開されます。
ちなみに、アプリがバックグラウンドに撤退すると、(通常、バックグラウンドタスクに応じて)「一時停止の対象」と見なされます。これが、マルチタスクの実行にそのような制限がある理由の1つです。メモリを解放するためにアプリがいつでも強制終了される可能性があり、そのときに大量のデータ転送を実行したくない場合があります。ネットワークとマルチタスクについて詳しく知りたい場合は、TN227を参照してください。
編集:別の方法:
アプリがバックグラウンドで実行されている間はGKMatchを存続させることはできませんが、この動作をエミュレートする別の方法は、ゲームの状態を独自のサーバーに保存することです。ゲームを終了する前に、ユーザーにUIを操作するように依頼します(ボタンを押す可能性があります)。これにより、現在のゲームの状態が自分のサーバーに保存され、他のプレーヤーにゲームを終了しようとしていることが通知されます。再起動時に、サーバーにクエリを実行して、保存されているゲームがあるかどうかを確認します。保存されている場合は、ゲームの状態をロードして、他のプレーヤーに通知を送信します。これは厳密に同じゲームを維持するわけではありませんが、あなたが求めている行動を概算する1つの方法です。
これは不可能です
1人のプレイヤーがバックグラウンドで入るときのように行うことができます
この場合-(void)applicationDidEnterBackground:(UIApplication *)application {}は、最初のプレーヤーがバックグラウンドで送信するパケットデータで2番目のプレーヤーにメッセージを送信します
次に、in-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context; {}そのデータを取得すると、アプリケーションが停止し、前のビューにポップします