Du slapp et nytt bygg, gikk over til VPN-en, og den samme skjermen sluttet å laste. På Android 9 og nyere er den vanligere forklaringen kjedeligere: plattformen avviser vanlig HTTP for apper som retter seg mot API 28 eller høyere, og VPN-en endret bare nok kontekst til å avsløre det. Feilen du får, avhenger av HTTP-klienten, og derfor sier den så sjelden cleartext.

Hva feilen egentlig er

Fra Android 9 blokkerer plattformen cleartext som standard så snart en app retter seg mot API-nivå 28 eller høyere. Forespørselen til en vanlig HTTP-adresse avvises av plattformen før en eneste pakke forlater enheten. Hvilken feil du ser, avhenger av HTTP-biblioteket: noen ganger en generisk nettverksfeil, noen ganger en tidsavbrudd, noen ganger en melding som navngir cleartext direkte. Det den aldri gjør, er å nå serveren din. Android dokumenterer standarden og det domenebegrensede alternativet i veiledningen for sikkerhetskonfigurasjon.

En nettleser på samme enhet kan fortsatt laste siden, og det er sporet de fleste overser. Nettlesere er ikke underlagt appens nettverkssikkerhetspolicy.

Hvorfor VPN-en får skylden

Tre ting endres vanligvis samtidig. Appen kan slå opp et annet vertsnavn etter at VPN-en kobles til, enheten kan være ny med et nyere bygg, eller selve bygget kan ha flyttet til et mål-API-nivå som utløser standarden. VPN-en er synlig og mål-SDK-en er ikke, så VPN-en får billetten.

Sammenlign målnivåene til det gamle og det nye bygget før du rører nettverkskonfigurasjonen. En app som retter seg mot 27 eller lavere, er unntatt, og det forklarer hver rapport om at det virker på min eldre telefon.

Hvor Expo-flagget egentlig lander

I et administrert Expo-prosjekt redigerer det ikke en Android-manifest å legge en innstilling til app.json, fordi prebuild og utviklingsbygg er det som produserer manifestet. Det er en konfigurasjonsplugin som skriver innstillingen på det stadiet. Den støttede veien er expo-build-properties, konfigurert i appkonfigurasjonen med cleartext-valget under android.

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

Utdraget setter bare plugin-valget; manifestet produseres senere. Kjør en prebuild eller et ferskt utviklingsklient-bygg, og undersøk deretter den genererte AndroidManifest.xml for android:usesCleartextTraffic før du tester på nytt, for en omlasting med bare JS beholder den gamle manifestet. Tilpass plugin-versjonen til Expo SDK-en prosjektet kjører på. Plugin-valg flytter seg mellom utgivelser, og et utdrag kopiert fra en annen SDK er en pålitelig kilde til stille no-ops.

Bare-arbeidsflyten og det smalere valget

For bare React Native er ekvivalenten android:usesCleartextTraffic på application-elementet, eller en nettverkssikkerhetskonfigurasjon som bare tillater cleartext for navngitte domener. Den domenebegrensede formen er den man bør foretrekke, fordi den tillater det interne API-et og lar alt annet bli på HTTPS. Den dokumenterer også sin egen unntaksliste, og det er den delen en anmelder vil spørre om.

Ingen av tilnærmingene endrer plattformens standard for noe du ikke har navngitt.

Bevis det først fra enhetsloggen

Før du redigerer konfigurasjonen, skaff den nøyaktige feilen. adb logcat på en tilkoblet enhet viser plattformens cleartext-avvisning og navngir komponenten som reiste den. En avvist socket, et navn som ikke lar seg slå opp, eller et mislykket TLS-håndtrykk peker et helt annet sted, og å slå på cleartext ville bare svekke appen unødvendig.

Hold deretter produksjonen ærlig. Cleartext er akseptabelt for et laboratorie-endepunkt som ikke kan tilby TLS, og bare i den korteste tiden du kan planlegge. Hvis API-et kan avslutte TLS inne i det private nettverket, legg sertifikatet i enhetens tillitslager og la cleartext være slått av, for tunnelen krypterer veien til utgangen sin og ingenting etter.

Når endepunktet svarer over HTTPS, fjern tillatelsen, bygg på nytt og test på VPN-en og på vanlig Wi-Fi i samme økt. Navneoppslag kan være forskjellig på de to veiene, og bare paret forteller deg hvilken som sier sannheten.

Relaterte artikler