Вы выпустили новую сборку, перешли на VPN, и тот же экран перестал загружаться. На Android 9 и новее более частое объяснение скучнее: платформа отказывает в простом HTTP приложениям, нацеленным на API 28 или выше, а VPN изменил лишь столько контекста, чтобы это проявилось. Ошибка, которую вы видите, зависит от HTTP-клиента, поэтому он так редко говорит cleartext.

Что на самом деле представляет собой этот сбой

Начиная с Android 9 платформа по умолчанию блокирует cleartext, как только приложение нацелено на уровень API 28 или выше. Запрос к простому HTTP-адресу отклоняется платформой раньше, чем из устройства уйдёт хотя бы один пакет. Какая ошибка вам покажется, зависит от библиотеки HTTP: иногда общий сетевой сбой, иногда тайм-аут, иногда сообщение, прямо называющее cleartext. Чего она не делает никогда — не доходит до вашего сервера. Android документирует поведение по умолчанию и альтернативу с ограничением по домену в руководстве по настройке безопасности.

Браузер на том же устройстве по-прежнему может загрузить страницу, и это та подсказка, которую большинство упускает. Браузеры не подчиняются сетевой политике безопасности вашего приложения.

Почему винят VPN

Обычно три вещи меняются одновременно. После подключения VPN приложение может разрешать другое имя хоста, устройство может быть новым с более свежей сборкой, или сама сборка могла перейти на целевой уровень API, который включает поведение по умолчанию. VPN видно, а целевой SDK нет, поэтому заявку получает VPN.

Сравните целевые уровни старой и новой сборки, прежде чем трогать сетевую конфигурацию. Приложение, нацеленное на 27 или ниже, освобождено, и это объясняет каждое сообщение «у меня работает на старом телефоне».

Где на самом деле оказывается флаг Expo

В управляемом проекте Expo добавление настройки в app.json не редактирует манифест Android, потому что манифест создают prebuild и сборки для разработки. Именно плагин конфигурации записывает настройку на этом этапе. Поддерживаемый путь — expo-build-properties, настроенный в конфигурации приложения с опцией cleartext в разделе android.

{
  "plugins": [
    ["expo-build-properties", {
      "android": { "usesCleartextTraffic": true }
    }]
  ]
}

Фрагмент задаёт только опцию плагина; манифест создаётся позже. Запустите prebuild или свежую сборку клиента разработки, а затем перед повторной проверкой просмотрите созданный AndroidManifest.xml на наличие android:usesCleartextTraffic, потому что перезагрузка только на JS сохраняет старый манифест. Согласуйте версию плагина с Expo SDK, на котором работает проект. Опции плагина меняются от выпуска к выпуску, и фрагмент, скопированный из другого SDK, — надёжный источник тихого бездействия.

Bare-сценарий и более узкий вариант

Для bare React Native эквивалент — android:usesCleartextTraffic на элементе application или конфигурация сетевой безопасности, разрешающая cleartext только для названных доменов. Форма с ограничением по домену предпочтительнее, потому что она разрешает внутренний API, а всё остальное оставляет на HTTPS. Она также документирует собственный список исключений, и именно об этой части спросит рецензент.

Ни один из подходов не меняет поведение платформы по умолчанию для того, что вы не назвали.

Сначала докажите это по журналу устройства

Прежде чем править конфигурацию, получите точный сбой. adb logcat на подключённом устройстве показывает отказ платформы в cleartext и называет компонент, который его вызвал. Отвергнутый сокет, неразрешаемое имя или неудачное рукопожатие TLS указывают совсем в другое место, а включение cleartext лишь без пользы ослабило бы приложение.

Затем сохраняйте честность в продакшене. Cleartext допустим для лабораторной точки, которая не может предложить TLS, и только на самый короткий срок, который вы можете спланировать. Если API может завершать TLS внутри частной сети, положите сертификат в хранилище доверия устройства и оставьте cleartext выключенным, потому что туннель шифрует путь до своего выхода и ничего после него.

Как только точка начнёт отвечать по HTTPS, уберите разрешение, пересоберите и проверьте на VPN и на обычном Wi-Fi в одном сеансе. Разрешение имён может различаться на этих двух путях, и только пара скажет, какой из них говорит правду.

Похожие статьи