Как работать с сокетами (sockets) для сетевого взаимодействия на iOS?

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

Ответ

Да, на iOS можно работать с сокетами для низкоуровневого сетевого взаимодействия по протоколам TCP и UDP. Однако в большинстве случаев рекомендуется использовать высокоуровневый API URLSession.

Иерархия сетевых API на iOS:

  1. URLSession (Рекомендуется) — высокоуровневый API для HTTP/HTTPS, WebSocket (URLSessionWebSocketTask), загрузки и выгрузки данных.
  2. Network.framework (iOS 12+) — современный, асинхронный фреймворк для протоколов на основе сокетов (TCP, UDP, TLS) с поддержкой мониторинга соединения.
  3. CFSocket / NSStream (Legacy) — низкоуровневые API на основе Core Foundation и Foundation.

Пример использования Network.framework для TCP-сокета:

import Network

// Создание параметров TCP-соединения
let parameters = NWParameters.tcp
let connection = NWConnection(
    host: "example.com",
    port: 80,
    using: parameters
)

// Установка обработчика состояния
connection.stateUpdateHandler = { newState in
    switch newState {
    case .ready:
        print("Соединение установлено")
        // Можно отправлять/получать данные
    case .failed(let error):
        print("Соединение failed: (error)")
    default:
        break
    }
}

// Запуск соединения
connection.start(queue: .global())

Когда использовать сокеты напрямую:

  • Реализация кастомных бинарных протоколов (не HTTP).
  • P2P-приложения или онлайн-игры с реальным временем.
  • Длительные двусторонние соединения (чаты через WebSocket, которые уже абстрагированы в URLSessionWebSocketTask).

Вывод: Для стандартных задач (REST API, загрузка файлов) используйте URLSession. Для нестандартных протоколов или когда нужен полный контроль над сетевым стеком — выбирайте Network.framework.