Приложения 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 я больше не могу его отправить. В высшей степени разочарован и надеюсь, что этот отчет об ошибке поможет в будущем. Если кто-то поймет эту ошибку или то, что я делаю не так, я был бы чрезвычайно благодарен.
Пожалуйста, помоги, если можешь. Я собираюсь бросить полотенце здесь, в этом приложении, и оно так близко.