Expo-appen feilar med HTTP på Android 9: det er cleartext, ikkje VPN-en
Eit Expo-bygg som kallar eit vanleg HTTP-API, feilar på Android 9 og nyare. Tunnelen er uskuldig: cleartext-flagget høyrer heime i byggjekonfigurasjonen.
Du slapp eit nytt bygg, gjekk over til VPN-en, og den same skjermen slutta å lastast. På Android 9 og nyare er den vanlegare forklaringa kjedelegare: plattformen avviser vanleg HTTP for appar som rettar seg mot API 28 eller høgare, og VPN-en endra berre nok kontekst til å avsløre det. Feilen du får, avheng av HTTP-klienten, og difor seier han så sjeldan cleartext.
Kva feilen eigentleg er
Frå Android 9 blokkerer plattformen cleartext som standard så snart ein app rettar seg mot API-nivå 28 eller høgare. Førespurnaden til ein vanleg HTTP-adresse blir avvist av plattformen før ein einaste pakke forlèt eininga. Kva feil du ser, avheng av HTTP-biblioteket: stundom ein generisk nettverksfeil, stundom eit tidsavbrot, stundom ei melding som namngjev cleartext direkte. Det han aldri gjer, er å nå tenaren din. Android dokumenterer standarden og det domenebegrensa alternativet i rettleiinga for tryggingskonfigurasjon.
Ein nettlesar på same eining kan framleis laste sida, og det er sporet dei fleste overser. Nettlesarar er ikkje underlagde nettverkstryggingspolicyen til appen.
Kvifor VPN-en får skulda
Tre ting endrar seg vanlegvis samstundes. Appen kan slå opp eit anna vertsnamn etter at VPN-en blir kopla til, eininga kan vere ny med eit nyare bygg, eller sjølve bygget kan ha flytta til eit mål-API-nivå som utløyser standarden. VPN-en er synleg og mål-SDK-en er det ikkje, så VPN-en får billetten.
Samanlikn målnivåa til det gamle og det nye bygget før du rører nettverkskonfigurasjonen. Ein app som rettar seg mot 27 eller lågare, er unntatt, og det forklarer kvar rapport om at det verkar på den eldre telefonen min.
Kvar Expo-flagget eigentleg landar
I eit administrert Expo-prosjekt redigerer det ikkje ein Android-manifest å leggje ei innstilling til app.json, fordi prebuild og utviklingsbygg er det som produserer manifestet. Det er ein konfigurasjonsplugin som skriv innstillinga på det stadiet. Den støtta vegen er expo-build-properties, konfigurert i appkonfigurasjonen med cleartext-valet under android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Utdraget set berre plugin-valet; manifestet blir produsert seinare. Køyr ein prebuild eller eit ferskt utviklingsklient-bygg, og undersøk deretter den genererte AndroidManifest.xml for android:usesCleartextTraffic før du testar på nytt, for ei omlasting med berre JS held på den gamle manifestet. Tilpass plugin-versjonen til Expo SDK-en prosjektet køyrer på. Plugin-val flyttar seg mellom utgjevingar, og eit utdrag kopiert frå ein annan SDK er ein påliteleg kjelde til stille no-ops.
Bare-arbeidsflyten og det smalare valet
For bare React Native er ekvivalenten android:usesCleartextTraffic på application-elementet, eller ein nettverkstryggingskonfigurasjon som berre tillèt cleartext for namngjevne domene. Den domenebegrensa forma er den ein bør føretrekkje, fordi ho tillèt det interne API-et og lèt alt anna bli på HTTPS. Ho dokumenterer òg si eiga unntaksliste, og det er den delen ein meldar vil spørje om.
Ingen av tilnærmingane endrar standarden til plattformen for noko du ikkje har namngjeve.
Prov det først frå einingloggen
Før du redigerer konfigurasjonen, skaff den nøyaktige feilen. adb logcat på ei tilkopla eining viser cleartext-avvisinga til plattformen og namngjev komponenten som reiste ho. Ein avvist socket, eit namn som ikkje let seg slå opp, eller eit mislukka TLS-handtrykk peikar ein heilt annan stad, og å slå på cleartext ville berre svekke appen unødig.
Hald deretter produksjonen ærleg. Cleartext er akseptabelt for eit laboratorium-endepunkt som ikkje kan tilby TLS, og berre i den kortaste tida du kan planleggje. Viss API-et kan avslutte TLS inne i det private nettverket, legg sertifikatet i tillitslageret til eininga og lat cleartext vere slått av, for tunnelen krypterer vegen til utgangen sin og ingenting etter.
Når endepunktet svarar over HTTPS, fjern løyvet, bygg på nytt og test på VPN-en og på vanleg Wi-Fi i same økta. Namneoppslag kan vere ulikt på dei to vegane, og berre paret fortel deg kven som seier sanninga.