Прыкладанне Expo не загружае HTTP на Android 9: справа ў cleartext, а не ў VPN
Зборка Expo, якая звяртаецца да звычайнага HTTP API, не працуе на Android 9 і навейшых. Тунель не вінаваты: сцяг cleartext месца ў канфігурацыі зборкі.
Вы выпусцілі новую зборку, перайшлі на 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 і development-зборкі. Параметр на гэтым этапе запісвае менавіта канфігурацыйны плагін. Падтрыманы шлях — expo-build-properties, наладжаны ў канфігурацыі праграмы з опцыяй cleartext у android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Фрагмент задае толькі опцыю плагіна; маніфест ствараецца пазней. Запусціце prebuild або свежую зборку development-кліента, затым перад паўторным тэстам праверце створаны 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 у адным сеансе. Разрозніванне імёнаў можа адрознівацца на гэтых двух шляхах, і толькі пара паказвае, які з іх кажа праўду.