Objavili ste novi build, prešli na VPN, a isti ekran se prestao učitavati. Na Androidu 9 i novijim češće objašnjenje je dosadnije: platforma odbija običan HTTP za aplikacije koje ciljaju API 28 ili viši, a VPN je promijenio samo dovoljno konteksta da to otkrije. Greška koju dobijete zavisi od HTTP klijenta, zato on tako rijetko kaže cleartext.

Šta je taj neuspjeh zapravo

Od Androida 9 nadalje platforma po defaultu blokira cleartext čim aplikacija cilja API nivo 28 ili viši. Zahtjev na običnu HTTP adresu platforma odbija prije nego ijedan paket napusti uređaj. Koju ćete grešku vidjeti zavisi od HTTP biblioteke: ponekad opći mrežni neuspjeh, ponekad istek vremena, ponekad poruka koja izričito navodi cleartext. Ono što nikada ne radi jeste da stigne do vašeg servera. Android dokumentuje default i alternativu ograničenu na domenu u vodiču za sigurnosnu konfiguraciju.

Preglednik na istom uređaju i dalje može učitati stranicu, a to je trag koji većina ljudi propusti. Preglednici ne podliježu mrežnoj sigurnosnoj politici vaše aplikacije.

Zašto se okrivljuje VPN

Tri stvari se obično mijenjaju odjednom. Aplikacija može razriješiti drugo ime hosta nakon spajanja na VPN, uređaj može biti nov s novijim buildom, ili se sam build mogao prebaciti na ciljni API nivo koji aktivira default. VPN je vidljiv, a ciljni SDK nije, pa VPN dobija tiket.

Uporedite ciljne nivoe starog i novog builda prije nego što dirnete mrežnu konfiguraciju. Aplikacija koja cilja 27 ili niže je izuzeta, što objašnjava svaki izvještaj „radi na mom starijem telefonu“.

Gdje zastavica Expo zapravo sjeda

U upravljanom Expo projektu dodavanje postavke u app.json ne uređuje Android manifest, jer manifest proizvode prebuild i development buildovi. Konfiguracijski plugin je ono što upisuje postavku u toj fazi. Podržani put je expo-build-properties, konfigurisan u konfiguraciji aplikacije s opcijom cleartext pod android.

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

Isječak postavlja samo opciju plugina; manifest se proizvodi kasnije. Pokrenite prebuild ili svježi development-client build, pa prije ponovnog testa pregledajte generisani AndroidManifest.xml na android:usesCleartextTraffic, jer ponovno učitavanje samo JS-a zadržava stari manifest. Uskladite verziju plugina s Expo SDK-om na kojem projekt radi. Opcije plugina se sele između izdanja, a isječak kopiran s drugog SDK-a pouzdan je izvor tihih radnji bez efekta.

Bare tok rada i uža opcija

Za bare React Native ekvivalent je android:usesCleartextTraffic na elementu application, ili mrežna sigurnosna konfiguracija koja dopušta cleartext samo za imenovane domene. Oblik ograničen na domenu treba preferirati, jer dopušta interni API i ostavlja sve ostalo na HTTPS-u. On također dokumentuje vlastitu listu izuzetaka, a to je dio koji će recenzent pitati.

Nijedan pristup ne mijenja default platforme za bilo što što niste imenovali.

Prvo to dokažite iz dnevnika uređaja

Prije uređivanja konfiguracije pribavite tačan neuspjeh. adb logcat na priključenom uređaju pokazuje odbijanje cleartexta od platforme i imenuje komponentu koja ga je izazvala. Odbijeni socket, ime koje se ne može razriješiti ili neuspjeli TLS handshake upućuju negdje sasvim drugo, a uključivanje cleartexta samo bi oslabilo aplikaciju bez razloga.

Zatim držite produkciju iskrenom. Cleartext je prihvatljiv za laboratorijsku krajnju tačku koja ne može ponuditi TLS, i to samo najkraće što možete isplanirati. Ako API može terminirati TLS unutar privatne mreže, stavite certifikat u trust store uređaja i ostavite cleartext isključen, jer tunel šifruje put do svog izlaza i ništa dalje.

Kad krajnja tačka odgovori na HTTPS, uklonite dozvolu, ponovo izgradite i testirajte na VPN-u i na običnom Wi-Fi-ju u istoj sesiji. Razrješavanje imena može se razlikovati između ta dva puta, a samo par pokazuje koji od njih govori istinu.

Povezani članci