Expo अॅप Android 9 वर HTTP मध्ये अयशस्वी: कारण cleartext आहे, VPN नाही
साध्या HTTP API ला कॉल करणारे Expo बिल्ड Android 9 आणि नंतरच्या आवृत्त्यांवर अयशस्वी होते. टनेल निर्दोष आहे: cleartext फ्लॅग बिल्ड कॉन्फिगमध्ये असावा.
तुम्ही नवीन बिल्ड प्रकाशित केले, VPN वर गेलात, आणि तोच स्क्रीन लोड होणे थांबले. Android 9 आणि नंतरच्या आवृत्त्यांवर अधिक सामान्य स्पष्टीकरण अधिक नीरस आहे: प्लॅटफॉर्म API 28 किंवा त्याहून जास्त लक्ष्य करणाऱ्या अॅप्ससाठी साधे HTTP नाकारतो, आणि VPN ने ते उघड करण्याइतका संदर्भच बदलला. तुम्हाला दिसणारी त्रुटी HTTP क्लायंटवर अवलंबून असते, म्हणूनच ती cleartext असे इतक्या क्वचितच म्हणते.
हे अयशस्वी होणे प्रत्यक्षात काय आहे
Android 9 पासून प्लॅटफॉर्म डीफॉल्टने cleartext ब्लॉक करतो, अॅपने API स्तर 28 किंवा त्याहून जास्त लक्ष्य केल्याक्षणी. साध्या HTTP पत्त्यावरील विनंती एकही पॅकेट डिव्हाइसबाहेर जाण्यापूर्वीच प्लॅटफॉर्म नाकारतो. कोणती त्रुटी दिसेल हे HTTP लायब्ररीवर अवलंबून आहे: कधी सामान्य नेटवर्क अयशस्वीता, कधी वेळ संपणे, कधी cleartext चा थेट उल्लेख करणारा संदेश. जे ती कधीच करत नाही ते म्हणजे तुमच्या सर्व्हरपर्यंत पोहोचणे. Android डीफॉल्ट आणि डोमेन-मर्यादित पर्याय त्याच्या सुरक्षा कॉन्फिगरेशन मार्गदर्शकात नोंदवतो.
त्याच डिव्हाइसवरील ब्राउझर अजूनही पान लोड करू शकतो, आणि हाच तो सुगावा आहे जो बहुतेक लोक चुकवतात. ब्राउझर तुमच्या अॅपच्या नेटवर्क सुरक्षा धोरणाच्या अधीन नाहीत.
VPN ला दोष का मिळतो
सामान्यतः तीन गोष्टी एकाच वेळी बदलतात. VPN जोडल्यानंतर अॅप वेगळे होस्टनाव रिझॉल्व्ह करू शकते, डिव्हाइस नवीन आणि नव्या बिल्डसह असू शकते, किंवा बिल्डच डीफॉल्ट सक्रिय करणाऱ्या लक्ष्य API स्तरावर गेले असेल. VPN दिसतो आणि लक्ष्य SDK दिसत नाही, म्हणून तिकीट VPN ला मिळते.
नेटवर्क कॉन्फिगला हात लावण्यापूर्वी जुन्या आणि नव्या बिल्डच्या लक्ष्य स्तरांची तुलना करा. 27 किंवा त्याहून कमी लक्ष्य करणारे अॅप सूट आहे, आणि यामुळेच «माझ्या जुन्या फोनवर चालते» अशी प्रत्येक अहवाल समजते.
Expo फ्लॅग प्रत्यक्षात कुठे पडतो
व्यवस्थापित Expo प्रकल्पात app.json मध्ये सेटिंग जोडल्याने Android मॅनिफेस्ट संपादित होत नाही, कारण मॅनिफेस्ट prebuild आणि डेव्हलपमेंट बिल्ड तयार करतात. त्या टप्प्यावर सेटिंग कॉन्फिग प्लगइन लिहिते. समर्थित मार्ग expo-build-properties आहे, जो अॅप कॉन्फिगमध्ये android अंतर्गत cleartext पर्यायासह कॉन्फिगर केला जातो.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}स्निपेट फक्त प्लगइन पर्याय सेट करते; मॅनिफेस्ट नंतर तयार होते. prebuild किंवा नवीन डेव्हलपमेंट-क्लायंट बिल्ड चालवा, नंतर पुन्हा चाचणी करण्यापूर्वी तयार झालेल्या AndroidManifest.xml मध्ये android:usesCleartextTraffic आहे का ते पहा, कारण फक्त JS रीलोड केल्यास जुने मॅनिफेस्ट टिकून राहते. प्लगइन आवृत्ती प्रकल्प ज्या Expo SDK वर चालतो त्याला जुळवा. प्लगइन पर्याय आवृत्त्यांमध्ये बदलतात, आणि दुसऱ्या SDK वरून कॉपी केलेले स्निपेट शांत निष्क्रियतेचा विश्वासार्ह स्रोत आहे.
Bare प्रवाह आणि अधिक अरुंद पर्याय
bare React Native साठी समतुल्य म्हणजे application एलिमेंटवर android:usesCleartextTraffic, किंवा फक्त नामनिर्देशित डोमेनसाठी cleartext परवानगी देणारे नेटवर्क सुरक्षा कॉन्फिग. डोमेन-मर्यादित स्वरूप निवडले पाहिजे, कारण ते अंतर्गत API ला परवानगी देते आणि बाकी सर्व HTTPS वर ठेवते. ते स्वतःची अपवाद यादीही नोंदवते, आणि पुनरावलोकक अगदी त्याच भागाबद्दल विचारेल.
दोन्हीपैकी कोणताही दृष्टिकोन तुम्ही नाव न दिलेल्या कोणत्याही गोष्टीसाठी प्लॅटफॉर्मचा डीफॉल्ट बदलत नाही.
आधी डिव्हाइस लॉगवरून सिद्ध करा
कॉन्फिग संपादित करण्यापूर्वी नेमकी अयशस्वीता मिळवा. जोडलेल्या डिव्हाइसवर adb logcat प्लॅटफॉर्मचा cleartext नकार दाखवते आणि तो उठवणाऱ्या घटकाचे नाव सांगते. नाकारलेला सॉकेट, रिझॉल्व्ह न होणारे नाव किंवा अयशस्वी TLS हँडशेक पूर्णपणे दुसरीकडे निर्देश करतात, आणि cleartext सक्षम केल्याने अॅप विनाकारण कमकुवत होईल.
मग उत्पादन प्रामाणिक ठेवा. TLS देऊ न शकणाऱ्या लॅब एंडपॉइंटसाठी cleartext स्वीकारार्ह आहे, आणि तुम्ही नियोजित करू शकता त्या सर्वात कमी कालावधीसाठीच. API खाजगी नेटवर्कमध्ये TLS संपवू शकत असल्यास, प्रमाणपत्र डिव्हाइसच्या ट्रस्ट स्टोअरमध्ये ठेवा आणि cleartext बंद ठेवा, कारण टनेल त्याच्या बाहेर पडण्यापर्यंतचा मार्ग एन्क्रिप्ट करते, त्यापुढे काहीही नाही.
एंडपॉइंटने HTTPS वर उत्तर द्यायला सुरुवात केल्यावर परवानगी काढा, पुन्हा बिल्ड करा आणि त्याच सत्रात VPN वर आणि सामान्य Wi-Fi वर चाचणी करा. नाव रिझोल्यूशन या दोन मार्गांमध्ये वेगळे असू शकते, आणि कोण सत्य सांगत आहे हे फक्त ती जोडीच सांगते.