2016-03-09 5 views
4

У меня есть приложение iOS, которое извлекает данные пользователя с сервера в applicationDidBecomeActive.iOS - Первый сетевой запрос завершается после разблокировки

Если пользователь нажимает кнопку «Домой», то возвращается в приложение через значок приложения или экран многозадачности, функция работает нормально.

Если пользователь блокирует устройство в среднем (либо находясь в приложении, либо нажав на кнопку «домой», а затем блокируя), сетевой запрос завершается с ошибкой. Я использую Alamofire. Объект ответа nil и result.data пуст. На сервере также не поступает запрос. Сбой происходит мгновенно.

ответ

4

Apple Tech Note TN2277, говорит, что ядро ​​может восстанавливать сокеты из приложений без их представления о том, что происходит. Вот соответствующая часть:

Тестирование Гнездо рекуперация

Если вы собираетесь писать код, который обрабатывает ресурсы сокета бытия мелиорированное ядра, вы должны выяснить, как проверить его. точные обстоятельства, при которых система может восстановить ресурсы сокета , намеренно не документированы; это дает нам гибкость , чтобы улучшить ситуацию в будущем. Однако, на современных системах (IOS 4,0 через прошивку 4.3), вы можете получить систему, чтобы вернуть ресурсы из сокетов в приложении по:

  1. наложив свое приложение в фоновом режиме
  2. обеспечения того, чтобы приложение подвешен
  3. блокировки экрана

Когда ваше приложение возобновляет выполнение его обнаружат, что это сокеты были восстановлены.

Чтобы обойти это, попробуйте создать новый Alamofire.Manager при вызове приложения AppDelegateWillEnterForeground. Надеюсь, это поможет вам.

+0

, но я ничего не бегу в фоновом режиме. Этот сетевой запрос выполнен в 'applicationDidBecomeActive', так что в этот момент мое приложение должно иметь доступ к сети? – AndyRyan

+0

Я предполагаю, что NSURLSession (который Alamofire.Manager является кешированием) имеет один или несколько сокетов, которые он поддерживает (возможно, чтобы не пересматривать соглашения TLS). Затем, когда устройство заблокировано, ОС восстанавливает эти сокеты. Следующий запрос на них приводит к ошибке EBADF из системного вызова, который переводится в NSError с локализованным описанием «connection closed». – typedef

+0

Любая идея, как я могу обойти это? Я попытался найти какую-то функцию обновления. Единственное, о чем я сейчас думаю, это повторить запрос – AndyRyan

Смежные вопросы