CocoaAsyncSocket не работает в фоновом режиме

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

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

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

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

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

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

person Jonathan Ellis    schedule 01.11.2011    source источник


Ответы (1)


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

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

[[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, я думаю) снова включается.

person Jonathan Ellis    schedule 01.11.2011
comment
UIApplicationDidEnterBackgroundNotification -> UIApplicationDidBecomeActiveNotification - person david; 04.10.2012
comment
appEnteredBackground -> applicationDidBecomeActive - person david; 04.10.2012