Du udgav et nyt build, skiftede til VPN’en, og den samme skærm holdt op med at indlæse. På Android 9 og nyere er den mere almindelige forklaring kedeligere: platformen afviser almindelig HTTP for apps, der retter sig mod API 28 eller højere, og VPN’en ændrede kun nok kontekst til at afsløre det. Den fejl, du får, afhænger af HTTP-klienten, og derfor siger den så sjældent cleartext.

Hvad fejlen egentlig er

Fra Android 9 blokerer platformen cleartext som standard, når en app retter sig mod API-niveau 28 eller derover. Anmodningen til en almindelig HTTP-adresse afvises af platformen, før en enkelt pakke forlader enheden. Hvilken fejl du ser, afhænger af HTTP-biblioteket: nogle gange en generisk netværksfejl, nogle gange en timeout, nogle gange en besked, der direkte nævner cleartext. Det, den aldrig gør, er at nå din server. Android dokumenterer standarden og det domæneafgrænsede alternativ i sin vejledning til sikkerhedskonfiguration.

En browser på samme enhed kan stadig indlæse siden, og det er det spor, de fleste overser. Browsere er ikke underlagt din apps netværkssikkerhedspolitik.

Hvorfor VPN’en får skylden

Tre ting ændrer sig normalt på én gang. Appen kan slå et andet værtsnavn op, efter at VPN’en er forbundet, enheden kan være ny med et nyere build, eller selve buildet kan være flyttet til et mål-API-niveau, der udløser standarden. VPN’en er synlig, og mål-SDK’en er ikke, så VPN’en får billetten.

Sammenlign det gamle og det nye builds målniveauer, før du rører netværkskonfigurationen. En app, der retter sig mod 27 eller lavere, er undtaget, og det forklarer enhver rapport om, at det virker på min ældre telefon.

Hvor Expo-flaget egentlig lander

I et administreret Expo-projekt redigerer det ikke en Android-manifest at tilføje en indstilling til app.json, fordi prebuild og development-builds er det, der producerer manifestet. Det er et konfigurationsplugin, der skriver indstillingen på det trin. Den understøttede vej er expo-build-properties, konfigureret i app-konfigurationen med cleartext-muligheden under android.

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

Uddraget sætter kun plugin-muligheden; manifestet produceres senere. Kør et prebuild eller et frisk development-client-build, og undersøg derefter den genererede AndroidManifest.xml for android:usesCleartextTraffic, før du tester igen, for en genindlæsning med kun JS beholder det gamle manifest. Afstem plugin-versionen med den Expo SDK, projektet kører på. Plugin-muligheder flytter sig mellem udgivelser, og et uddrag kopieret fra en anden SDK er en pålidelig kilde til stille no-ops.

Bare-forløbet og den smallere mulighed

For bare React Native er ækvivalenten android:usesCleartextTraffic på application-elementet, eller en netværkssikkerhedskonfiguration, der kun tillader cleartext for navngivne domæner. Den domæneafgrænsede form er den, man bør foretrække, fordi den tillader den interne API og lader alt andet blive på HTTPS. Den dokumenterer også sin egen undtagelsesliste, og det er den del, en anmelder vil spørge om.

Ingen af tilgangene ændrer platformens standard for noget, du ikke har navngivet.

Bevis det først ud fra enhedsloggen

Før du redigerer konfigurationen, skal du hente den præcise fejl. adb logcat på en tilsluttet enhed viser platformens cleartext-afvisning og navngiver den komponent, der rejste den. En afvist socket, et navn, der ikke kan slås op, eller et mislykket TLS-håndtryk peger et helt andet sted hen, og at slå cleartext til ville kun svække appen unødigt.

Hold derefter produktionen ærlig. Cleartext er acceptabelt for et laboratorie-endpoint, der ikke kan tilbyde TLS, og kun i den korteste tid, du kan planlægge. Hvis API’en kan afslutte TLS inde i det private netværk, så læg certifikatet i enhedens trust store og lad cleartext være slået fra, for tunnelen krypterer vejen til sin udgang og intet derefter.

Når endpointet svarer over HTTPS, fjern tilladelsen, byg igen, og test på VPN’en og på almindeligt Wi-Fi i samme session. Navneopslag kan være forskelligt på de to veje, og kun parret fortæller dig, hvilken der taler sandt.

Relaterede artikler