Будет ли работать WebSocket-соединение в iOS, если приложение свернуто?

«Будет ли работать WebSocket-соединение в iOS, если приложение свернуто?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поведение WebSocket-соединения зависит от состояния приложения. По умолчанию работа в свернутом (фоновом) режиме сильно ограничена.

Поведение по умолчанию:

  1. Приложение активно или свернуто: Соединение остается стабильным. iOS не прерывает сетевую активность для свернутого приложения немедленно.
  2. Приложение перешло в фон (background): Через несколько секунд система приостанавливает выполнение кода и может разорвать сетевые соединения, включая WebSocket.

Как поддерживать соединение в фоне: Для длительной работы в фоне требуются специальные разрешения (Background Modes), которые необходимо обосновать Apple:

  • VoIP (Voice over IP): Прямая поддержка фоновых сокетов для аудиозвонков.
  • Удаленные уведомления (Push Notifications): Основной способ. Сервер отправляет push-уведомление, которое "будит" приложение, позволяя ему на короткое время восстановить WebSocket-соединение и получить актуальные данные.
  • Фоновое обновление контента (Background Fetch): Позволяет приложению периодически запускаться в фоне, но интервалы не гарантированы.

Пример конфигурации для VoIP (в Info.plist):

<key>UIBackgroundModes</key>
<array>
    <string>voip</string>
</array>

Практическая рекомендация: Для большинства приложений (чат, live-обновления) оптимальная стратегия — полагаться на Push-уведомления. При получении push приложение может быстро восстановить соединение, получить данные и обновить интерфейс. Прямое поддержание WebSocket в фоне без веской причины приведет к отклонению приложения при ревью App Store.