आपको एक स्क्रीन चाहिए जो टनल चालू होने पर अलग व्यवहार करे, और ऐसी कोई कॉल नहीं है जो आपको यह बताए। यही शिपिंग सीमा है: macOS पर कोई सार्वजनिक फ़्रेमवर्क यह नहीं बताता कि कोई मनमाना VPN जुड़ा है या नहीं, और iOS पर स्थिति उस ऐप की है जिसने कॉन्फ़िगरेशन इंस्टॉल किया। नीचे दी गई जाँचें इस सीमा से उस चीज़ तक ले जाती हैं जिसे आप शिप कर सकते हैं, और इनमें से कोई भी खोज को जल्दी खत्म कर सकती है।

जाँच 1: क्या इस सवाल का जवाब देना संभव है?

सैंडबॉक्स किसी भी API से पहले सवाल का फैसला कर देता है। तीसरे पक्ष की प्रक्रिया किसी दूसरे विक्रेता के एक्सटेंशन को सूचीबद्ध नहीं कर सकती, और वह उस एक्सटेंशन का कॉन्फ़िगरेशन भी नहीं पढ़ सकती, इसलिए पूछने के लिए कोई समर्थित ऑब्जेक्ट नहीं है।

हर बायपास एक ही दीवार से टकराता है। इंटरफ़ेस सूचियाँ, scutil --nc list और सीधे सिस्टम-कॉन्फ़िगरेशन पढ़ना या तो ऐसे अधिकार माँगते हैं जो सैंडबॉक्स रोक लेता है या ऐसे व्यवहार पर निर्भर करते हैं जिसका Apple ने कभी वादा नहीं किया। अगर योजना को इनमें से कुछ चाहिए, तो समस्या योजना में ही है। अनडॉक्युमेंटेड ब्योरे पर बनाया गया फ़ीचर डिलीवरी तारीख वाला सपोर्ट टिकट है।

जाँच 2: क्या आपका ऐप टनल खुद प्रबंधित करता है?

अगर करता है, तो आपके अपने कॉन्फ़िगरेशन के लिए आपके पास समर्थित जवाब है। प्राथमिकताएँ लोड करें, त्रुटि संभालें, फिर स्थिति पढ़ें और पोलिंग के बजाय बदलावों की सदस्यता लें:

vpnManager.loadFromPreferences { error in
    // handle a load failure before reading status
}

NotificationCenter.default.addObserver(
    forName: .NEVPNStatusDidChange,
    object: nil,
    queue: nil
) { note in
    let status = (note.object as? NEVPNConnection)?.status
}

इस बारे में सटीक रहें कि यह क्या लौटाता है: उस टनल की स्थिति जो आपने इंस्टॉल की। दूसरा क्लाइंट चलाने वाला उपयोगकर्ता डिस्कनेक्टेड दिखेगा, और यह आपके कोड में बग नहीं है। जवाब पर निर्माण करने से पहले तय करें कि आपका फ़ीचर इन दो सवालों में से कौन-सा वास्तव में पूछ रहा है।

जाँच 3: ह्यूरिस्टिक वास्तव में आपको क्या बताएगा?

व्यापक रूप से कॉपी किया गया तरीका सिस्टम प्रॉक्सी डिक्शनरी से उसकी स्कोप्ड प्रविष्टियाँ माँगता है और कुंजियाँ पढ़ता है, जो संयोग से इंटरफ़ेस नाम हैं:

let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []

जो कुंजी tap, tun, ppp, ipsec या utun से शुरू होती है, वह संकेत देती है कि टनल-स्कोप्ड इंटरफ़ेस मौजूद है। पूरा नाम मिलाना तुरंत विफल होता है, क्योंकि iOS 12 utun1 और utun2 के साथ आया और कुछ प्रोफ़ाइल ipsec4, ppp0 या utun0 के रूप में दिखते हैं। इसके बजाय प्रीफ़िक्स की तुलना करें।

फिर भी, नाम किसी मालिक की पहचान नहीं करता। सिस्टम फ़ीचर और दूसरे विक्रेताओं के एक्सटेंशन भी utun इंटरफ़ेस बनाते हैं, और एक ऐसा भी हो सकता है जो आपके ट्रैफ़िक का कुछ भी न ले जाए। इसे इस संकेत के रूप में पढ़ें कि पास में टनल जैसी कोई चीज़ है, इससे ज़्यादा नहीं। यहाँ गलत पॉज़िटिव सस्ता है अगर आप केवल एक फ़ीचर को गेट करते हैं, और महंगा है अगर लॉगिन स्क्रीन को गेट करते हैं।

