टनेल सुरू असतानाही तुमचे iOS VPN अॅप डिस्कनेक्टेड का दाखवते
तुमचे iOS अॅप टनेल नियंत्रित करते पण त्याचे मालक नाही, आणि मॅनेजरची स्थिती कॅशेमध्ये आहे. आधी प्राधान्ये लोड करा, नंतर स्थिती आणि इंटरफेस काउंटर वाचा.
तुमचे अॅप डिस्कनेक्टेड म्हणते, मेनू बार कनेक्टेड म्हणते, आणि रहदारी स्पष्टपणे वाहत आहे. हे अंतर पुन्हा प्रयत्नाने सुधारता येणारी शर्यत स्थिती नाही: अॅप आणि टनेल वेगवेगळ्या प्रक्रिया आहेत, आणि तुमचा कोड जे ऑब्जेक्ट वाचतो ते सिस्टम साठवत असलेल्या कॉन्फिगरेशनचे कॅशे केलेले दृश्य आहे. Apple चे Personal VPN पृष्ठभाग नियंत्रण API आहे, डेटा मार्ग नाही, आणि त्याचे बहुतेक विचित्र वर्तन याच एका वस्तुस्थितीतून येते. प्रत्येक कॉलमध्ये प्रत्यक्षात काय होते ते येथे आहे.
मॅनेजर ऑब्जेक्ट कॅशे केलेले दृश्य आहे, टनेल नाही
NETunnelProviderManager सिस्टमच्या मालकीच्या प्राधान्य साठवणीतून भरले जाते, त्यामुळे loadFromPreferences पूर्ण होईपर्यंत त्याच्या गुणधर्मांना काही अर्थ नाही. त्यापूर्वी connection.status वाचले तर तुम्हाला डीफॉल्ट मूल्य मिळते, आणि म्हणूनच पुन्हा सुरू केल्यानंतरचे पहिले स्थिती अपडेट टनेल सुरू असतानाही डिस्कनेक्टेड असे नोंदवते. आधी लोड करा, नंतर त्याच पूर्णता हँडलरमधून स्थिती आणि प्रोटोकॉल कॉन्फिगरेशन वाचा. पुढील बदल पोलिंगऐवजी NEVPNStatusDidChange द्वारे पाहा, आणि लक्षात ठेवा की सूचना On Demand ने सुरू केलेल्या कनेक्शनसाठीही येते, जिथे काहीही परत करणारा अॅप कॉलच नसतो. प्रोटोकॉल सेटिंग्जनाही हेच लागू होते: त्या लोड केलेल्या कॉन्फिगरेशनमधून वाचल्या जातात, अॅपने पाठवलेल्यातून नाही.
टनेल स्वतः Network Extension पुरवठादार प्रक्रियेत राहते, त्यामुळे अॅप कनेक्शन न गमावता स्वतःची स्थिती गमावू शकते. इंटरफेस जे दाखवते ते सर्व मॅनेजरमधून पुन्हा तयार केले पाहिजे, मागील सत्रातून आठवले नाही.
सुरू करण्याचा क्रम: जतन करा, लोड करा, नंतर सुरू करा
पुरवठादार-आधारित कनेक्शनला क्रमाने तीन पायऱ्या लागतात. पुरवठादाराचे कॉन्फिगरेशन लिहा आणि saveToPreferences कॉल करा, जतन केलेले कॉन्फिगरेशन तुमच्या हातात असलेलेच असेल यासाठी मॅनेजर लोड करा, नंतर NETunnelProviderSession.startVPNTunnel() द्वारे सुरू करा. जतन वगळले तर सुरू करण्याकडे सुरू करायला काहीच नाही; जतनापूर्वी लोड केले तर मॅनेजर अजूनही जुने कॉन्फिगरेशन दर्शवते.
startVPNTunnel परत करणारे बुलियन फक्त म्हणते की विनंती स्वीकारली गेली. पुरवठादार स्तरावरील अपयश नंतर डिस्कनेक्टेड स्थितीत बदल म्हणून येतात, जे तुम्ही NEVPNStatusDidChange सूचनेद्वारे पाहता, आणि सूचना हँडलरने loadFromPreferences नंतर connection.status पुन्हा वाचले पाहिजे कारण कॅशे केलेले मूल्य अजूनही जुने असू शकते. विनंती स्तरावरील अपयश अपवाद फेकणाऱ्या कॉलच्या रूपातून त्वरित परत येतात, किंवा startVPNTunnelAndReturnError: च्या त्रुटी आउट-पॅरामीटरद्वारे. परत आलेल्या मूल्याला निकाल मानणारा कोड कधीही प्रस्थापित न झालेल्या कनेक्शनची नोंद करतो. दुसरे शांत अपयश म्हणजे स्थापित विस्ताराशी जुळत नसलेला पुरवठादार बंडल ओळखकर्ता: विनंती नाकारली जाते, आणि संदेशात काहीही ओळखकर्त्याकडे निर्देश करत नाही. ओळखकर्ता चुकीचा असल्यास विनंती सहसा ताबडतोब अयशस्वी होते, पुरवठादाराची एकही लॉग ओळ येण्यापूर्वी.
सुरू केल्यानंतर प्राधान्ये पुन्हा लोड करणे हेच स्थिती स्क्रीन योग्य करते. सिस्टम कॉन्फिगरेशन बदलते तेव्हा मॅनेजर तुमच्याकडे नवीन कॉन्फिगरेशन ढकलत नाही.
विश्वास सामग्री प्रोफाइलद्वारे येते, अॅप कोडमधून कधीही नाही
iOS विश्वास साठवणीत मूळ प्रमाणपत्र जोडण्याचा कोणताही समर्थित मार्ग अॅपकडे नाही, त्यामुळे Personal VPN कॉन्फिगरेशन फक्त तेच सामग्री संदर्भित करू शकते जिच्यावर उपकरण आधीच विश्वास ठेवते: स्थापित प्रोफाइल, उपकरण व्यवस्थापन किंवा सिस्टम इतर कारणांमुळे विश्वास ठेवणाऱ्या CA ने उभारलेली साखळी. पहिल्या सुरुवातीला स्वतःचे CA तयार करून सिस्टम ते मान्य करेल अशी अपेक्षा ठेवणारे अॅप पुरवठादाराच्या आतल्या पडताळणीत अयशस्वी होईल, जिथे अॅपचा इंटरफेस कारण पाहू शकत नाही.
ही सीमा जशी आहे तशी रचना मर्यादा माना आणि नोंदणी प्रोफाइलसोबत विश्वास अँकर पाठवा. VPN प्रमाणीकरण विश्वास निर्णयापासून वेगळे ठेवा, कारण ते वेगवेगळ्या ठिकाणी अयशस्वी होतात आणि वेगवेगळे लोक त्यांचे डीबग करतात.
काउंटर इंटरफेसवरून येतात, VPN API वरून नाही
मॅनेजर स्थिती आणि कॉन्फिगरेशन उघड करते, आणि प्रत्येक टनेलचे बाइट मोजणारे काहीही नाही. तुम्हाला वापराचे आकडे हवे असल्यास getifaddrs() कॉल करा आणि संबंधित इंटरफेससाठी if_data वाचा: Wi-Fi साठी en0, सेल्युलरसाठी pdp_ip इंटरफेस, आणि टनेलसाठीच utun उपकरण. utun काउंटर आंतरिक रहदारी वर्णन करतात आणि प्रोटोकॉल ओव्हरहेड समाविष्ट करतात.
हे आकडे अंदाज आहेत, प्रति अॅप हिशोब नाही, आणि इंटरफेस पुन्हा तयार झाल्यावर ते रीसेट होतात. इंटरफेसमध्ये त्यांना तसे लेबल करा, नाहीतर कोणीतरी ते ग्राहकाला बिल करण्यासाठी वापरेल. तुम्हाला प्रति अॅप आकडे हवे असल्यास पूर्णपणे वेगळी यंत्रणा हवी, या फील्ड्सचे चांगले वाचन नाही.
स्वच्छता stopVPNTunnel मध्ये आहे, समाप्तीमध्ये नाही
applicationWillTerminate सिस्टम प्रक्रिया मारू शकण्यापूर्वी तुम्हाला काही सेकंद देतो, जे कनेक्शन तोडण्यासाठी विश्वासार्ह जागा नाही. थांबवणे stopVPNTunnel() ला पाठवा किंवा पुरवठादाराच्या थांबवण्याच्या कॉलबॅकमध्ये हाताळा, आणि तुम्ही सुरू केलेला मॅनेजर किंवा कॉन्फिगरेशन ओळखकर्ता ठेवा जेणेकरून थांबवणे उपकरणावरील प्रत्येक कॉन्फिगरेशनऐवजी त्या कनेक्शनला लक्ष्य करेल.
तो ओळखकर्ता ज्या प्रोफाइलचा तो आहे त्याच्या शेजारी साठवा, कारण मॅनेजर ऑब्जेक्ट वापरकर्त्याने कोणते कॉन्फिगरेशन निवडले हे नोंदवत नाही. आणि लक्षात ठेवा की On Demand ने उचललेल्या कनेक्शनमागे अॅप कॉलच नसतो, त्यामुळे स्थिती स्क्रीनला काहीही काढण्यापूर्वी अजूनही प्राधान्ये लोड करावी लागतात.