CocoaAsyncSocket не работает после нахождения в фоновом режиме - PullRequest
2 голосов
/ 01 ноября 2011

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

Проблема, с которой я сталкиваюсь, заключается в том, что все работает нормально, но во время тестирования моего приложения на наличие ошибокзаметил одну особенно странную (и раздражающую проблему):

Если я выключаю iPad сервера (в этот момент ни один из делегатов сокета не запускается на сервере), то клиент отключается (и входитв цикл, который я сделал, где он постоянно повторяется).Что раздражает, так это то, что даже когда сервер возвращается, клиент все равно не может подключиться к нему.На самом деле, даже если я снова запускаю клиент с нуля, он все равно не может подключиться к серверу.Мне нужно перезапустить приложение сервера, чтобы клиент смог снова подключиться.

Странно то, что эта ошибка возникает только тогда, когда сервер фактически выключен (т.е.перевести в режим ожидания) с кнопки вверху.Если я просто отправляю приложение в фоновый режим с помощью кнопки «Домой», то клиент по-прежнему сохраняет свое подключение к серверу: только когда устройство отключено, клиент получает сообщение делегата о разъединении и отключается, а затем отказывается восстановить соединение.Тем временем сервер совершенно не замечает этого, и ни один из методов делегатов не запускается вообще.

Обобщая мой вопрос:

  • Что именно происходит сЭкземпляр сервера AsyncSocket, когда устройство переводится в режим ожидания с помощью кнопки в верхней части iPad?
  • Почему не запускаются методы делегирования, а все подключенные клиенты отключаются?
  • Что происходит при повторном включении устройства?
  • Почему клиенты не могут подключиться?

1 Ответ

1 голос
/ 01 ноября 2011

Мне удалось найти решение этой проблемы, поэтому я поделюсь им здесь: -

На своем классе серверов я добавил следующее:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];

Затем я добавилследующий метод, который заставляет сокет начать прослушивание снова:

- (void)applicationDidBecomeActive {
    NSError *error;
    if (![socket acceptOnPort:kPORT error:&error])
    {
        // error code
    }
}

По-прежнему нет способа остановить отключение клиентов, когда сервер переходит в фоновый режим, поэтому я просто заставляю их зацикливаться, пока сервер снова не станет доступен,метод appEnteredForeground гарантирует, что сервер снова начнет слушать, как только iPad (или iPhone, я думаю) снова включится.

...