Проблема с соединением с GKPeerPickerController

Я работаю над игрой для iOS с GKSession и GKPeerPickerController. Я обнаружил, что процесс подключения двух устройств iOS медленный и ненадежный, даже если они находятся рядом друг с другом. Давайте назовем мои устройства "устройство А" и "устройство Б."

Вот что обычно происходит:

  1. На каждом устройстве я нажимаю кнопку подключения моего приложения. Затем каждое устройство отображает окно "iPad, iPhone или iPod touch".

  2. Обычно довольно быстро оба устройства замечают, что другое существует.

  3. Затем я говорю одному из устройств (скажем, устройство A) подключиться к другому.

  4. Довольно быстро окно устройства B сообщает, что устройство A недоступно.

  5. Вот где это становится раздражающим. По истечении периода времени, составляющего от 1 секунды до никогда, на устройстве B появляется окно, сообщающее, что устройство A хочет подключиться, и запрашивающее устройство B, хочет ли оно принять подключение.

  6. Если вышеприведенное окно появляется, все идет нормально. Но это иногда занимает много времени, а иногда и вовсе не происходит.

У меня три устройства, и у меня есть похожие проблемы, независимо от того, какие два устройства я использую.

Что я могу с этим поделать?

Мой метод подключения довольно прост:

-(void) findPeerPickerOpponents {
    GKPeerPickerController *picker;
    picker = [[GKPeerPickerController alloc] init]; 
    picker.delegate = self;
    [picker show]; 
    [self.connectionDelegate disableIdleTimer];
}

2 ответа

Хорошо, что вы должны сделать:
- допустим, у вас есть устройства A, B и C
- устройство A сканирует, устройство B только что начало сканирование
- устройство A видит устройство B как нового партнера - оно отправляет приглашение B
- устройство B получает приглашение - оно автоматически подтверждает его, оба устройства подключены, пользователю не отправляется уведомление, за исключением того, что устройства появляются в лобби.
- устройство C появляется
- устройства A и B пытаются подключиться к нему, они автоматически подключаются и появляются в лобби
- игрок касается устройства B на устройстве A
- устройство A отправляет пакет WANNAPLAY на B
- B представляет всплывающее окно с вопросом, хочет ли игрок играть с A - игрок отвечает ДА
- устройство B отправляет сообщение ACCEPTED в A и отключает всех, кроме A (отправив сообщение DISCONNECT)
- устройство A получает ACCEPTED и отключает всех, кроме B (отправка DISCONNECT)
- устройство C получает 2 раза DISCONNECT и удаляет A и B из своего лобби

Он работает НАМНОГО ЛУЧШЕ, чем стандартный подход, даже если его примерно в 10 раз больше - я сделал это обоими способами, и это очень хорошее решение.

Я полностью разочаровался в peerPickerController. Проверьте пример кода Apple GKRocket. - Использует GKSession и просмотр таблиц сверстников. Сейчас на моих устройствах он немного глючит, по причинам, которые мне не ясны, но я использовал базовые классы: GameLobby и SessionManager, чтобы довольно хорошо подключить устройства. Также имеет то преимущество, что не ограничивает вас одним пэром.

Другие вопросы по тегам