GKSession が自分自身 (同じデバイス) を検索しているのはなぜですか? GKRocket の例でも、なぜそうなるのでしょうか?
自己接続を行わないようにするにはどうすればよいですか?
デバイスからセッションが 1 つだけ開かれていることを確認してください。GKSession は、一致する ID を持つセッションを探します。同じ ID を持つデバイスから新しいセッションを作成すると、古いセッションが検索されます。
あなたがしなければならないことは、使用することです:
session.available = NO;
検索しているデバイスで。検索が終了したら、YES に設定します。
セッションが AppDelegate の一部である場合:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
GKRocket の修正版でこの問題が発生しました。ピアが切断すると、アプリはフロント スクリーンに戻り、セッションを開始したビューをリロードしました。
アプリのできるだけ早い段階で GKSession を作成するクラスをインスタンス化して、これを修正する必要があります。ユーザーは、アプリを閉じるまで、それ以上戻ることはできません。次に、ピア リストなどを呼び出すことができるように、ナビゲーション スタック全体でセッション コントローラー クラスへのポインターを維持します。
これらのメソッドは、AppDelegate の後の最初のビュー コントローラーからのものです。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//We setup the GKSession at this stage so that we do not create duplicate sessions as
//the user navigates to and from the game lobby controller finding and managing peers
manager = [[SessionManager alloc] init];
manager.lobbyDelegate = nil; //There is no game lobby at this stage so we nil this.
[manager setupSession];
// call the session manager's setup method to create the session. It will start
//looking for peers right away, but we won't see that until we go to the game lobby
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//Pass a pointer to the session manager along the line of segues
[[segue destinationViewController] setManager:self.manager];
}
このコードは GKRocket から変更されています。そのチュートリアルをチェックして、setupSession などのメソッドが何をするかを確認してください。