GameKit 4.0 не готов к работе в прайм-тайм? Остановка рекламных услуг

Приложения Gamekit, работающие под 4.0, некорректно обрабатывают удаление объектов GKSession. Запуск под 3.1.3 или 3.2, если одноранговый узел отключается и сеанс очищается (как в демонстрациях Apple):

[gkSession disconnectFromAllPeers];
[gkSession setAvailable:NO];
[gkSession setDelegate:nil];
[gkSession setDataReceiveHandler:nil withContext:nil];

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

В моем приложении один партнер запускается как сервер, а другой - как клиент. Клиент запрашивает подключение к серверу, и имя клиента появляется в списке игроков сервера. Если сервер решает принять запрос, устанавливается соединение сеанса, и они могут играть в игру. Однако, если клиент завершает работу до того, как сервер принимает запрос, клиент очищает сеанс (как указано выше), и клиент исчезает из списка одноранговых узлов сервера в ответ (когда он получает изменение состояния). Это прекрасно работает на 3.1–3.2.

Когда вы запускаете одно и то же приложение, работающее под 4.0, сервер и клиент выдают ошибку, и одноранговым узлам требуется очень много времени, чтобы получить изменение состояния, и когда они это сделают, приложение выйдет из строя без каких-либо ошибок (даже с NSZombieEnabled = YES в сборке аргументы). Сервер никогда не получает от клиента сообщения об изменении состояния. Вместо этого возникают следующие ошибки:

Thu Jul  8 23:27:26 unknown com.apple.mDNSResponder[18] <Notice>: BTLocalDeviceRemoveData: 60 byte key, 18 byte value
Thu Jul  8 23:27:26 unknown MobileBluetooth[29] <Notice>: BTLocalDeviceRemoveData - BT_ERROR_INVALID_HANDLE
Thu Jul  8 23:27:26 unknown com.apple.mDNSResponder[18] <Notice>: Call to BTLocalDeviceRemoveData failed with error 7
Thu Jul  8 23:13:39 unknown mDNSResponder[18] <Error>: external_stop_advertising_service:   18 00Z1Tud0A\\.\\.Tonberry\M-b\M^@\M^Ys\\032iPhone._1htnu3uko0uvsp._udp.local. TXT txtvers=1\M-B\M-&state=A
Thu Jul  8 23:13:39 unknown MobileBluetooth[29] <Notice>: BTLocalDeviceRemoveData - BT_ERROR_INVALID_HANDLE

Я считаю, что это ключевая ошибка:

Tue Jul 13 21:04:50 Tonberry com.apple.mDNSResponder[21] <Notice>: Call to BTDiscoveryAgentStopScan failed with error 400

Мне кажется, что сеанс не становится недоступным (ошибка при остановке рекламы службы). Фактическая авария:

Thread 3 Crashed:
0   GameKitServices                 0x06352f90 gckSessionChangeStateCList + 411
1   GameKitServices                 0x0635b49c gckSessionRecvProc + 1474
2   libSystem.B.dylib               0x981c181d _pthread_start + 345
3   libSystem.B.dylib               0x981c16a2 thread_start + 34

Я сообщил об ошибке в процессе выполнения полной заявки. Само приложение готово, почти готово к отправке и неплохо работает в версиях 3.1.3 / 3.2, но с текущим состоянием Gamekit в 4.0 я больше не могу его отправить. В высшей степени разочарован и надеюсь, что этот отчет об ошибке поможет в будущем. Если кто-то поймет эту ошибку или то, что я делаю не так, я был бы чрезвычайно благодарен.

Пожалуйста, помоги, если можешь. Я собираюсь бросить полотенце здесь, в этом приложении, и оно так близко.


person typeoneerror    schedule 09.07.2010    source источник
comment
На самом деле только что получил известие от Apple, что это известная ошибка. Любые обходные пути получают вознаграждение.   -  person typeoneerror    schedule 14.07.2010
comment
Проверьте, исправлено ли это в бета-версиях 4.1. Возможно, вам придется подождать всего пару недель, чтобы отправить его. (Только 4.1 и 3-3.2).   -  person Tom H    schedule 16.07.2010
comment
Ошибка исправлена ​​в версии 4.1. Я построил против него прошлой ночью. Проблема в том, что на уведомление об отключении все равно уходит 15-30 секунд. Что-то все еще не так. Впрочем, прогресс! Ты должен был ответить! Скорее всего, ответ на попытку 4.1 принесет вам 500 репутации;)   -  person typeoneerror    schedule 16.07.2010


Ответы (2)


Я предлагаю использовать предрелизные сборки 4.1 и сообщать о «новой» проблеме (либо повторно открыть существующую ошибку как не исправленную, либо создать новую). Это, IMHO, лучший вариант, чтобы проблема была полностью решена до финальной версии или достойного решения от Apple.

person Pascal Thivent    schedule 20.07.2010
comment
Ага, к сожалению, придется стиснуть зубы. Наслаждайтесь своими 500! : D - person typeoneerror; 21.07.2010

Для тех, кто ищет помощь по этому поводу, я нашел способ решения проблем с 4.0.x (4.1 исправляет сбои, но не время отключения). Просто принимайте все автоматически. Когда кто-то запрашивает соединение GameKit с connectToPeer :, просто примите его. Не позволяйте пользователю выбирать его. При отключении однорангового узла от установленного соединения сервер немедленно уведомляется. Если вы оставите их только в «доступном» состоянии, когда они покинут соединение, это приведет к сбою сервера. Подключайтесь раньше и принимайте часто!

person typeoneerror    schedule 07.09.2010