CocoaAsyncSocket не работает после работы в фоновом режиме

#iphone #objective-c #ios #ipad #cocoaasyncsocket

#iPhone #objective-c #iOS #iPad #cocoaasyncsocket

Вопрос:

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

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

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

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

Чтобы обобщить мой вопрос:

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. UIApplicationDidEnterBackgroundNotification -> UIApplicationDidBecomeActiveNotification

2. appEnteredBackground -> applicationDidBecomeActive