Введение / Зачем это нужно
В iOS-приложениях почти каждый запрос к серверу выполняется через URLSession. Когда данные не приходят, приходят с ошибками или приложение ведет себя странно, важно быстро найти причину. Встроенные инструменты отладки Xcode позволяют увидеть исходящие и входящие пакеты, а дополнительные утилиты (эмулятор сети, HTTP-прокси, консоль разработчика Safari) расширяют возможности диагностики. После выполнения этого гайда вы сможете выявлять ошибки подключения, проверять ответы сервера и тестировать работу приложения в различных сетевых условиях.
Требования / Подготовка
- Последняя версия Xcode (включает Network Debugger и Network Link Conditioner).
- Установленный Charles Proxy (или аналогичный HTTP-прокси) для перехвата трафика.
- Устройство эмулятора iOS с подключением к интернету.
- Базовые знания Swift и работы с
URLSession. - Доступ к консоли разработчика Safari (в macOS).
Пошаговая инструкция
Шаг 1: Включить логирование сетевых запросов в Xcode
Включите встроенный логгер сетевых запросов, чтобы видеть все HTTP-запросы в панели Network во время выполнения приложения.
- Запустите приложение в Xcode (
Product → Run). - В меню
Debugвыберите Network Logging (или используйте значок лупы в нижней панели Instruments). - Переключите ползунок в положение ON — теперь каждый запрос
URLSessionбудет отображаться в списке.
💡 Совет: Если панель
Networkотсутствует, откройтеWindow → Development → Show Consoleи убедитесь, что отладка включена (Product → Scheme → Debug).
Шаг 2: Добавить кастомный делегат URLSession
Кастомный делегат позволяет записывать детали каждого запроса и ответа напрямую в консоль, что полезно для отладки сложных сценариев.
import Foundation
class NetworkLogger: URLSessionTaskDelegate {
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
let request = task.currentRequest
let response = task.response as? HTTPURLResponse
var log = "📤 Request: \(String(describing: request?.httpMethod)) \(String(describing: request?.url))\n"
log += "📥 Response: \(response?.statusCode ?? 0)\n"
if let err = error {
log += "❌ Error: \(err.localizedDescription)"
}
print(log)
}
// Дополнительные методы при необходимости
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}
// Использование
let config = URLSessionConfiguration.default
let logger = NetworkLogger()
let session = URLSession(configuration: config, delegate: logger, delegateQueue: nil)
⚠️ Важно: Для работы делегата убедитесь, что проект подписан (сертификат разработчика) и включена отладочная информация.
Шаг 3: Перехватить трафик через эмулятор сети или proxy
3.1. Симуляция условий сети (Network Link Conditioner)
- В Xcode откройте Features → Network Link Conditioner.
- Выберите один из предустановленных профилей (например, Bad 3G).
- Запустите приложение и наблюдайте, как оно ведет себя при ограниченном bandwidth и высокой задержке.
3.2. Перехват трафика через HTTP-прокси
Установите Charles Proxy (или аналогичный) и настройте устройство/эмулятор на его использование:
# В настройках сети устройства укажите прокси:
# IP-адрес Mac, где работает Charles: 192.168.1.1
# Порт: 8888
В Charles включите Proxy → Proxy Options → Enable transparent proxy, чтобы перехватывать HTTPS-трафик.
Шаг 4: Использовать инструменты разработчика Safari для проверки запросов
Safari может показывать исходящие запросы, что полезно для проверки запросов, идущих через URLSession с URLSessionConfiguration.allowsCellularAccess = true.
- В Safari откройте Разработчик → Показать веб-консоль.
- Нажмите на значок Эмуляция сетевого окружения (иконка радиоволны) и выберите, например, «Slow 3G».
- Перезапустите приложение в симуляторе и выполните действия, которые инициируют сетевые запросы. В консоли вы увидите полный путь запроса, заголовки и тело ответа.
Шаг 5: Проверить и оптимизировать логи
После выполнения предыдущих шагов проанализируйте собранную информацию:
- Статус коды: 200‑299 — успех, 400‑499 — клиентские ошибки, 500‑599 — серверные ошибки.
- Заголовки: обратите внимание на
Content-Type,Cache-Control,Authorization. - Тело ответа: убедитесь, что парсинг JSON/XML не вызывает ошибок.
- Время выполнения: в панели Network отметьте задержки и возможные тайм-ауты.
Если проблема выявлена, внесите необходимые изменения (корректные URL, токены, обработку ошибок) и повторите цикл отладки.
Проверка результата
После внесения изменений запустите приложение в режиме отладки и выполните те же действия, которые вызвали ошибку ранее. Убедитесь, что:
- Запросы отображаются в панели Network с правильными статусами.
- Кастомный делегат выводит лог в консоль без ошибок.
- В Safari (или эмуляторе сети) трафик соответствует ожидаемому.
Если всё отображается корректно, отладка успешна завершена.
Возможные проблемы
- Запросы не отображаются в Network: Убедитесь, что запросы выполняются через
URLSession(а не черезURLSession.shared.dataTask). Проверьте, что логирование сетевых запросов действительно включено. - Прокси не перехватывает HTTPS: Убедитесь, что сертификат Charles доверен (
Edgewise Proxy→Certificates). Добавьте сертификат в доверенные корневые сертификаты устройства. - Network Link Conditioner не влияет на трафик: Убедитесь, что эмулятор сети подключен к Wi-Fi/Cellular и что профиль активирован перед запуском приложения.
С этими инструментами вы сможете быстро выявлять и устранять любые сетевые проблемы в iOS-приложениях. Удачной отладки!