जाँच 4: क्या आप इसके बजाय गंतव्य का परीक्षण कर सकते हैं?

अगर ऐप को केवल यह जानना है कि कोई आंतरिक सेवा पहुँच में है या नहीं, तो उस सेवा का परीक्षण करें। टाइमआउट के साथ एक छोटी प्रोब उस सवाल का जवाब देती है जिस पर फ़ीचर वास्तव में निर्भर है, और यह तब भी काम करती है जब उपयोगकर्ता क्लाइंट बदलता है या टनल आकार बदलता है।

पहुँच एक अवलोकन है आपके पथ के बारे में। इंटरफ़ेस नाम आपके पथ से सटी किसी चीज़ के बारे में एक अनुमान है, इसीलिए ह्यूरिस्टिक बग रिपोर्ट में बहस पैदा करता है और प्रोब सबूत। अगर प्रोब विफल हो जबकि उपयोगकर्ता ज़ोर दे कि VPN चालू है, तो अब आपके पास डिबग करने का एक ठोस पथ है: नाम-समाधान, रूट या सेवा अनुमति।

जाँच 5: क्या प्लेटफ़ॉर्म वह लागू कर सकता है जिसकी आपको ज़रूरत है?

जब आवश्यकता यह गारंटी हो कि टनल से कुछ भी बाहर न निकले, तो प्रोफ़ाइल उसका स्थान है, डिटेक्टर नहीं। includeAllNetworks को iOS 14 या बाद के संस्करण में फ़ुल-टनल कॉन्फ़िगरेशन में चालू करना आपके ऐप से अनुमान लगवाने के बजाय प्लेटफ़ॉर्म का व्यवहार बदल देता है। यह फ़्लैग NEVPNProtocol संदर्भ में प्रलेखित है।

यह अलग तरह का जवाब है: अवलोकन के बजाय प्रवर्तन। यह भी केवल उन्हीं प्रोफ़ाइल पर लागू होता है जिन्हें आप नियंत्रित करते हैं, इसलिए यह किसी और की टनल देख रहे उपभोक्ता ऐप की मदद नहीं करता।

जाँच 6: विफलता को सुरक्षित और अवलोकनीय बनाएँ

केवल उसी क्षमता को बंद करें जिसे टनल चाहिए और ऐप का बाकी हिस्सा उपयोगी रहने दें। जो डिटेक्टर अनिश्चित होने पर पूरा इंटरफ़ेस छिपा देता है, वह हर उस व्यक्ति के लिए आउटेज बनाता है जिसकी टनल ऐसा नाम इस्तेमाल करती है जिसकी आपने कभी कल्पना नहीं की। इसके बजाय रूढ़िवादी व्यवहार पर लौटें: स्थानीय फ़ीचर काम करते रहते हैं और केवल वही दूरस्थ कॉल अक्षम होती है जिसे सचमुच टनल चाहिए। यह चुनाव एक उत्पाद निर्णय है, और यह ह्यूरिस्टिक के बगल में लिखे जाने योग्य है।

जो आपने देखा उसे लॉग करें: इंटरफ़ेस नाम, प्लेटफ़ॉर्म संस्करण और एक प्रोब का परिणाम। यह अगली रिपोर्ट को बहस से जाँच में बदल देता है। फिर जहाँ समर्थित घोषणा हो वहाँ उसे प्राथमिकता दें, क्योंकि प्रबंधित कॉन्फ़िगरेशन इरादे को स्पष्ट रूप से ले जा सकता है और नामों की जाँच करने का अधिकांश कारण हटा सकता है।

अगर जाँच 1 से 5 ने आपको समर्थित जवाब के बिना छोड़ दिया, तो प्रोब शिप करें और परिणाम को ईमानदारी से लेबल करें। प्रलेखित सर्वोत्तम-प्रयास संकेत अगली रिलीज़ में टूटने वाले निजी API से बेहतर उत्पाद निर्णय है।

संबंधित लेख