Чем отличается сетевое взаимодействие в приложении для такси от приложения-записной книжки?

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

Ответ

Ключевое отличие — в требованиях к реальному времени и постоянству соединения.

Приложение для такси (Real-time)

  • Модель: Постоянный двусторонний обмен данными.
  • Технологии:
    • WebSockets или TCP-сокеты для мгновенной передачи событий (новая позиция водителя, новый заказ, изменение статуса).
    • Долгие опросы (Long Polling) как fallback.
    • Push-уведомления для важных событий при свернутом приложении.
  • Требования:
    • Минимальная задержка (low latency). Данные должны доставляться за доли секунды.
    • Устойчивость к разрывам. Автоматическое переподключение, обработка состояния "offline/online".
    • Эффективная работа в фоне. Использование background modes для обновления геопозиции.
  • Пример потока данных:
    
    // Установка WebSocket соединения
    let socketTask = URLSession.shared.webSocketTask(with: URL(string: "wss://taxi.example.com/ws")!)
    socketTask.resume()

// Отправка текущей геопозиции водителя каждые 3 секунды Timer.scheduledTimer(withTimeInterval: 3.0, repeats: true) { _ in let locationMessage = URLSessionWebSocketTask.Message.string("{"lat": (lat), "lon": (lon)}") socketTask.send(locationMessage) { error in if let error = error { / Обработать разрыв соединения / } } }

// Получение событий от сервера (новый заказ, сообщение от пассажира) func receiveMessage() { socketTask.receive { result in switch result { case .success(let message): // Обработать сообщение и обновить UI DispatchQueue.main.async { self.handleServerMessage(message) } self.receiveMessage() // Слушать следующее сообщение case .failure(let error): print("Ошибка WebSocket: (error)") } } }


### Приложение-записная книжка (Request/Response)
*   **Модель:** Периодическая синхронизация по запросу.
*   **Технологии:**
    *   **REST/GraphQL API** через `URLSession`.
    *   Стандартные HTTP-методы (GET, POST, PUT, DELETE).
*   **Требования:**
    *   **Оффлайн-первый подход.** Локальное сохранение заметок с последующей синхронизацией.
    *   **Разрешение конфликтов.** При редактировании одной заметки с нескольких устройств.
    *   **Экономия трафика и батареи.** Синхронизация по расписанию или при открытии приложения (pull-to-refresh).
*   **Пример потока данных:**
```swift
// Периодическая синхронизация при запуске или уходе в фон
func syncNotes() {
    guard isOnline else { return }

    // 1. Отправить на сервер локально измененные заметки
    let localChanges = getUnsyncedNotes()
    upload(notes: localChanges)

    // 2. Запросить с сервера свежие изменения
    URLSession.shared.dataTask(with: notesURL) { [weak self] data, _, _ in
        guard let data = data,
              let serverNotes = try? JSONDecoder().decode([Note].self, from: data) else { return }
        // 3. Объединить изменения и сохранить локально
        self?.mergeAndSave(serverNotes: serverNotes)
        // 4. Обновить UI
        DispatchQueue.main.async { self?.tableView.reloadData() }
    }.resume()
}

Сводная таблица

Аспект Приложение для такси Записная книжка
Тип связи Постоянная, двусторонняя, real-time Эпизодическая, запрос-ответ
Критичность задержки Высокая (секунды) Низкая (минуты, часы)
Сетевая устойчивость Максимальная (переподключение, квитирование) Стандартная (повторные попытки)
Работа в фоне Активная (геолокация, сокеты) Минимальная (фоновые fetch)
Архитектура Соединение как состояние приложения Соединение как одноразовая операция