Išleidote naują rinkinį, perėjote prie VPN, ir tas pats ekranas nustojo krautis. „Android 9“ ir naujesnėse versijose dažnesnis paaiškinimas yra nuobodesnis: platforma atsisako paprasto HTTP programėlėms, kurios taiko API 28 arba naujesnį lygį, o VPN pakeitė tik tiek konteksto, kad tai paaiškėtų. Klaida, kurią matote, priklauso nuo HTTP kliento, todėl jis taip retai sako cleartext.

Kas iš tikrųjų yra šis nepavykimas

Nuo „Android 9“ platforma pagal numatytuosius nustatymus blokuoja cleartext, kai tik programėlė taiko API 28 lygį arba naujesnį. Platforma atmeta užklausą paprastu HTTP adresu dar prieš įrenginiui paliekant vienam paketui. Kokią klaidą matysite, priklauso nuo HTTP bibliotekos: kartais bendra tinklo klaida, kartais laiko limitas, kartais pranešimas, kuriame cleartext įvardijamas tiesiogiai. Ko ji niekada nedaro, tai nepasiekia jūsų serverio. „Android“ dokumentuoja numatytąjį elgesį ir domenu apribotą alternatyvą savo saugos konfigūracijos vadove.

To paties įrenginio naršyklė vis tiek gali įkelti puslapį, ir tai yra užuomina, kurią dauguma praleidžia. Naršyklėms jūsų programėlės tinklo saugos politika negalioja.

Kodėl kaltinamas VPN

Paprastai vienu metu keičiasi trys dalykai. Programėlė po VPN prisijungimo gali išspręsti kitą pagrindinio kompiuterio vardą, įrenginys gali būti naujas su naujesniu rinkiniu, arba pats rinkinys galėjo pereiti prie tikslinio API lygio, kuris įjungia numatytąjį elgesį. VPN matomas, o tikslinis SDK ne, todėl bilietą gauna VPN.

Prieš liesdami tinklo konfigūraciją palyginkite seno ir naujo rinkinio tikslinius lygius. Programėlė, taikanti 27 arba žemesnį lygį, yra atleista, ir tai paaiškina kiekvieną pranešimą „man veikia sename telefone“.

Kur iš tikrųjų atsiduria „Expo“ vėliavėlė

Valdomame „Expo“ projekte nustatymo pridėjimas prie app.json neredaguoja „Android“ manifesto, nes manifestą sukuria prebuild ir kūrimo rinkiniai. Būtent konfigūracijos papildinys tą nustatymą ir įrašo tame etape. Palaikomas kelias yra expo-build-properties, sukonfigūruotas programėlės konfigūracijoje su cleartext parinktimi po android.

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

Ištrauka nustato tik papildinio parinktį; manifestas sukuriamas vėliau. Paleiskite prebuild arba naują kūrimo kliento rinkinį, tada prieš testuodami dar kartą patikrinkite sugeneruotą AndroidManifest.xml dėl android:usesCleartextTraffic, nes perkrovimas vien JS palieka seną manifestą. Suderinkite papildinio versiją su „Expo“ SDK, kuriuo veikia projektas. Papildinio parinktys keičiasi tarp leidimų, o iš kito SDK nukopijuota ištrauka yra patikimas tylios neveikos šaltinis.

Bare eiga ir siauresnė parinktis

Bare React Native atitikmuo yra android:usesCleartextTraffic application elemente arba tinklo saugos konfigūracija, leidžianti cleartext tik įvardytiems domenams. Domenu apribota forma yra ta, kurią verta rinktis, nes ji leidžia vidinį API, o visa kita palieka HTTPS. Ji taip pat dokumentuoja savo išimčių sąrašą, ir būtent apie šią dalį klaus recenzentas.

Nė vienas iš dviejų būdų nekeičia platformos numatytojo elgesio tam, ko neįvardijote.

Pirmiausia įrodykite tai iš įrenginio žurnalo

Prieš redaguodami konfigūraciją gaukite tikslią klaidą. Prijungtame įrenginyje adb logcat rodo platformos cleartext atmetimą ir įvardija komponentą, kuris jį sukėlė. Atmestas lizdas, neišsprendžiamas vardas ar nepavykęs TLS rankos paspaudimas rodo visai kitur, o cleartext įjungimas tik be reikalo susilpnintų programėlę.

Tada laikykite produkciją sąžiningą. Cleartext priimtinas laboratorijos galiniam taškui, kuris negali pasiūlyti TLS, ir tik trumpiausiam laikui, kurį galite suplanuoti. Jei API gali užbaigti TLS privačiame tinkle, įdėkite sertifikatą į įrenginio patikimumo saugyklą ir palikite cleartext išjungtą, nes tunelis šifruoja kelią iki savo išėjimo ir nieko už jo.

Kai galinis taškas atsakys per HTTPS, pašalinkite leidimą, iš naujo sukurkite ir testuokite per VPN bei įprastą Wi-Fi toje pačioje sesijoje. Vardų sprendimas šiais dviem keliais gali skirtis, ir tik pora pasako, kuris sako tiesą.

Susiję straipsniai