VPN के ज़रिए iPhone ऐप से आंतरिक API कैसे कॉल करें
टनल को छूने से पहले विफल अनुरोध को उसके NSURLError कोड से वर्गीकृत करें, फिर ठीक उसी परत को ठीक करें जो वास्तव में टूटी है।
API उसी फ़ोन पर Safari में जवाब देता है, जबकि ऐप का अनुरोध समय-सीमा पार कर जाता है। यह अंतर आम तौर पर टनल नहीं है: आंतरिक सेवा को कॉल करने वाला ऐप सामान्य HTTPS अनुरोध करता है, और डिवाइस पर मौजूद VPN केवल यह तय करता है कि उस अनुरोध का कोई रास्ता है या नहीं। ऐप में दूसरी टनल लिखना एक उत्पाद निर्णय है, समय-सीमा के लिए मरम्मत नहीं। नीचे दिया गया भाग विफलता को इस आधार पर वर्गीकृत करता है कि वह कहाँ होती है, ऐप के पास पहले से मौजूद त्रुटि-सतह का उपयोग करते हुए।
टनल से नहीं, त्रुटि से शुरू करें
URLSession परिवहन विफलताओं को NSError मानों के रूप में NSURLErrorDomain में रिपोर्ट करता है, और कोड सबसे सस्ता उपलब्ध सबूत है। कोई भी कॉन्फ़िगरेशन बदलने से पहले उस कोड को विफल हो रहे होस्टनाम और कार्य के बीते समय के साथ लॉग करें। समय-सीमा, नाम विफलता और विश्वास विफलता स्क्रीन पर एक जैसी दिखती हैं और तीन अलग मरम्मत माँगती हैं। पहले वर्गीकृत करें, फिर उस वर्ग का अनुभाग पढ़ें।
कार्य मेट्रिक्स अगले प्रश्न का उत्तर देते हैं, कि कभी कनेक्शन बना या नहीं, जो कभी रास्ता न मिले अनुरोध को उस अनुरोध से अलग करता है जिसका जवाब सर्वर ने बहुत देर से दिया। इनमें से किसी के लिए टनल बदलने की ज़रूरत नहीं है; ज़रूरत है कि अनुरोध के अपने निदान कहीं ऐसी जगह छपें जहाँ आप उन्हें पढ़ सकें।
नाम-समाधान किसी और चीज़ से पहले विफल होता है
जैसे कि api.corp.example जैसा छोटा ऑफ़िस नाम आम तौर पर उस सर्च डोमेन पर निर्भर करता है जो फ़ोन में नहीं होता, इसलिए ऐप ऐसा नाम हल करता है जो केवल इमारत के अंदर मौजूद है। NSURLErrorCannotFindHost इसका हस्ताक्षर है। पूरा होस्टनाम VPN जो भी रिज़ॉल्वर इंस्टॉल करे, उसके ज़रिए हल होना चाहिए, और जब सर्च डोमेन की गारंटी न हो तो ऐप को पूरी तरह योग्य रूप माँगना चाहिए। नाम को पते से बदलना और प्रमाणपत्र जाँच बंद करना विफलता को ठीक करने के बजाय स्थानांतरित करता है।
निजी DNS रिकॉर्ड और ठीक उसी नाम के लिए जारी प्रमाणपत्र समर्थित जोड़ी हैं। बाकी सब एक ऐसा ही उपाय है जो उपयोगकर्ताओं तक पहुँचता है।
समय-सीमा नाम का नहीं, रास्ते का सवाल है
NSURLErrorTimedOut का अर्थ है कि नाम हल हो गया और किसी ने जवाब नहीं दिया, जो रास्ते, पैकेट नीति या सेवा की ओर इशारा करता है। जब टनल प्रति ऐप्लिकेशन आवंटित होती है, तो उसी सर्वर तक पहुँचने वाला दूसरा ऐप आपके बिल्ड के बारे में कुछ नहीं कहता, क्योंकि वह मैपिंग साझा नहीं होती। जाँचें कि आप जो बंडल चला रहे हैं वह उस आवंटन के अंदर है, फिर जाँचें कि उसके लिए सेवा का रास्ता अनुमत है। आवंटन के बाहर इंस्टॉल किया गया डेवलपमेंट बिल्ड पूरी तरह टनल के बाहर बैठ सकता है और टूटे API जैसा दिख सकता है।
ब्राउज़र तुलना दिखाती है कि डिवाइस पर किसी ऐप का रास्ता है। यह कभी साबित नहीं करती कि आपके बिल्ड का है, इसीलिए दोनों परीक्षण अलग-अलग चलाने पड़ते हैं।
विश्वास विफलताएँ प्रमाणपत्र पर के नाम के बारे में हैं
NSURLErrorServerCertificateUntrusted, उसके नीचे की TLS त्रुटि के साथ मिलकर, का अर्थ है कि श्रृंखला या पहचान जाँच विफल हुई। आंतरिक CA डिवाइस पर भरोसेमंद होना चाहिए, और किसी दूसरे होस्टनाम के लिए जारी प्रमाणपत्र किसी भी नेटवर्क पुनर्संरचना के बाद भी गलत ही रहता है। Apple की App Transport Security मार्गदर्शिका इन URL-लोड करने वाले कनेक्शनों पर लागू रहती है, और सादे HTTP सेवा के चारों ओर टनल उस सेवा को सिरे से सिरे तक सुरक्षित नहीं बनाती।
पहचान या विश्वास-एंकर ठीक करें और अपवाद सूची खाली रखें। मनमाने लोड के लिए व्यापक अपवाद विकास के दौरान विफलता छिपाता है और बाद में हर उपयोगकर्ता के लिए उसे जगह पर छोड़ देता है।
HTTP अस्वीकृति ऐप की है, नेटवर्क की नहीं
पूर्ण हुए हैंडशेक पर 401 या 403 का अर्थ है कि अनुरोध पहुँच गया और सेवा ने उसे अस्वीकार कर दिया, इसलिए बचा सवाल खाता, टोकन दर्शक, दायरा या कुंजी है। स्थिति कोड और होस्टनाम लॉग करें, कभी बियरर टोकन या प्रतिक्रिया निकाय नहीं। उस समय टनल अपना काम कर रही है और आगे के नेटवर्क बदलाव केवल असली सुधार को देर करते हैं।
तालिका वह वर्गीकरण है जिसे टर्मिनल के पास रखना चाहिए: हर उस विफलता के लिए एक पंक्ति जिसकी ऐप वास्तव में रिपोर्ट कर सकता है। कोड पढ़ने से पहले छापें, क्योंकि आप जो पंक्ति चुनते हैं वह तय करती है कि आप कौन-सा अनुभाग काम करेंगे।
| Where it fails | What the app sees | First check |
|---|---|---|
| name resolution | NSURLErrorCannotFindHost (-1003) | resolve the fully qualified name from the device itself |
| no path, or no answer | NSURLErrorTimedOut (-1001) | is this bundle inside the per-app mapping, and is the service path allowed |
| TLS trust | NSURLErrorServerCertificateUntrusted (-1202) | does the certificate name match the host, and is the internal CA trusted |
| service refusal | HTTP 401 or 403 after a completed handshake | account, token audience, scope or key |
हर पंक्ति नीचे की पंक्ति से सस्ती जाँची जाती है, और हर एक उसी अनुरोध की अलग परत को बाहर करती है। तालिका में नीचे उतरें जब तक कोई पंक्ति मेल न खाए, फिर नेटवर्क बदलना बंद करें।