Интеграция Charles Proxy / Proxyman для отладки сетевых запросов мобильного приложения
Без proxy-инструмента отладка сетевого слоя — это print(response) в коде и надежда, что что-то увидишь. Charles Proxy и Proxyman перехватывают весь трафик устройства: видны реальные заголовки, тела запросов и ответов, время, редиректы, вебсокеты. Это стандартный инструмент для отладки и тестирования API-интеграций.
Настройка Charles Proxy
Установка корневого сертификата на iOS:
- Charles: Help → SSL Proxying → Install Charles Root Certificate on iOS Simulator / Mobile Device
- На устройстве — Settings → General → VPN & Device Management → установить профиль
- Settings → General → About → Certificate Trust Settings → включить доверие к Charles Proxy CA
После этого Charles видит HTTPS трафик. Без доверия к сертификату — только метаданные, тело зашифровано.
Настройка Wi-Fi proxy на устройстве: тот же Wi-Fi, что на Mac → Manual proxy → IP-адрес Mac, порт 8888 (дефолт Charles).
SSL Proxying List в Charles: по умолчанию расшифровываются не все домены — нужно добавить * или конкретные хосты через Proxy → SSL Proxying Settings → Include.
Proxyman как альтернатива
Proxyman — более современный macOS-инструмент с нативным SwiftUI интерфейсом. Быстрее настраивается, чище UI, лучше работает с WebSocket и HTTP/2. Поддерживает автоматическую установку сертификата через Proxyman Certificate Assistant — несколько кликов вместо ручной установки профиля.
Ключевые фичи Proxyman:
- Script editor: перехватываем запрос/ответ и модифицируем через JavaScript (имитация бэкенд-ответов без изменения сервера)
- Breakpoints: останавливаем запрос до отправки, редактируем, продолжаем
- Map Local / Map Remote: редирект запросов на другой URL или на локальный файл (мокирование)
Работа с certificate pinning
Если приложение использует certificate pinning, Charles/Proxyman не будут видеть трафик — NSURLErrorDomain -1200 или SSLPeerUnverifiedException. Решение для dev/QA-сборки:
iOS: условно отключить pinning через #if DEBUG:
#if DEBUG
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
#else
// production pinning logic
#endif
Android: network_security_config.xml с отдельным конфигом для debug:
<!-- res/xml/network_security_config.xml (debug) -->
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="user"/>
</trust-anchors>
</debug-overrides>
</network-security-config>
С этим конфигом в debug-сборке система доверяет пользовательским CA (куда добавляется Charles/Proxyman сертификат), в release — нет.
Типичные сценарии использования
- Проверка правильности заголовков авторизации (Bearer token, API key)
- Отладка multipart/form-data загрузки файлов
- Тестирование поведения при медленном соединении (throttling в Charles: Proxy → Throttle Settings)
- Проверка обработки ошибочных HTTP-ответов (Map Local → подставить 500 ответ)
- Отладка GraphQL запросов и WebSocket фреймов
Сроки
Настройка Charles или Proxyman под конкретный проект, включая SSL certificates, debug network security config и документация для команды — 4 часа–1 день.







