Expo апликација не ради преко HTTP на Android-у 9: крив је cleartext, а не VPN
Expo build који позива обичан HTTP API не успева на Android-у 9 и новијим верзијама. Тунел је невин: заставица cleartext припада конфигурацији build-а.
Објавили сте нови build, прешли на VPN и исти екран је престао да се учитава. На Android-у 9 и новијим верзијама чешће објашњење је досадније: платформа одбија обичан HTTP за апликације које циљају API 28 или више, а VPN је променио само довољно контекста да се то открије. Грешка коју видите зависи од HTTP клијента, зато он тако ретко каже cleartext.
Шта је тај неуспех заправо
Од Android-а 9 платформа подразумевано блокира cleartext чим апликација циља ниво API 28 или виши. Захтев на обичну HTTP адресу платформа одбија пре него што иједан пакет напусти уређај. Коју ћете грешку видети зависи од HTTP библиотеке: понекад општи мрежни неуспех, понекад истек времена, понекад порука која cleartext назива директно. Оно што никада не ради јесте да стигне до вашег сервера. Android документује подразумевано понашање и алтернативу ограничену на домен у упутству за безбедносну конфигурацију.
Прегледач на истом уређају и даље може да учита страницу, и то је траг који већина људи пропусти. Прегледачи не подлежу мрежној безбедносној политици ваше апликације.
Зашто се окривљује VPN
Обично се три ствари мењају истовремено. Апликација може да резолвира друго име хоста након повезивања VPN-а, уређај може бити нов са новијим build-ом, или сам build може да пређе на циљни ниво API који активира подразумевано понашање. VPN је видљив, а циљни SDK није, па VPN добија тикет.
Упоредите циљне нивое старог и новог build-а пре него што додирнете мрежну конфигурацију. Апликација која циља 27 или ниже је изузета, и то објашњава сваки извештај типа „код мене ради на старом телефону“.
Где заставица Expo заправо слеће
У управљаном Expo пројекту додавање подешавања у app.json не уређује Android манифест, јер манифест производе prebuild и развојни build-ови. Управо конфигурациони прикључак уписује подешавање у тој фази. Подржани пут је expo-build-properties, конфигурисан у конфигурацији апликације са опцијом cleartext под android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Исечак поставља само опцију прикључка; манифест се ствара касније. Покрените prebuild или свеж development-client build, па пре поновног тестирања прегледајте генерисани 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-ју у истој сесији. Резолвирање имена може да се разликује на та два пута, и само пар вам каже који говори истину.