Nabibigo ang Expo app sa HTTP sa Android 9: cleartext ito, hindi VPN
Ang build ng Expo na tumatawag ng simpleng HTTP API ay nabibigo sa Android 9 at mas bago. Inosente ang tunnel: ang cleartext flag ay nasa build config.
Naglabas ka ng bagong build, lumipat sa VPN, at huminto ang parehong screen sa pag-load. Sa Android 9 at mas bago, ang mas karaniwang paliwanag ay mas nakakainip: tinatanggihan ng platform ang simpleng HTTP para sa mga app na naka-target sa API 28 o mas mataas, at binago lang ng VPN ang sapat na konteksto para ilantad ito. Ang error na nakikita mo ay depende sa HTTP client, kaya napakabihirang sabihin nitong cleartext.
Ano talaga ang pagkabigong ito
Mula Android 9, hinaharangan ng platform ang cleartext bilang default kapag naka-target ang app sa API level 28 o mas mataas. Tinatanggihan ng platform ang request sa simpleng HTTP address bago pa man umalis ang kahit isang packet sa device. Kung aling error ang makikita mo ay depende sa HTTP library: minsan pangkalahatang network failure, minsan timeout, minsan mensaheng direktang tinutukoy ang cleartext. Ang hindi nito ginagawa kailanman ay maabot ang server mo. Idinodokumento ng Android ang default at ang alternatibong limitado sa domain sa gabay sa configuration ng seguridad nito.
Ang browser sa parehong device ay nakakapag-load pa rin ng page, at iyon ang palatandaan na madalas palampasin ng karamihan. Ang mga browser ay hindi saklaw ng network security policy ng app mo.
Bakit ang VPN ang sinisisi
Karaniwang tatlong bagay ang nagbabago nang sabay. Maaaring mag-resolve ang app ng ibang hostname pagkatapos kumonekta ang VPN, maaaring bago ang device na may mas bagong build, o maaaring lumipat ang build mismo sa target na API level na nagti-trigger ng default. Nakikita ang VPN at hindi nakikita ang target na SDK, kaya VPN ang nakakakuha ng ticket.
Ihambing ang target level ng luma at bagong build bago hawakan ang network configuration. Ang app na naka-target sa 27 o mas mababa ay exempted, at iyon ang nagpapaliwanag sa bawat ulat na «gumagana ito sa lumang telepono ko».
Saan talaga napupunta ang flag ng Expo
Sa managed na Expo project, ang pagdaragdag ng setting sa app.json ay hindi nag-e-edit ng Android manifest, dahil prebuild at development build ang gumagawa ng manifest. Ang config plugin ang nagsusulat ng setting sa yugtong iyon. Ang sinusuportahang ruta ay expo-build-properties, na naka-configure sa app config kasama ang cleartext option sa ilalim ng android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Ang snippet ay nagtatakda lamang ng plugin option; ginagawa ang manifest mamaya. Magpatakbo ng prebuild o bagong development-client build, pagkatapos bago mag-test muli ay siyasatin ang nabuong AndroidManifest.xml para sa android:usesCleartextTraffic, dahil pinapanatili ng reload na JS lang ang lumang manifest. Itugma ang bersyon ng plugin sa Expo SDK na pinapatakbo ng project. Nagbabago ang plugin options sa pagitan ng mga release, at ang snippet na kinopya mula sa ibang SDK ay mapagkakatiwalaang pinagmumulan ng tahimik na no-op.
Ang bare workflow at ang mas makitid na opsyon
Para sa bare React Native ang katumbas ay android:usesCleartextTraffic sa application element, o network security configuration na nagpapahintulot ng cleartext para lamang sa pinangalanang domain. Ang form na limitado sa domain ang dapat piliin, dahil pinapayagan nito ang internal na API at iniiwan ang lahat ng iba sa HTTPS. Idinodokumento rin nito ang sarili nitong listahan ng exception, at iyon ang bahaging tatanungin ng isang reviewer.
Wala sa dalawang paraan ang nagbabago ng default ng platform para sa anumang hindi mo pinangalanan.
Patunayan muna ito mula sa log ng device
Bago i-edit ang configuration, kunin ang eksaktong pagkabigo. adb logcat sa nakakonektang device ay nagpapakita ng pagtanggi ng platform sa cleartext at pinangalanan ang component na nagtaas nito. Ang tinanggihang socket, pangalang hindi nagre-resolve, o bigong TLS handshake ay tumuturo sa ibang lugar nang lubusan, at ang pagpapagana ng cleartext ay papahinain lang ang app nang walang dahilan.
Pagkatapos, panatilihing matapat ang production. Ang cleartext ay katanggap-tanggap para sa laboratory endpoint na hindi makapag-alok ng TLS, at para lamang sa pinakamaikling panahong maaari mong planuhin. Kung kayang tapusin ng API ang TLS sa loob ng pribadong network, ilagay ang certificate sa trust store ng device at iwanang naka-disable ang cleartext, dahil ine-encrypt ng tunnel ang daan hanggang sa labasan nito at wala nang iba pa.
Kapag sumagot na ang endpoint sa HTTPS, alisin ang pahintulot, i-build muli at subukan sa VPN at sa ordinaryong Wi-Fi sa parehong session. Maaaring magkaiba ang name resolution sa dalawang daang iyon, at ang pares lang ang magsasabi kung alin ang nagsasabi ng totoo.