Դուք թողարկեցիք նոր build, անցաք VPN-ի, և նույն էկրանը դադարեց բեռնվել։ Android 9-ում և ավելի նոր տարբերակներում ավելի տարածված բացատրությունն ավելի ձանձրալի է. հարթակը մերժում է սովորական HTTP-ն այն հավելվածների համար, որոնք թիրախավորում են API 28-ը կամ ավելի բարձր, իսկ VPN-ը փոխեց միայն այնքան համատեքստ, որ դա բացահայտվի։ Ձեր տեսած սխալը կախված է HTTP հաճախորդից, դրա համար էլ այն այդքան հազվադեպ է ասում cleartext։

Ինչ է իրականում այս ձախողումը

Android 9-ից սկսած՝ հարթակը լռելյայն արգելափակում է cleartext-ը, հենց որ հավելվածը թիրախավորում է API 28 մակարդակը կամ ավելի բարձր։ Հարթակը մերժում է պարզ HTTP հասցեին ուղղված հարցումը նախքան սարքից մեկ փաթեթի դուրս գալը։ Թե որ սխալը կտեսնեք, կախված է HTTP գրադարանից. երբեմն ընդհանուր ցանցային ձախողում, երբեմն ժամկետի լրանալ, երբեմն հաղորդագրություն, որն ուղղակիորեն անվանում է cleartext։ Այն, ինչ նա երբեք չի անում, ձեր սերվերին հասնելն է։ Android-ը փաստաթղթավորում է լռելյայն վարքը և տիրույթով սահմանափակված այլընտրանքը իր անվտանգության կարգավորման ուղեցույցում։

Նույն սարքի զննարկիչը դեռ կարող է բեռնել էջը, և հենց դա է այն ակնարկը, որը շատերը բաց են թողնում։ Զննարկիչները ենթակա չեն ձեր հավելվածի ցանցային անվտանգության քաղաքականությանը։

Ինչու են մեղադրում VPN-ին

Սովորաբար երեք բան փոխվում է միաժամանակ։ Հավելվածը VPN-ի միանալուց հետո կարող է լուծել այլ հոսթի անուն, սարքը կարող է նոր լինել ավելի նոր build-ով, կամ build-ն ինքն անցած լինի թիրախ API մակարդակի, որը միացնում է լռելյայն վարքը։ VPN-ը տեսանելի է, իսկ թիրախ SDK-ն՝ ոչ, ուստի տոմսը ստանում է VPN-ը։

Համեմատեք հին և նոր build-երի թիրախ մակարդակները նախքան ցանցային կոնֆիգուրացիային դիպչելը։ 27 կամ ավելի ցածր թիրախավորող հավելվածն ազատված է, և դա բացատրում է «իմ հին հեռախոսում աշխատում է» տիպի բոլոր հաղորդումները։

Ուր է իրականում ընկնում Expo-ի դրոշակը

Կառավարվող Expo նախագծում app.json-ին կարգավորում ավելացնելը չի խմբագրում Android-ի մանիֆեստը, որովհետև մանիֆեստը ստեղծում են prebuild-ը և development build-երը։ Այդ փուլում կարգավորումը գրում է կոնֆիգուրացիոն պլագինը։ Աջակցվող ուղին expo-build-properties-ն է, որը կարգավորվում է հավելվածի կոնֆիգում՝ cleartext տարբերակով android-ի տակ։

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

Հատվածը սահմանում է միայն պլագինի տարբերակը. մանիֆեստը ստեղծվում է ավելի ուշ։ Գործարկեք prebuild կամ թարմ development-client build, ապա նորից փորձարկելուց առաջ ստուգեք ստեղծված AndroidManifest.xml-ը android:usesCleartextTraffic-ի համար, որովհետև միայն JS-ով վերաբեռնումը պահպանում է հին մանիֆեստը։ Համապատասխանեցրեք պլագինի տարբերակը այն Expo SDK-ին, որի վրա աշխատում է նախագիծը։ Պլագինի տարբերակները փոխվում են թողարկումների միջև, և այլ SDK-ից պատճենված հատվածը լուռ անգործության հուսալի աղբյուր է։

Bare հոսքը և ավելի նեղ տարբերակը

Bare React Native-ի համար համարժեքը android:usesCleartextTraffic-ն է application տարրի վրա, կամ ցանցային անվտանգության կոնֆիգուրացիա, որը cleartext-ը թույլատրում է միայն նշված տիրույթների համար։ Տիրույթով սահմանափակված ձևն է նախընտրելին, որովհետև այն թույլատրում է ներքին API-ն և մնացած ամեն ինչ թողնում HTTPS-ի վրա։ Այն նաև փաստաթղթավորում է իր սեփական բացառությունների ցանկը, և հենց այդ մասին կհարցնի գրախոսը։

Մոտեցումներից ոչ մեկը չի փոխում հարթակի լռելյայն վարքը որևէ բանի համար, ինչ դուք չեք անվանել։

Նախ ապացուցեք դա սարքի մատյանից

Նախքան կոնֆիգուրացիան խմբագրելը՝ ստացեք ճշգրիտ ձախողումը։ Միացված սարքում adb logcat-ը ցույց է տալիս հարթակի cleartext մերժումը և անվանում այն բաղադրիչը, որն առաջացրել է այն։ Մերժված սոքեթը, չլուծվող անունը կամ ձախողված TLS ձեռքսեղմումը մատնանշում են բոլորովին այլ տեղ, և cleartext-ի միացումը միայն անտեղի կթուլացնի հավելվածը։

Ապա պահեք արտադրությունը ազնիվ։ Cleartext-ը ընդունելի է լաբորատոր վերջնակետի համար, որը չի կարող TLS առաջարկել, և միայն ամենակարճ ժամկետով, որը կարող եք պլանավորել։ Եթե API-ն կարող է ավարտել TLS-ը մասնավոր ցանցի ներսում, դրեք վկայականը սարքի վստահության պահոցում և թողեք cleartext-ը անջատված, որովհետև թունելը գաղտնագրում է ճանապարհը մինչև իր ելքը և ոչինչ դրանից հետո։

Հենց վերջնակետը պատասխանի HTTPS-ով, հեռացրեք թույլտվությունը, նորից կառուցեք և փորձարկեք VPN-ում և սովորական Wi-Fi-ում նույն սեսիայում։ Անունների լուծումը կարող է տարբերվել այս երկու ուղիներում, և միայն զույգն է ասում, թե որն է ճշմարտությունն ասում։

Առնչվող հոդվածներ