Я получил эту проблему в модифицированной версии 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.